您的位置:首页 > 理论基础 > 计算机网络

http://acm.hdu.edu.cn/showproblem.php?pid=1541  结点更新求最左区间的个数

2010-08-20 17:42 288 查看
/*
*   少写一个询问的函数,以为一个更新的函数就够了,结果。。。。
*   就是结点更新求最左区间的个数
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#define LL(x) ((x) << 1)
#define RR(x) ((x) << 1 | 1)
using namespace std;
const int N = 32005;
struct Seg_tree{
int l, r;
int sum;
int mid(){
return (l + r) >> 1;
}
}tree[3 * N];
int pos
;
inline void Build(int l, int r, int node){
tree[node].l = l;
tree[node].r = r;
tree[node].sum = 0;
if(l == r)
return ;
int mid = (l + r) >> 1;
Build(l, mid, LL(node));
Build(mid + 1, r, RR(node));
}
inline void Update(int node, int dx){
if(tree[node].l == tree[node].r && tree[node].l ==  dx){
//pos[tree[node].sum]++;
tree[node].sum += 1;
//printf("dx :: %d tree[node].sum :: %d/n", dx, tree[node].sum);
return ;
}
/*
if(tree[node].sum){
tree[LL(node)].sum = tree[RR(node)].sum = tree[node].sum;
}
*/
int mid = tree[node].mid();
if(dx <= mid)
Update(LL(node), dx);
else
Update(RR(node), dx);
tree[node].sum += 1;
}
inline int Query(int l, int r, int node){
if(l <= tree[node].l && tree[node].r <= r){
return tree[node].sum;
}
int mid = tree[node].mid();
if(r <= mid){
return Query(l , r, LL(node));
} else if(l > mid){
return Query(l, r, RR(node));
} else{
return Query(l, mid, LL(node))+ Query(mid + 1, r, RR(node));
}
}
int main(){
int n;
while(scanf("%d", &n) != EOF){
int x, y;
Build(0, 32000, 1);
//memset(pos, 0, sizeof(pos));
for(int i = 0 ;i < n; i++)
pos[i] = 0;
int temp = n;
while(temp--){
scanf("%d %d", &x, &y);
pos[Query(0, x, 1)]++;
Update(1, x);
}
//puts("===");
for(int i = 0; i < n; i++)
printf("%d/n", pos[i]);
}
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tree query build struct