poj 2352(入门线段树)

来源:互联网 发布:iphone ssh 默认端口 编辑:程序博客网 时间:2024/05/16 14:04
// 就是求在X轴左边的星星个数吧,以前用树状数组写过
#include<stdio.h>#include<string.h>#define  M 32000struct tree{int left,right,num;}a[3*M];int sum[15010];void bulid_tree(int l,int r,int pos){  int mid;a[pos].left=l;a[pos].right=r;a[pos].num=0;if(l==r)return ;mid=(l+r)/2;bulid_tree(l,mid,2*pos);bulid_tree(mid+1,r,2*pos+1);}int query(int l,int r,int pos){    int sum=0,mid;    if(a[pos].left==l && a[pos].right==r)return a[pos].num;else{mid=(a[pos].left+a[pos].right)/2;if(l>mid)sum+=query(l,r,2*pos+1);else if(r<=mid)sum+=query(l,r,2*pos);else{    sum+=query(l,mid,2*pos)+query(mid+1,r,2*pos+1);}return sum;}}void add(int x,int pos){int mid;a[pos].num++;    if(a[pos].left==x && a[pos].right==x){return ;}mid=(a[pos].left+a[pos].right)/2;if(x<=mid)add(x,2*pos);elseadd(x,2*pos+1);}int main(){int n,i,x,y;while(scanf("%d",&n)!=EOF){bulid_tree(0,M,1);memset(sum,0,sizeof(sum));for(i=1;i<=n;i++){scanf("%d%d",&x,&y);sum[query(0,x,1)]++;            add(x,1);}for(i=0;i<n;i++)printf("%d\n",sum[i]);}return 0;}

原创粉丝点击