POJ 2352 Stars (区间建树,单点更新)

来源:互联网 发布:淘宝上哪家店牛仔裤好 编辑:程序博客网 时间:2024/06/16 02:36

思路:刚开始自己没有想到建图的方式,参考了他人的方法明白过来,将x轴当做区间,一边查找一边更新。更新的话就是将当前的数加入到合适位置的和中去,即可。


#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<queue>#include<math.h>#define LL long long#define inf 0x3f3f3f3f#define ls l,mid,rt<<1#define rs mid+1,r,rt<<1|1#define M 1000100using namespace std;int sum[M*4],ha[M*4];struct node{    int x,y;}q[M*4];void up(int rt){    sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void pushup(int x,int l,int r,int rt){    if(l==r)    {        sum[rt]++;return ;    }    int mid=(l+r)>>1;    if(x<=mid)        pushup(x,ls);    else        pushup(x,rs);    up(rt);}int Q(int a,int b,int l,int r,int rt){    if(l>=a&&r<=b)    {        return sum[rt];    }    int mid=(l+r)>>1;    int s=0;    if(a<=mid)        s+=Q(a,b,ls);    if(b>mid)        s+=Q(a,b,rs);    return s;}int  main(){    int i,n,j,k,ma;    while(~scanf("%d",&n))    {        ma=0;        memset(sum,0,sizeof(sum));        for(i=0;i<n;i++)        {            scanf("%d%d",&q[i].x,&q[i].y);            ma=max(ma,q[i].x);        }        for(i=0;i<n;i++)        {            int p=Q(0,q[i].x,0,ma,1);            ha[p]++;            pushup(q[i].x,0,ma,1);        }        for(i=0;i<n;i++)            printf("%d\n",ha[i]);    }    return 0;}


0 0