zoukankan      html  css  js  c++  java
  • 数据结构模板

      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 }
  • 相关阅读:
    Win10上使用Linux Subsystem配置cuckoo sandbox
    Windows下编译OpenSSL
    64位使用windbg获取Shadow SSDT
    [转载]VS2010怎样打开VS2013或者VS2015建立的工程
    Critical Regions和Guarded Regions区别
    Windows7 x64 了解堆
    网DAI之家简单爬取
    javascript 练习题目答案2
    javascript 练习题目答案1
    javascript 练习题目答案
  • 原文地址:https://www.cnblogs.com/HugeGun/p/5256590.html
Copyright © 2011-2022 走看看