BZOJ3196: Tyvj 1730 二逼平衡树

 

题目就不抄了,终于用c++A了这道题

有几点需要注意的

1.k<<1|1而不是k<<1||1

2.程序如果中途退出,printf积累的结果将不会输出,必须碰到cout<<endl

  也就是说,如果需要调试输出信息,尽量用cout

代码:

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cmath>
  4 #include<cstring>
  5 #include<algorithm>
  6 #include<iostream>
  7 #include<vector>
  8 #include<map>
  9 #include<set>
 10 #include<queue>
 11 #define inf 1000000000
 12 #define maxn 50000+100
 13 #define maxm 2000000
 14 #define eps 1e-10
 15 #define ll long long
 16 using namespace std;
 17 inline int read()
 18 {
 19     int x=0,f=1;char ch=getchar();
 20     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
 21     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
 22     return x*f;
 23 }
 24 int n,m,tot,a[maxn],l[maxm],r[maxm],s[maxm],rnd[maxm],w[maxm],v[maxm];
 25 struct rec{int l,r,rt;}t[4*maxn];
 26 inline void pushup(int k)
 27 {s[k]=s[l[k]]+s[r[k]]+w[k];}
 28 inline void rturn(int &k)
 29 {int t=l[k];l[k]=r[t];r[t]=k;s[t]=s[k];pushup(k);k=t;}
 30 inline void lturn(int &k)
 31 {int t=r[k];r[k]=l[t];l[t]=k;s[t]=s[k];pushup(k);k=t;}
 32 void ins(int &k,int num)
 33 {
 34     if(!k)
 35     {k=++tot;v[k]=num;s[k]=w[k]=1;l[k]=r[k]=0;rnd[k]=rand();return;}
 36     s[k]++;
 37     if(v[k]==num)w[k]++;
 38     else if(num<v[k])
 39       {ins(l[k],num);if(rnd[l[k]]<rnd[k])rturn(k);}
 40     else
 41       {ins(r[k],num);if(rnd[r[k]]<rnd[k])lturn(k);}  
 42 }
 43 void del(int &k,int num)
 44 {
 45     if(v[k]==num)
 46     {
 47         if(w[k]>1){w[k]--;s[k]--;}
 48         else if(l[k]*r[k]==0)k=l[k]+r[k];
 49         else if(rnd[l[k]]<rnd[r[k]])
 50          {rturn(k);del(k,num);}
 51         else {lturn(k);del(k,num);} 
 52         return;
 53     }
 54     s[k]--;
 55     if(num<v[k])del(l[k],num);else del(r[k],num);
 56 }
 57 int rank(int k,int num)
 58 {
 59     if(!k) return 0;
 60     if(v[k]==num)return s[l[k]];
 61     else if(num<v[k])return rank(l[k],num);
 62     else return s[l[k]]+w[k]+rank(r[k],num);
 63 }
 64 int pre(int k,int num)
 65 {
 66     if(!k)return -inf;
 67     if(num<=v[k])return pre(l[k],num);
 68     else 
 69     {
 70         int t=pre(r[k],num);
 71         return t==-inf?v[k]:t;
 72     }
 73 }
 74 int suc(int k,int num)
 75 {
 76     if(!k)return inf;
 77     if(num>=v[k])return suc(r[k],num);
 78     else
 79     {
 80         int t=suc(l[k],num);
 81         return t==inf?v[k]:t;
 82     }
 83 }
 84 void build(int k,int x,int y)
 85 {
 86     int l=t[k].l=x,r=t[k].r=y, mid=(l+r)>>1;
 87     for(int i=l;i<=r;i++)ins(t[k].rt,a[i]);
 88     if(l==r)return;
 89     build(k<<1,l,mid);build(k<<1|1,mid+1,r);
 90 }
 91 void change(int k,int x,int y)
 92 {
 93     int l=t[k].l,r=t[k].r,mid=(l+r)>>1;
 94     del(t[k].rt,a[x]);ins(t[k].rt,y);
 95     if(l==r)return;
 96     if(x<=mid)change(k<<1,x,y);else change(k<<1|1,x,y);
 97 }
 98 int query(int k,int x,int y,int z)
 99 {
100     int l=t[k].l,r=t[k].r,mid=(l+r)>>1;
101     if(l==x&&r==y)return rank(t[k].rt,z);
102     if(y<=mid)return query(k<<1,x,y,z);
103     else if(x>mid)return query(k<<1|1,x,y,z);
104     else return(query(k<<1,x,mid,z)+query(k<<1|1,mid+1,y,z));
105 }
106 int getpre(int k,int x,int y,int z)
107 {
108     int l=t[k].l,r=t[k].r,mid=(l+r)>>1;
109     if(l==x&&r==y)return(pre(t[k].rt,z));
110     if(y<=mid)return getpre(k<<1,x,y,z);
111     else if(x>mid)return getpre(k<<1|1,x,y,z);
112     else return max(getpre(k<<1,x,mid,z),getpre(k<<1|1,mid+1,y,z));
113 }
114 int getsuc(int k,int x,int y,int z)
115 {
116     int l=t[k].l,r=t[k].r,mid=(l+r)>>1;
117     if(l==x&&r==y)return(suc(t[k].rt,z));
118     if(y<=mid)return getsuc(k<<1,x,y,z);
119     else if(x>mid)return getsuc(k<<1|1,x,y,z);
120     else return min(getsuc(k<<1,x,mid,z),getsuc(k<<1|1,mid+1,y,z));
121 }
122 
123 int main()
124 {
125     freopen("input.txt","r",stdin);
126     freopen("output.txt","w",stdout);
127     n=read();m=read();
128     for(int i=1;i<=n;i++)a[i]=read();
129     build(1,1,n);
130     //for(int k=1;k<=4*n;k++)cout<<t[k].l<<' '<<t[k].r<<' '<<t[k].rt<<endl;
131     //for(int k=1;k<=4*n;k++)cout<<l[k]<<' '<<r[k]<<' '<<s[k]<<' '<<w[k]<<' '<<v[k]<<' '<<rnd[k]<<endl;
132     int x,y,z,ch;
133     while(m--)
134     {
135         ch=read();
136         if(ch==3){x=read();y=read();change(1,x,y);a[x]=y;}  
137         else{
138             x=read();y=read();z=read();
139             if(ch==2)
140                 {
141                 int l=0,r=inf;
142                 while(l<=r)
143                    {
144                     int mid=(l+r)>>1;
145                     if(query(1,x,y,mid)+1>z)r=mid-1;else l=mid+1;
146                     //cout<<query(1,x,y,mid)<<"!!!!!!"<<endl;
147                 }
148                  printf("%d\n",r);
149                 }
150             if(ch==1)printf("%d\n",query(1,x,y,z)+1);
151             if(ch==4)printf("%d\n",getpre(1,x,y,z));
152             if(ch==5)printf("%d\n",getsuc(1,x,y,z));
153             }    
154       
155     }
156     return 0;
157 }
View Code

 

posted @ 2014-08-21 17:11  ZYF-ZYF  Views(284)  Comments(0Edit  收藏  举报