hdu1556

来源:互联网 发布:怎么共享网络连wifi 编辑:程序博客网 时间:2024/06/06 12:34
//区间修改线段树,效率貌似很低#include<iostream>#include<cstring>#include<cstdio>using namespace std;int n,x,y;struct point{      int l,r,sum,add;}p[300010];void build(int o,int l,int r){     p[o].l=l;     p[o].r=r;     p[o].sum=0;     p[o].add=0;     if(l!=r)     {            int mid=(l+r)/2;            build(o*2,l,mid);            build(o*2+1,mid+1,r);     }}void update(int o,int l,int r,int add){     if(p[o].l==l&&p[o].r==r)     {         p[o].sum=p[o].sum+r-l+1;         p[o].add+=add;         return;     }    int mid=(p[o].l+p[o].r)/2;     if(l>mid)update(o*2+1,l,r,add);     else if(r<=mid)update(o*2,l,r,add);     else     {        update(o*2,l,mid,add);         update(o*2+1,mid+1,r,add);     }     p[o].sum=p[o*2].sum+p[o*2+1].sum;}int query(int o,int i,int j){    if(p[o].l==i&&p[o].r==j)return p[o].sum;    if(p[o].add>0)    {        p[o*2].sum+=(p[o*2].r-p[o*2].l+1)*p[o].add;        p[o*2+1].sum+=(p[o*2+1].r-p[o*2+1].l+1)*p[o].add;        p[o*2+1].add+=p[o].add;        p[o*2].add+=p[o].add;        p[o].add=-1;    }    int mid=(p[o].l+p[o].r)/2;    if(mid>=j)return query(o*2,i,j);    if(mid<i)return query(o*2+1,i,j);    return query(o*2,i,mid)+query(o*2+1,mid+1,j);}int main(){    while(cin>>n,n)    {              build(1,1,n);              for(int i=1;i<=n;i++)              {                  scanf("%d%d",&x,&y);                  update(1,x,y,1);              }              printf("%d",query(1,1,1));              for(int i=2;i<=n;i++)              {                  printf(" %d",query(1,i,i));              }              printf("\n");    }    return 0;}


0 0
原创粉丝点击