数据结构模板

  1 #include<algorithm>
  2 #include<iostream>
  3 #include<cstdlib>
  4 #include<cstring>
  5 #include<cstdio>
  6 #include<string>
  7 #include<cmath>
  8 #include<ctime>
  9 #include<queue>
 10 #include<stack>
 11 #include<map>
 12 #include<set>
 13 #define rre(i,r,l) for(int i=(r);i>=(l);i--)
 14 #define re(i,l,r) for(int i=(l);i<=(r);i++)
 15 #define Clear(a,b) memset(a,b,sizeof(a))
 16 #define inout(x) printf("%d",(x))
 17 #define douin(x) scanf("%lf",&x)
 18 #define strin(x) scanf("%s",(x))
 19 #define LLin(x) scanf("%lld",&x)
 20 #define op operator
 21 #define CSC main
 22 typedef unsigned long long ULL;
 23 typedef const int cint;
 24 typedef long long LL;
 25 using namespace std;
 26 void inin(int &ret)
 27 {
 28     ret=0;int f=0;char ch=getchar();
 29     while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
 30     while(ch>='0'&&ch<='9')ret*=10,ret+=ch-'0',ch=getchar();
 31     ret=f?-ret:ret;
 32 }
 33 namespace iceset
 34 {
 35     int fa[100010],n;
 36     void init(){re(i,1,n)fa[i]=i;}
 37     int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
 38     void merge(int l,int r){fa[find(l)]=fa[find(r)];}
 39 }
 40 namespace heap
 41 {
 42     int w[100010],ch[100010][2];
 43     int root,ed;
 44     int merge(int l,int r)
 45     {
 46         if(!l||!r)return l+r;
 47         if(w[l]>w[r])swap(l,r);
 48         ch[l][1]=merge(ch[l][1],r);
 49         swap(ch[l][0],ch[l][1]);
 50         return l;
 51     }
 52     void pop(){root=merge(ch[root][0],ch[root][1]);}
 53     void push(int x){w[++ed]=x,ch[ed][0]=ch[ed][1]=0;root=merge(root,ed);}
 54     int top(){return w[root];}
 55     bool empty(){return !root;}
 56     int size(){return ed;}
 57 }
 58 namespace bit
 59 {
 60     int c[100010],limit;
 61     int lowbit(int x){return x&-x;}
 62     void add(int pos,int x)
 63     {
 64         while(pos<=limit)c[pos]+=x,pos+=lowbit(pos);
 65     }
 66     int query(int pos)
 67     {
 68         int ret=0;
 69         while(pos)ret+=c[pos],pos-=lowbit(pos);
 70         return ret;
 71     }
 72 }
 73 namespace bit2//bzoj1452
 74 {
 75     int n,m;
 76     int lowbit(int x){return x&-x;} 
 77     struct BIT
 78     {
 79         int c[333][333];
 80         void add(int a,int b,int x)
 81         {
 82             int i=a;
 83             while(i<=n)
 84             {
 85                 int j=b;
 86                 while(j<=m)c[i][j]+=x,j+=lowbit(j);
 87                 i+=lowbit(i);
 88             }
 89         }
 90         int query(int a,int b)
 91         {
 92             int ret=0,i=a;
 93             while(i)
 94             {
 95                 int j=b;
 96                 while(j)ret+=c[i][j],j-=lowbit(j);
 97                 i-=lowbit(i);
 98             }
 99             return ret;
100         }
101     }col[111];
102     int a[333][333];
103     void solve()
104     {
105         inin(n),inin(m);
106         re(i,1,n)re(j,1,m)
107             inin(a[i][j]),col[a[i][j]].add(i,j,1);
108         int q,x;;inin(q);
109         while(q--)
110         {
111             int opt,x1,x2,y1,y2;
112             inin(opt);
113             if(opt==1)
114             {
115                 inin(x1),inin(y1),inin(x);
116                 col[a[x1][y1]].add(x1,y1,-1);a[x1][y1]=x;
117                 col[a[x1][y1]].add(x1,y1,1);
118             }
119             else 
120             {
121                 inin(x1),inin(x2),inin(y1),inin(y2),inin(x);
122                 printf("%d
",col[x].query(x2,y2)+col[x].query(x1-1,y1-1)-col[x].query(x1-1,y2)-col[x].query(x2,y1-1));
123             }
124         }
125     }
126 }
127 namespace treap//bzoj3224
128 {
129     int ch[100010][2],w[100010],c[100010],s[100010],r[100010],ed,root;
130     void maintain(int x){if(x)s[x]=c[x]+s[ch[x][0]]+s[ch[x][1]];}
131     void rotate(int &k,int d)
132     {
133         int p=ch[k][d^1];
134         ch[k][d^1]=ch[p][d];
135         ch[p][d]=k;
136         maintain(k);
137         maintain(p);k=p;
138     }
139     void add(int &k,int x)
140     {
141         if(!k)
142         {
143             k=++ed;w[k]=x,s[k]=c[k]=1,ch[k][0]=ch[k][1]=0,r[k]=rand();
144             return ;
145         }
146         s[k]++;
147         if(w[k]==x){c[k]++;return ;}
148         int d=x>w[k];
149         add(ch[k][d],x);
150         if(r[ch[k][d]]<r[k])rotate(k,d^1);
151     }
152     bool del(int &k,int x)
153     {
154         if(!k)return 0;
155         if(w[k]==x)
156         {
157             if(c[k]>1){s[k]--;c[k]--;return 1;}
158             if(!ch[k][0]){k=ch[k][1];return 1;}
159             if(!ch[k][1]){k=ch[k][0];return 1;}
160             if(r[ch[k][0]]<r[ch[k][1]])rotate(k,1);
161             else rotate(k,0);
162             return del(k,x);
163         }
164         int d=x>w[k];
165         if(del(ch[k][d],x)){s[k]--;return 1;}
166         return 0;
167     }
168     int findrank(int x)
169     {
170         int k=root,ret=0;
171         while(k)
172         {
173             int pp=s[ch[k][0]];
174             if(x==w[k])return ret+pp;
175             else if(x<w[k])k=ch[k][0];
176             else ret+=(pp+c[k]),k=ch[k][1];
177         }
178         return ret;
179     }
180     int findwei(int x)
181     {
182         int k=root;
183         while(k)
184         {
185             int pp=s[ch[k][0]];
186             if(x<=pp)k=ch[k][0];
187             else if(x>pp+c[k])x-=pp+c[k],k=ch[k][1];
188             else return w[k];
189         }
190         return 0;
191     }
192     int findqian(int x)
193     {
194         int k=root,ret=0;
195         while(k)
196         {
197             if(w[k]<x)ret=w[k],k=ch[k][1];
198             else k=ch[k][0];
199         }
200         return ret;
201     }
202     int findhou(int x)
203     {
204         int k=root,ret=0;
205         while(k)
206         {
207             if(w[k]>x)ret=w[k],k=ch[k][0];
208             else k=ch[k][1];
209         }
210         return ret;
211     }
212     int n;
213     void solve()
214     {
215         inin(n);
216         re(i,1,n)
217         {
218             int opt,x;
219             inin(opt),inin(x);
220             if(opt==1)add(root,x);
221             else if(opt==2)del(root,x);
222             else if(opt==3)printf("%d
",findrank(x)+1);
223             else if(opt==4)printf("%d
",findwei(x));
224             else if(opt==5)printf("%d
",findqian(x));
225             else if(opt==6)printf("%d
",findhou(x));
226         }
227     }
228 }
229 namespace splay//bzoj3223
230 {
231     int ch[100010][2],fa[100010],w[100010],s[100010],rev[100010],ed,root;
232     void maintain(int x){if(x)s[x]=1+s[ch[x][0]]+s[ch[x][1]];}
233     void rotate(int x)
234     {
235         int y=fa[x],z=fa[y];
236         if(z)ch[z][ch[z][1]==y]=x;
237         fa[x]=z,fa[y]=x;
238         int d=ch[y][1]==x;
239         if(ch[x][d^1])fa[ch[x][d^1]]=y;
240         ch[y][d]=ch[x][d^1];
241         ch[x][d^1]=y;
242         maintain(y);
243         maintain(x);
244     }
245     void down(int x)
246     {
247         if(rev[x])
248         {
249             swap(ch[x][0],ch[x][1]);
250             rev[ch[x][0]]^=1;
251             rev[ch[x][1]]^=1;
252             rev[x]=0;
253         }
254     }
255     int sta[100010],top;
256     void splay(int x,int f)
257     {
258         int xx=x;top=0;
259         while(xx!=f)sta[++top]=xx,xx=fa[xx];
260         while(top)down(sta[top--]);
261         while(fa[x]!=f)
262         {
263             int y=fa[x],z=fa[y];
264             if(z!=f)
265                 if((ch[y][1]==x)^(ch[z][1]==y))rotate(x);
266                 else rotate(y);else ;
267             rotate(x);
268         }
269         maintain(x);
270         if(!f)root=x;
271     }
272     int a[100010],n,m;
273     int build(int l,int r)
274     {
275         if(l>r)return 0;
276         if(l==r)
277         {
278             ed++;
279             w[ed]=a[l],s[ed]=1;
280             return ed;
281         }
282         int mid=(l+r)>>1,ret=++ed;
283         ch[ret][0]=build(l,mid-1);
284         ch[ret][1]=build(mid+1,r);
285         fa[ch[ret][0]]=fa[ch[ret][1]]=ret;
286         w[ret]=a[mid];
287         maintain(ret);
288         return ret;
289     }
290     void print(int x)
291     {
292         if(!x)return ;
293         if(w[x]==0){print(ch[x][1]);return ;}
294         if(w[x]==n+1){print(ch[x][0]);return ;}
295         down(x);
296         print(ch[x][0]);
297         printf("%d ",w[x]);
298         print(ch[x][1]);
299     }
300     int findwei(int x)
301     {
302         int k=root;
303         while(k)
304         {
305             down(k);
306             int pp=s[ch[k][0]];
307             if(x<=pp)k=ch[k][0];
308             else if(x==pp+1)return k;
309             else x-=pp+1,k=ch[k][1];
310         }
311         return 0;
312     }
313     void solve()
314     {
315         inin(n);inin(m);
316         re(i,0,n+1)a[i]=i;
317         root=build(0,n+1);
318         re(i,1,m)
319         {
320             int l,r;
321             inin(l),inin(r);
322             l=findwei(l),r=findwei(r+2);
323             splay(l,0),splay(r,l);
324             rev[ch[r][0]]^=1;
325         }
326         print(root);
327     }
328 }
329 namespace segmenttree//codevs1082
330 {
331     LL w[800080],add[800080],a[200020];
332     int l[800080],r[800080];
333     void build(int k,int ll,int rr)
334     {
335         l[k]=ll,r[k]=rr;
336         if(ll==rr){w[k]=a[ll];return ;}
337         int mid=(ll+rr)>>1,p1=k<<1,p2=p1|1;
338         build(p1,ll,mid);
339         build(p2,mid+1,rr);
340         w[k]=w[p1]+w[p2];
341     }
342     void addtag(int k,LL x)
343     {
344         w[k]+=x*(r[k]-l[k]+1);
345         add[k]+=x;
346     }
347     void down(int k)
348     {
349         if(!add[k])return ;
350         addtag(k<<1,add[k]);
351         addtag(k<<1|1,add[k]);
352         add[k]=0;
353     }
354     void change(int k,int ll,int rr,LL x)
355     {
356         if(l[k]>=ll&&r[k]<=rr){addtag(k,x);return ;}
357         down(k);
358         int mid=(l[k]+r[k])>>1,p1=k<<1,p2=p1|1;
359         if(rr<=mid)change(p1,ll,rr,x);
360         else if(ll>mid)change(p2,ll,rr,x);
361         else change(p1,ll,rr,x),change(p2,ll,rr,x);
362         w[k]=w[p1]+w[p2];
363     }
364     LL query(int k,int ll,int rr)
365     {
366         if(l[k]>=ll&&r[k]<=rr)return w[k];
367         down(k);
368         int mid=(r[k]+l[k])>>1,p1=k<<1,p2=p1|1;
369         if(rr<=mid)return query(p1,ll,rr);
370         if(ll>mid)return query(p2,ll,rr);
371         return query(p1,ll,rr)+query(p2,ll,rr);
372     }
373     int n,m;
374     void solve()
375     {
376         inin(n);
377         re(i,1,n)LLin(a[i]);
378         build(1,1,n);
379         inin(m);
380         re(i,1,m)
381         {
382             int opt,q,ww;
383             LL e;
384             inin(opt);
385             if(opt==1)
386             {
387                 inin(q),inin(ww),LLin(e);
388                 change(1,q,ww,e);
389             }
390             else 
391             {
392                 inin(q),inin(ww);
393                 cout<<query(1,q,ww);cout<<"
";
394             }
395         }
396     }
397 }
398 namespace pst//bzoj3524
399 {
400     int root[500050],l[10000010],r[10000010],sum[10000010];
401     int n,m,ed;
402     void update(int ll,int rr,int x,int &y,int xx)
403     {
404         y=++ed,sum[y]=sum[x]+1;
405         if(ll==rr)return ;
406         l[y]=l[x],r[y]=r[x];
407         int mid=(ll+rr)>>1;
408         if(xx<=mid)update(ll,mid,l[x],l[y],xx);
409         else update(mid+1,rr,r[x],r[y],xx);
410     }
411     int query(int L,int R)
412     {
413         int ll=1,rr=n,mid,x=root[L-1],y=root[R],temp=(R-L+1)>>1;
414         while(ll<rr)
415         {
416             if(sum[y]-sum[x]<=temp)return 0;mid=(ll+rr)>>1;
417             if(sum[l[y]]-sum[l[x]]>temp)rr=mid,x=l[x],y=l[y];
418             else if(sum[r[y]]-sum[r[x]]>temp)ll=mid+1,x=r[x],y=r[y];
419             else return 0;
420         }
421         return ll;
422     }
423     void solve()
424     {
425         inin(n),inin(m);
426         re(i,1,n)
427         {
428             int x;inin(x);
429             update(1,n,root[i-1],root[i],x);
430         }
431         re(i,1,m)
432         {
433             int ll,rr;inin(ll),inin(rr);
434             printf("%d
",query(ll,rr));
435         }
436     }
437 }
438 namespace lct//bzoj2049
439 {
440     int ch[10010][2],fa[10010],rev[10010];
441     bool isroot(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
442     void rotate(int x)
443     {
444         int y=fa[x],z=fa[y];
445         if(!isroot(y))ch[z][ch[z][1]==y]=x;
446         fa[x]=z,fa[y]=x;
447         int d=ch[y][1]==x;
448         fa[ch[x][d^1]]=y;
449         ch[y][d]=ch[x][d^1];
450         ch[x][d^1]=y;
451     }
452     void down(int x)
453     {
454         if(rev[x])
455         {
456             swap(ch[x][0],ch[x][1]);
457             rev[ch[x][0]]^=1;
458             rev[ch[x][1]]^=1;
459             rev[x]=0;
460         }
461     }
462     int sta[100010],top;
463     void splay(int x)
464     {
465         top=0;int xx=x;sta[++top]=xx;
466         while(!isroot(xx))sta[++top]=fa[xx],xx=fa[xx];
467         while(top)down(sta[top--]);
468         while(!isroot(x))
469         {
470             int y=fa[x],z=fa[y];
471             if(!isroot(y))
472                 if((ch[y][1]==x)^(ch[z][1]==y))rotate(x);
473                 else rotate(y);else ;
474             rotate(x);
475         }
476     }
477     void access(int x)
478     {
479         int temp=0;
480         while(x)
481         {
482             splay(x);
483             ch[x][1]=temp;
484             temp=x,x=fa[x];
485         }
486     }
487     void reverse(int x)
488     {
489         access(x),splay(x),rev[x]^=1;
490     }
491     void link(int x,int y)
492     {
493         reverse(x),fa[x]=y,splay(x);
494     }
495     void cut(int x,int y)
496     {
497         reverse(x),access(y),splay(y),fa[x]=ch[y][0]=0;
498     }
499     int find(int x)
500     {
501         access(x),splay(x);
502         while(ch[x][0])x=ch[x][0];
503         return x;
504     }
505     int n,m;
506     void solve()
507     {
508         inin(n),inin(m);char s[20];
509         re(i,1,m)
510         {
511             strin(s);int q,ww;inin(q),inin(ww);
512             if(s[0]=='Q')
513             {
514                 if(find(q)==find(ww))cout<<"Yes
";
515                 else cout<<"No
";
516             }
517             else if(s[0]=='C')
518             {
519                 link(q,ww);
520             }
521             else cut(q,ww);
522         }
523     }
524 }
525 int main()
526 {
527      return 0;
528 }
原文地址:https://www.cnblogs.com/HugeGun/p/5256590.html