hdu1540 线段树点修改(较难)

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stack>
  4 #include<algorithm>
  5 using namespace std;
  6 int ql,qr,x,n,ll[150005],rl[150005],a[150005];
  7 stack<int>s;
  8 void build(int o,int l,int r)
  9 {
 10     int mid=l+(r-l)/2;
 11     ll[o]=rl[o]=r-l+1;
 12     if (l!=r)
 13     {
 14         build(o*2,l,mid);
 15         build(o*2+1,mid+1,r);
 16     }
 17 }
 18 int lquery(int o,int l,int r)
 19 {
 20     int mid=l+(r-l)/2;
 21     if (ql==l) return ll[o];
 22     else if (qr<=mid) return lquery(o*2,l,mid);
 23     else if (ql>mid) return lquery(o*2+1,mid+1,r);
 24     else{
 25         int temp=lquery(o*2,l,mid);
 26         if (temp==mid-ql+1) temp+=ll[o*2+1];
 27         return temp;
 28     }
 29 }
 30 int rquery(int o,int l,int r)
 31 {
 32     int mid=l+(r-l)/2;
 33     if (qr==r) return rl[o];
 34     else if (qr<=mid) return rquery(o*2,l,mid);
 35     else if (ql>mid) return rquery(o*2+1,mid+1,r);
 36     else{
 37         int temp=rquery(o*2+1,mid+1,r);
 38         if (temp==qr-mid) temp+=rl[o*2];
 39         return temp;
 40     }
 41 }
 42 void rupdate(int o,int l,int r)
 43 {
 44     int mid=l+(r-l)/2;
 45     if (l==r) rl[o]=ll[o]=1;
 46     else{
 47         if (x<=mid) rupdate(o*2,l,mid);
 48         else rupdate(o*2+1,mid+1,r);
 49         if (ll[o]==x-l)
 50         {
 51             ql=x+1; qr=r; ll[o]+=1;
 52             if (ql<=qr) ll[o]+=lquery(1,1,n);
 53         }
 54         if (rl[o]==r-x)
 55         {
 56             ql=l; qr=x-1; rl[o]+=1;
 57             if (ql<=qr) rl[o]+=rquery(1,1,n);
 58         }
 59     }
 60 }
 61 void dupdate(int o,int l,int r)
 62 {
 63     int mid=l+(r-l)/2;
 64     if (l==r) rl[o]=ll[o]=0;
 65     else{
 66         if (x<=mid) dupdate(o*2,l,mid);
 67         else dupdate(o*2+1,mid+1,r);
 68         if (ll[o]>x-l) ll[o]=x-l;
 69         if (rl[o]>r-x) rl[o]=r-x;
 70     }
 71 }
 72 int main()
 73 {
 74     int m,i,flong,temp;
 75     char c;
 76     while (~scanf("%d%d",&n,&m))
 77     {
 78         while (!s.empty()) s.pop();
 79         build(1,1,n);
 80         for (i=1;i<=n;i++) a[i]=1;
 81         for (i=1;i<=m;i++)
 82         {
 83             getchar(); scanf("%c",&c);
 84             if (c=='Q')
 85             {
 86                 scanf("%d",&x);
 87                 if (a[x]==0) printf("0\n");
 88                 else{
 89                     flong=0; ql=1; qr=x-1;
 90                     if (qr>=ql) flong=rquery(1,1,n);
 91                     temp=1+flong;
 92                     flong=0; ql=x+1; qr=n;
 93                     if (qr>=ql) flong=lquery(1,1,n);
 94                     printf("%d\n",temp+flong);
 95                 }
 96             }
 97             else if (c=='R')
 98             {
 99                 x=s.top(); s.pop();
100                 a[x]=1; rupdate(1,1,n);
101             }
102             else if (c=='D')
103             {
104                 scanf("%d",&x);
105                 a[x]=0; s.push(x); dupdate(1,1,n);
106             }
107         }
108     }
109 }

http://acm.hdu.edu.cn/showproblem.php?pid=1540

posted on 2014-07-24 01:32  xiao_xin  阅读(134)  评论(0编辑  收藏  举报

导航