hdu 5372 离散化加树状数组

来源:互联网 发布:wifi网络延时高 编辑:程序博客网 时间:2024/05/19 15:21

注意离散化的时候是对左右端点一起离散化的,所以maxn要开成2倍的~

#include<bits/stdc++.h>using namespace std;#define ll long longconst int maxn=2e5+10;struct node{    int op,l,r;}a[maxn];int c1[maxn<<1],c2[maxn<<1];int lowbit(int x){    return x&(-x);}void update(int n,int num,int *c){    while(n<maxn*2){        c[n]+=num;n+=lowbit(n);    }}int query(int n,int *c){    int ans=0;    while(n>0){        ans+=c[n];n-=lowbit(n);    }    return ans;}int n,op,l,r;int cas;int b[maxn<<1];int opt[maxn<<1];vector<int>vec;int main(){    cas=1;    while(scanf("%d",&n)!=EOF){        int num=1;vec.clear();int cnt=0;        memset(c1,0,sizeof(c1));        memset(c2,0,sizeof(c2));        for(int i=1;i<=n;i++){            scanf("%d%d",&op,&l);            if(op==0){                r=l+num;opt[num]=i;num++;                b[cnt++]=l;b[cnt++]=r;            }            a[i].op=op;a[i].l=l;a[i].r=r;        }        sort(b,b+cnt);        cnt=unique(b,b+cnt)-b;    //  cout<<"sz = "<<cnt<<endl;    //  for(int i=0;i<cnt;i++){    //      cout<<"i = "<<i<<" b [i] = "<<b[i]<<endl;    //  }    //  int now=lower_bound(b,b+cnt,5)-b+1;    //  cout<<" now = "<<now<<endl;*/        int num1;int num2;        printf("Case #%d:\n",cas++);        for(int i=1;i<=n;i++){            if(a[i].op==0){                l=lower_bound(b,b+cnt,a[i].l)-b+1;                r=lower_bound(b,b+cnt,a[i].r)-b+1;                num1=query(l-1,c1);                num2=query(r,c2);                //cout<<" l= "<<l<<" r= "<<r<<endl;                //cout<<" num1=  "<<num1<<" num2= "<<num2<<endl;                  printf("%d\n",num2-num1);                update(l,1,c1);            /*  cout<<" update check "<<endl;                for(int i=1;i<=cnt;i++){                    cout<<" i = "<<i<<" cnt= "<<c1[i]<<endl;                  }*/                update(r,1,c2);            }            else{                l=opt[a[i].l];int j=l;            //  cout<<" (((( l= "<<l<<endl;            //  cout<<" ======  "<<a[l].l<<" a[r].r = "<<a[l].r<<endl;            //  system("pause");                l=lower_bound(b,b+cnt,a[j].l)-b+1;                r=lower_bound(b,b+cnt,a[j].r)-b+1;                //system("pause");                update(l,-1,c1);                update(r,-1,c2);            }        }    }}
0 0
原创粉丝点击