模板集合

>w<

Windows对拍:

 1 @echo off
 2 
 3 set paht=C:\Windows\System32
 4 
 5 :loop
 6 
 7 data.exe
 8 ddd.exe
 9 pai.exe
10 
11 fc ddd.out pai.out
12 
13 if not errorlevel 1 goto loop
14 
15 pause
16 
17 goto loop
View Code

gvim配置:

set ts=4
set sw=4
set smarttab
set number
color desert
syntax on
set cindent
set guifont=Consolas:h16

imap ee :w
View Code

 一行gcd:

1 LL gcd(LL x,LL y){  return (y ? gcd(y,x%y) : x);}
View Code

 线性基(带求交):

 1 struct bss{
 2     int b[32];
 3     bss(){
 4         for(int i=0;i<=31;++i)  b[i]=0;
 5     }
 6     bss(int x[]){
 7         for(int i=0;i<=31;++i)  b[i]=x[i];
 8     }
 9     void ist(int x){
10         for(int i=31;i>=0;--i)if(x>>i&1){
11             if(!b[i]){
12                 b[i]=x;
13                 return ;
14             }
15             x^=b[i];
16         }
17     }
18     bool chck(int x){
19         for(int i=31;i>=0;--i)if(x>>i&1)
20             x^=b[i];
21         return !x;
22     }
23 };
24 bss mg(bss x,bss y){
25     bss bwl=x,nb=x,z;
26     for(int i=0;i<=31;++i)if(y.b[i]){
27         int tma=0,tmb=y.b[i];
28         for(int j=i;j>=0;--j)if(tmb>>j&1){
29             if(bwl.b[j]){
30                 tmb^=bwl.b[j],tma^=nb.b[j];
31                 if(!tmb){
32                     z.b[i]=tma;
33                     break;
34                 }
35             }
36             else{
37                 bwl.b[j]=tmb;
38                 nb.b[j]=tma;
39                 break;
40             }
41         }
42     }
43     return z;
44 }
View Code

 (小根)堆:

 1 int hp[110000],sz=0;
 2 void ist(int z){
 3     int x;  hp[x=(++sz)]=z;
 4     while(x!=1 && hp[x]>1])  swap(hp[x],hp[x>>1]),x>>=1;
 5 }
 6 void pp(){
 7     hp[1]=hp[sz--];
 8     int x=1,mnid=1;
 9     for(;;){
10         mnid=x;
11         if((x<<1)<=sz && hp[x<<1]1);
12         if((x<<1|1)<=sz && hp[x<<1|1]1|1);
13         if(mnid==x)  break;
14         swap(hp[mnid],hp[x]);
15         x=mnid;
16     }
17 }
View Code

 后缀数组(下标从1开始):

 1 char s[1100000];  int n=0;
 2 int rk[1100000],hght[1100000];
 3 int cnt[220],cntrk[1100000];
 4 int rk1[1100000],rk2[1100000];
 5 int sa[1100000],tmpsa[1100000];
 6 void gtsffxrk(){
 7     memset(cnt,0,sizeof(cnt));
 8     for(int i=1;i<=n;++i)  ++cnt[(int)s[i]];
 9     for(int i=1;i<=210;++i)  cnt[i]+=cnt[i-1];
10     for(int i=1;i<=n;++i)  rk[i]=cnt[(int)s[i]];
11     for(int l=1;l1){
12         for(int i=1;i<=n;++i)  rk1[i]=rk[i],rk2[i]=(i+l>n ? 0 : rk[i+l]);
13         fill(cntrk+1,cntrk+1+n,0);
14         //每一步都必须fill,因为cntrk求了前缀和,cntrk--并不会把所有cntrk都减成0
15         for(int i=1;i<=n;++i)  ++cntrk[rk2[i]];
16         for(int i=1;i<=n;++i)  cntrk[i]+=cntrk[i-1];
17         //i从1开始,注意因为空字符的存在所以还是有0rank的
18         for(int i=n;i>=1;--i)  tmpsa[cntrk[rk2[i]]--]=i;
19         fill(cntrk+1,cntrk+1+n,0);
20         for(int i=1;i<=n;++i)  ++cntrk[rk1[i]];
21         for(int i=1;i<=n;++i)  cntrk[i]+=cntrk[i-1];
22         for(int i=n;i>=1;--i)  sa[cntrk[rk1[tmpsa[i]]]--]=tmpsa[i];
23         rk[sa[1]]=1;
24         //如果rank从0开始,对于全部一样的串如"aaaa"会出问题,把最小的rank和空字符混淆
25         bool flg=true;
26         for(int i=2;i<=n;++i){
27             rk[sa[i]]=rk[sa[i-1]];
28             rk[sa[i]]+=(rk1[sa[i]]!=rk1[sa[i-1]] || rk2[sa[i]]!=rk2[sa[i-1]]);
29             if(rk1[sa[i]]==rk1[sa[i]] || rk2[sa[i]]==rk2[sa[i]])  flg=false;
30             //if(rk[sa[i]]==rk[sa[i-1]])  flg=false;
31         }
32         if(flg)  break;
33     }
34 }
35 void gthght(){
36     int l=0;
37     for(int i=1;i<=n;++i)if(rk[i]>1){
38         int j=sa[rk[i]-1];
39         while(i+l<=n && j+l<=n && s[i+l]==s[j+l])  ++l;
40         //i+l表示的实际上是长度为i+l-1的串的最后一个字符
41         hght[rk[i]]=l;
42         l-=(l>0);
43     }
44 }
View Code

 dinic(当前弧优化):

 1 const LL oo=1000000000000007;
 2 struct edg{int y,nxt;  LL v;}e[11000];  int lk[110],ltp=1;
 3 //注意两倍边数组
 4 void ist(int x,int y,int z){
 5     e[++ltp]=(edg){y,lk[x],z};  lk[x]=ltp;
 6     //注意结构体内变量顺序
 7     e[++ltp]=(edg){x,lk[y],0};  lk[y]=ltp;
 8     //因为要用i^1表示反向边所以边的标号从2开始
 9 }
10 int n,m;  int s,t;
11 int lvl[110];
12 int q[110],hd=0;
13 int crt[110];
14 bool gtlvl(){
15     memset(lvl,0,sizeof(lvl));
16     lvl[q[hd=1]=s]=1;
17     for(int k=1;k<=hd;++k){
18         crt[q[k]]=lk[q[k]];
19         //注意crt要初始化
20         for(int i=lk[q[k]];i;i=e[i].nxt)if(e[i].v && !lvl[e[i].y]){
21             q[++hd]=e[i].y;
22             lvl[e[i].y]=lvl[q[k]]+1;
23         }
24     }
25     return lvl[t];
26 }
27 LL mxflw(int x,LL y){
28     if(x==t)  return y;
29     LL bwl=0,flw=0;
30     for(int i=crt[x];i && bwlif(lvl[e[i].y]==lvl[x]+1 && e[i].v)
31         if((flw=mxflw(e[i].y,min(y-bwl,e[i].v)))){
32             e[i].v-=flw,e[i^1].v+=flw;
33             bwl+=flw;
34             if(!e[i].v)  crt[x]=e[i].nxt;
35             //唯一的改动,很好写
36             //注意必须某条边跑满才能换下一个,否则会负优化
37         }
38     if(!bwl)  lvl[x]=0;
39     return bwl;
40 }
41 LL dnc(){
42     LL bwl=0,flw=0;
43     while(gtlvl())while((flw=mxflw(s,oo)))  bwl+=flw;
44     return bwl;
45 }
View Code

 平衡树treap(假删除):

 1 int c[110000][2],v[110000],u[110000],sz[110000],ntp=0,rt=0;
 2 int nb[110000],fth[110000];
 3 void rtt(int x,bool mk){
 4     int l=mk^1,r=mk,y=fth[x],z=fth[fth[x]];
 5     //l和r的选取必须看以左旋还是右旋为例
 6     if(c[x][r])  fth[c[x][r]]=y;
 7     //c[x][r]可能为空
 8     fth[y]=x,fth[x]=z;
 9     c[y][l]=c[x][r],c[x][r]=y;
10     //x肯定有爸爸,没有爸爸旋个毛线
11     if(z)  c[z][c[z][1]==y]=x;  //注意这里不是l和r
12     //总共涉及到3条边,所以共有6个赋值
13     sz[x]=sz[y],sz[y]=sz[c[y][0]]+sz[c[y][1]]+nb[y];
14     if(y==rt)  rt=x;
15     //注意rt
16 }
17 void mt(int x){
18     while(fth[x] && u[x]0]==x);
19 }
20 void ist(int x,int y,int z){
21     if(!x){
22         x=++ntp;
23         if(!rt)  rt=x;
24         v[x]=z,u[x]=rand();
25         sz[x]=1,nb[x]=1;
26         fth[x]=y;  if(y)  c[y][z>v[y]]=x;
27         //x肯定要设置爸爸,但爸爸可能为空,细节要考虑到
28         c[x][0]=0,c[x][1]=0;
29         mt(x);
30         return ;
31     }
32     ++sz[x];
33     if(z==v[x])  ++nb[x];
34     else  ist(c[x][z>v[x]],x,z);
35 }
36 void dlt(int x,int z){
37     if(!x)  return ;
38     --sz[x];
39     if(z==v[x])  --nb[x];
40     else  dlt(c[x][z>v[x]],z);
41     return ;
42 }
43 int gtrk(int x,int z){
44     if(!x)  return -1;
45     if(z==v[x])  return sz[c[x][0]]+1;
46     else  return gtrk(c[x][z>v[x]],z)+(z>v[x] ? sz[c[x][0]]+nb[x] : 0);
47 }
48 int slct(int x,int z){
49     if(!x)  return -1;
50     if(z<=sz[c[x][0]])  return slct(c[x][0],z);
51     //注意别写混成gtrk
52     else if(z-sz[c[x][0]]<=nb[x])  return v[x];
53     else  return slct(c[x][1],z-sz[c[x][0]]-nb[x]);
54 }
55 int gtcsctv(int x,int z,bool mk){
56     int l=mk,r=mk^1;
57     //前驱后继也是镜像操作
58     while(v[x]!=z){
59         if(!c[x][z>v[x]]){
60             ist(rt,0,z),dlt(rt,z);
61             //注意一定要从rt开始插入和删除,如果从x开始会有很多问题
62             //比如被旋走,比如插入途径加的sz没有删干净
63             x=ntp;
64         }
65         //保证第一遍查找的时候不会找到假节点
66         else  x=c[x][z>v[x]];
67         //注意一定要else,否则新插入的点可能会被maintain跑
68     }
69     if(!c[x][l]){
70         while(fth[x] && c[fth[x]][r]!=x)  x=fth[x];
71         if(!fth[x])  return -1;
72         x=fth[x];
73     }
74     else{
75         //注意这里是else,如果开始爸爸就不用再找儿子了
76         x=c[x][l];
77         while(c[x][r])  x=c[x][r];
78     }
79     if(nb[x])  return v[x];
80     else  return gtcsctv(x,v[x],mk);
81     //如果偷懒不删除则要注意找到的点是否已经没有数了
82     //感觉这样容易反复查找被卡,但是没有证据
83 }
View Code

 cdq分治(三维数星星小于等于版):

 1 void cdq(int l,int r,int cl,int cr){
 2     if(l>=r)  return ;
 3     if(cl==cr){
 4         for(int i=l;i<=r;++i){
 5             int tmp=1;
 6             //注意这里对于全等点的处理
 7             while(i+tmp<=r && a[i+tmp].a==a[i].a && a[i+tmp].c==a[i].c)  ++tmp;
 8             //i+tmp表示的实际上是长度为tmp+1的区间的右端点
 9             for(int j=0;j1+qry(a[i].c);
10             //别忘了qry
11             mdf(a[i].c,tmp);
12             i+=tmp-1;
13             //注意是+tmp-1不是=也不是+tmp
14         }
15         for(int i=l;i<=r;++i)  mdf(a[i].c,-1);
16         return ;
17     }
18     int md=(cl+cr)>>1;
19     int cnt1=0,cnt2=0;
20     for(int i=l;i<=r;++i){
21         if(a[i].b<=md){
22             mdf(a[i].c,1);
23             ++cnt1;
24         }
25         else{
26             a[i].ans+=qry(a[i].c);
27             ++cnt2;
28         }
29     }
30     for(int i=l;i<=r;++i)if(a[i].b<=md)  mdf(a[i].c,-1);
31     cnt1+=l;  cnt2+=cnt1;
32     for(int i=r;i>=l;--i)  q[--(a[i].b<=md ? cnt1 : cnt2)]=a[i];
33     for(int i=l;i<=r;++i)  a[i]=q[i];
34     cdq(l,cnt2-1,cl,md),cdq(cnt2,r,md+1,cr);
35 }
36 bool cmp(nds x,nds y){  return (x.a==y.a ? (x.b==y.b ? x.cy.a);}
37 //这个顺序很重要
View Code

 树状数组:

1 inline int lbt(int x){  return x&-x;}
2 //v[x]统计的是[x-lowbit(x)+1,x]的所有数
3 void mdf(int x,int z){  while(x<=m){  v[x]+=z;  x+=lbt(x);}}
4 //+lowbit的目的不是把1变成0,而是把0变成1
5 int qry(int x){
6     int bwl=0;
7     while(x){  bwl+=v[x];  x-=lbt(x);}
8     return bwl;
9 }
View Code

 

你可能感兴趣的:(模板集合)