板子集合

图论

 1 #include<bits/stdc++.h>
 2 #define qmin(x,y) (x=min(x,y))
 3 #define qmax(x,y) (x=max(x,y))
 4 #define vi vector<int>
 5 #define vit vector<int>::iterator
 6 #define pir pair<int,int>
 7 #define fr first
 8 #define sc second
 9 #define mp(x,y) make_pair(x,y)
10 #define rsort(x,y) sort(x,y),reverse(x,y)
11 using namespace std;
12 
13 typedef long long ll;
14 const int Maxn=110000;
15 const int inf=0x3f3f3f3f;
16 
17 int to[Maxn],nxt[Maxn],first[Maxn],w[Maxn],tot=1;
18 int dis[Maxn];
19 
20 inline void add(int u,int v,int wi) {
21     to[tot]=v;
22     nxt[tot]=first[u];
23     w[tot]=1;
24     first[u]=tot++;
25 }
26 
27 void dijk(int s) {
28     priority_queue<pir> q;
29     memset(dis,0x3f,sizeof(dis));
30     q.push(mp(dis[s]=0,s));
31     while(!q.empty()) {
32         pir now=q.top();q.pop();
33         if(now.fr!=dis[now.sc]) continue;
34         for(int i=first[now.sc];i;i=nxt[i])
35             if(dis[to[i]]>now.fr+w[i]) {
36                 dis[to[i]]=now.fr+w[i];
37                 q.push(mp(dis[to[i]],to[i]));
38             }
39     }
40 }
41 
42 int main() {
43     return 0;
44 }
dijkstra
 1 #include<bits/stdc++.h>
 2 #define qmin(x,y) (x=min(x,y))
 3 #define qmax(x,y) (x=max(x,y))
 4 #define vi vector<int>
 5 #define vit vector<int>::iterator
 6 #define pir pair<int,int>
 7 #define fr first
 8 #define sc second
 9 #define mp(x,y) make_pair(x,y)
10 #define rsort(x,y) sort(x,y),reverse(x,y)
11 using namespace std;
12 
13 typedef long long ll;
14 const int Maxn=110000;
15 const int inf=0x3f3f3f3f;
16 
17 int to[Maxn],nxt[Maxn],first[Maxn],tot=1;
18 int ran[Maxn],s[Maxn],top,cnt,belong[Maxn],num;
19 
20 inline void add(int u,int v) {
21     to[tot]=v;
22     nxt[tot]=first[u];
23     first[u]=tot++;
24 }
25 
26 int dfs(int root) {
27     int low=ran[root]=++cnt;
28     s[++top]=root;
29     for(int i=first[root];i;i=nxt[i])
30         if(!ran[to[i]]) qmin(low,dfs(to[i]));
31         else if(!belong[to[i]]) qmin(low,ran[to[i]]);
32     if(low==ran[root]) {
33         num++;
34         do belong[s[top]]=num; while(s[top--]!=root) ;
35     }
36     return low;
37 }
38 
39 int main() {
40     return 0;
41 }
tarjan缩点
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 typedef long long ll;
 5 const int Maxn=110000;
 6 const int inf=0x3f3f3f3f;
 7 
 8 int to[Maxn],nxt[Maxn],first[Maxn],tot=2,w[Maxn];
 9 int s,t,b[Maxn],cur[Maxn];
10 
11 inline void add(int u,int v,int wi) {
12     to[tot]=v;
13     nxt[tot]=first[u];
14     w[tot]=wi;
15     first[u]=tot++;
16     to[tot]=u;
17     nxt[tot]=first[v];
18     w[tot]=wi;
19     first[v]=tot++;
20 }
21 
22 int bfs() {
23     queue<int> q;
24     memset(b,0,sizeof(b));
25     q.push(s);b[s]=1;
26     while(!q.empty()) {
27         int now=q.front();q.pop();
28         for(int i=first[now];i;i=nxt[i])
29             if(w[i]&&!b[to[i]]) {
30                 b[to[i]]=b[now]+1;
31                 q.push(to[i]);
32             }
33     }
34     return b[t];
35 }
36 
37 int dfs(int root,int flow) {
38     if(root==t) return flow;
39     for(int &i=cur[root];i;i=nxt[i])
40         if(w[i]&&b[to[i]]==b[root]+1) {
41             int temp=dfs(to[i],min(w[i],flow));
42             if(temp) {
43                 w[i]-=temp;
44                 w[i^1]+=temp;
45                 return temp;
46             }
47         }
48     return b[root]=0;
49 }
50 
51 int dinic() {
52     int ans=1,temp;
53     while(bfs()) {
54         memcpy(cur,first,sizeof(cur));
55         while(temp=dfs(s,inf)) ans+=temp;
56     }
57     return ans;
58 }
59 
60 int main() {
61     return 0;
62 }
dinic
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 typedef long long ll;
 5 const int Maxn=110000;
 6 const int inf=0x3f3f3f3f;
 7 
 8 int to[Maxn],nxt[Maxn],first[Maxn],tot=2,w[Maxn],f[Maxn];
 9 int s,t,b[Maxn],vis[Maxn],cost;
10 
11 inline void add(int u,int v,int wi,int fei) {
12     to[tot]=v;
13     nxt[tot]=first[u];
14     w[tot]=wi;
15     f[tot]=fei;
16     first[u]=tot++;
17     to[tot]=u;
18     nxt[tot]=first[v];
19     w[tot]=wi;
20     f[tot]=-fei;
21     first[v]=tot++;
22 }
23 
24 int spfa() {
25     deque<int> q;
26     memset(b,0x3f,sizeof(b));
27     memset(vis,0,sizeof(vis));//!importance
28     q.push_back(t);b[t]=0;
29     while(!q.empty()) {
30         int now=q.front();q.pop_front();
31         for(int i=first[now];i;i=nxt[i])
32             if(w[i^1]&&b[to[i]]>b[now]-f[i]) {
33                 b[to[i]]=b[now]-f[i];
34                 if(!vis[to[i]])
35                     if(q.empty()||b[q.front()]<b[to[i]]) q.push_back(to[i]);
36                     else q.push_front(to[i]);
37                 vis[to[i]]=1;
38             }
39         vis[now]=0;
40     }
41     return b[s]!=inf;
42 }
43 
44 int dfs(int root,int flow) {
45     vis[root]=1;
46     if(root==t) return flow;
47     for(int i=first[root];i;i=nxt[i])
48         if(b[root]==b[to[i]]+f[i]&&!vis[to[i]]&&w[i]) {
49             int temp=dfs(to[i],min(flow,w[i]));
50             if(temp) {
51                 w[i]-=temp;
52                 w[i^1]+=temp;
53                 cost+=f[i]*temp;
54                 return temp;
55             }
56         }
57     return 0;
58 }
59 
60 int mcmf() {
61     int ans=0;
62     while(spfa()) {
63         vis[t]=1;
64         while(vis[t]) {
65             memset(vis,0,sizeof(vis));
66             ans+=dfs(s,inf);
67         }
68     }
69     return ans;
70 }
71 
72 int main() {
73     return 0;
74 }
zkw费用流

多项式

 1 #include<bits/stdc++.h>
 2 #define qmin(x,y) (x=min(x,y))
 3 #define qmax(x,y) (x=max(x,y))
 4 #define vi vector<int>
 5 #define vit vector<int>::iterator
 6 #define pir pair<int,int>
 7 #define fr first
 8 #define sc second
 9 #define mp(x,y) make_pair(x,y)
10 #define rsort(x,y) sort(x,y),reverse(x,y)
11 using namespace std;
12 
13 typedef long long ll;
14 const int Maxn=110000;
15 const int inf=0x3f3f3f3f;
16 const double Pi=acos(-1);
17 
18 struct Complex {
19     double x,y;
20     Complex (double xx=0,double yy=0) {
21         x=xx; y=yy;
22     }
23 };
24 
25 Complex operator + (Complex a,Complex b) {
26     return Complex (a.x+b.x,a.y+b.y);
27 }
28 
29 Complex operator - (Complex a,Complex b) {
30     return Complex (a.x-b.x,a.y-b.y);
31 }
32 
33 Complex operator * (Complex a,Complex b) {
34     return Complex (a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);
35 }
36 
37 int limit,l,r[Maxn];
38 
39 void ycl(int x) {
40     limit=1,l=0;
41     while(limit<=x) limit<<=1,l++;
42     for(int i=0;i<limit;i++) r[i]=r[i>>1]>>1|((i&1)<<l-1);
43 }
44 
45 void fft(Complex *a,int type) {
46     for(int i=0;i<limit;i++) if(i<r[i]) swap(a[i],a[r[i]]);
47     for(int mid=1;mid<limit;mid<<=1) {
48         Complex Wn(cos(Pi/mid),type*sin(Pi/mid));
49         for(int j=0;j<limit;j+=mid<<1) {
50             Complex w(1);
51             for(int k=0;k<mid;k++,w=w*Wn) {
52                 Complex x=a[j+k],y=w*a[j+k+mid];
53                 a[j+k]=x+y;
54                 a[j+k+mid]=x-y;
55             }
56         }
57     }
58     if(type==-1) {
59         for(int i=0;i<limit;i++) a[i].x/=limit;
60     }
61 }
62 
63 int main() {
64     return 0;
65 }
FFT
 1 #include<bits/stdc++.h>
 2 #define qmin(x,y) (x=min(x,y))
 3 #define qmax(x,y) (x=max(x,y))
 4 #define vi vector<int>
 5 #define vit vector<int>::iterator
 6 #define pir pair<int,int>
 7 #define fr first
 8 #define sc second
 9 #define mp(x,y) make_pair(x,y)
10 #define rsort(x,y) sort(x,y),reverse(x,y)
11 using namespace std;
12 
13 typedef long long ll;
14 const int Maxn=110000;
15 const int inf=0x3f3f3f3f;
16 const ll mod=998244353;
17 const ll gg=3;
18 const ll gi=332748118;
19 
20 ll powp(ll a,ll b) {
21     ll ans=1;
22     while(b) {
23         if(b&1) ans=ans*a%mod;
24         a=a*a%mod;
25         b>>=1;
26     }
27     return ans;
28 }
29 
30 inline ll modd(ll x) {
31     return x<0?x+mod:x>=mod?x-mod:x;
32 }
33 
34 int limit,l,r[Maxn];
35 
36 void ycl(int x) {
37     limit=1,l=0;
38     while(limit<=x) limit<<=1,l++;
39     for(int i=0;i<limit;i++) r[i]=r[i>>1]>>1|((i&1)<<l-1);
40 }
41 
42 void ntt(ll *a,ll gg) {
43     for(int i=0;i<limit;i++) if(i<r[i]) swap(a[i],a[r[i]]);
44     for(int mid=1;mid<limit;mid<<=1) {
45         ll Wn=powp(gg,(mod-1)/(mid<<1));
46         for(int j=0;j<limit;j+=mid<<1) {
47             ll w=1;
48             while(int k=0;k<mid;k++,w=w*Wn) {
49                 ll x=a[j+k],y=w*a[j+k+mid]%mod;
50                 a[j+k]=modd(x+y);
51                 a[j+k+mid]=modd(x-y);
52             }
53         }
54     }
55     if(gg==gi) {
56         ll inv=powp(limit,mod-2);
57         for(int i=0;i<limit;i++) a[i]=a[i]*inv%mod;
58     }
59 }
60 
61 int main() {
62     return 0;
63 }
NTT
  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<queue>
  5 #include<cctype>
  6 #define qmin(x,y) (x=min(x,y))
  7 #define qmax(x,y) (x=max(x,y))
  8 #define vi vector<int>
  9 #define vit vector<int>::iterator
 10 #define pir pair<int,int>
 11 #define fr first
 12 #define sc second
 13 #define mp(x,y) make_pair(x,y)
 14 #define rsort(x,y) sort(x,y),reverse(x,y)
 15 using namespace std;
 16 
 17 inline char gc() {
 18 //    static char buf[100000],*p1,*p2;
 19 //    return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
 20     return getchar();
 21 }
 22 
 23 template<class T>
 24 int read(T &ans) {
 25     ans=0;char ch=gc();T f=1;
 26     while(!isdigit(ch)) {
 27         if(ch==EOF) return -1;
 28         if(ch=='-') f=-1;
 29         ch=gc();
 30     }
 31     while(isdigit(ch))
 32         ans=ans*10+ch-'0',ch=gc();
 33     ans*=f;return 1;
 34 }
 35 
 36 template<class T1,class T2>
 37 int read(T1 &a,T2 &b) {
 38     return read(a)!=EOF&&read(b)!=EOF?2:EOF;
 39 }
 40 
 41 template<class T1,class T2,class T3>
 42 int read(T1 &a,T2 &b,T3 &c) {
 43     return read(a,b)!=EOF&&read(c)!=EOF?3:EOF;
 44 }
 45 
 46 typedef long long ll;
 47 const int Maxn=1100000;
 48 const int inf=0x3f3f3f3f;
 49 const ll mod=998244353;
 50 const ll gg=3;
 51 const ll gi=332748118;
 52 
 53 ll powp(ll a,ll b) {
 54     ll ans=1;
 55     while(b) {
 56         if(b&1) ans=ans*a%mod;
 57         a=a*a%mod;
 58         b>>=1;
 59     }
 60     return ans;
 61 }
 62 
 63 ll modd(ll x) {
 64     return x<0?x+mod:x>=mod?x-mod:x;
 65 }
 66 
 67 ll Sqrt(ll a) {
 68     ll x=powp(a,60),e=powp(a,119),k=1,inva=powp(a,mod-2);
 69     while(k<23) {
 70         if(powp(e,1<<23-(k+1))!=1) {
 71             x=x*powp(3,119*(1<<k-1))%mod;
 72             e=inva*x%mod*x%mod;
 73         }
 74         k++;
 75     }
 76     return min(x,mod-x);
 77 }
 78 
 79 int limit,l,r[Maxn];
 80 ll in[Maxn],f[Maxn],n,k,h[Maxn],g[Maxn];
 81 
 82 void ycl(int x) {
 83     limit=1,l=0;
 84     while(limit<=x) limit<<=1,l++;
 85     for(int i=0;i<limit;i++) r[i]=r[i>>1]>>1|((i&1)<<l-1);
 86 }
 87 
 88 void dft(ll *a,ll gg) {
 89     for(int i=0;i<limit;i++) if(i<r[i]) swap(a[i],a[r[i]]);
 90     for(int mid=1;mid<limit;mid<<=1) {
 91         ll Wn=powp(gg,(mod-1)/(mid<<1));
 92         for(int j=0;j<limit;j+=mid<<1) {
 93             ll w=1;
 94             for(int k=0;k<mid;k++,w=w*Wn%mod) {
 95                 ll x=a[j+k],y=a[j+k+mid]*w%mod;
 96                 a[j+k]=modd(x+y);
 97                 a[j+k+mid]=modd(x-y);
 98             }
 99         }
100     }
101     if(gg==gi) {
102         ll inv=powp(limit,mod-2);
103         for(int i=0;i<limit;i++) a[i]=a[i]*inv%mod;
104     }
105 }
106 
107 ll invtmp[Maxn],invtmp2[Maxn];
108 
109 void inv(ll *a,ll *ans,int n) {
110     if(n==1) {
111         ans[0]=powp(a[0],mod-2);
112         return ;
113     }
114     inv(a,ans,n+1>>1);
115     ycl(n<<1);
116     for(int i=0;i<n;i++) invtmp[i]=a[i];
117     for(int i=n;i<limit;i++) invtmp[i]=0;
118     dft(invtmp,gg),dft(ans,gg);
119     for(int i=0;i<limit;i++) ans[i]=ans[i]*modd(2-ans[i]*invtmp[i]%mod)%mod;
120     dft(ans,gi);
121     for(int i=n;i<limit;i++) ans[i]=0;
122 }
123 
124 ll divtmp[Maxn],divtmp2[Maxn];
125 
126 void div(ll *a,ll *b,ll *d,ll *r,int n,int m) {
127     reverse(a,a+n),reverse(b,b+m);
128     inv(b,divtmp,n); ycl(n<<1);
129     for(int i=0;i<limit;i++) divtmp2[i]=a[i];
130     dft(divtmp,gg),dft(divtmp2,gg);
131     for(int i=0;i<limit;i++) d[i]=divtmp[i]*divtmp2[i]%mod;
132     dft(d,gi);
133     for(int i=n-m+1;i<limit;i++) d[i]=0;
134     reverse(d,d+n-m+1);
135     reverse(a,a+n),reverse(b,b+m);
136     for(int i=0;i<=n-m;i++) divtmp[i]=d[i];
137     for(int i=n-m+1;i<limit;i++) divtmp[i]=0;
138     for(int i=0;i<m;i++) divtmp2[i]=b[i];
139     for(int i=m;i<limit;i++) divtmp2[i]=0;
140     dft(divtmp,gg),dft(divtmp2,gg);
141     for(int i=0;i<limit;i++) divtmp[i]=divtmp[i]*divtmp2[i]%mod;
142     dft(divtmp,gi);
143     for(int i=0;i<m-1;i++) r[i]=a[i]-divtmp[i];
144 }//A(x)=B(x)D(x)+R(x):A(x) n,B(x) m,D(x) n-m+1,R(x)<m-1
145 
146 ll stmp[Maxn];
147 
148 void Sqrt(ll *a,ll *ans,int n) {
149     if(n==1) {
150         ans[0]=Sqrt(a[0]);
151         return ;
152     }
153     Sqrt(a,ans,(n+1)>>1);
154     ycl(n<<1);memset(stmp,0,limit<<4);
155     for(int i=0;i<n;i++) ans[i]=ans[i]*2%mod;
156     inv(ans,stmp,n);
157     for(int i=0;i<n;i++) ans[i]=ans[i]*in[2]%mod;
158     ycl(n<<1);
159     dft(ans,gg);
160     for(int i=0;i<limit;i++) ans[i]=ans[i]*ans[i]%mod;
161     dft(ans,gi);
162     for(int i=0;i<n;i++) ans[i]=modd(a[i]+ans[i]);
163     dft(ans,gg),dft(stmp,gg);
164     for(int i=0;i<limit;i++) ans[i]=ans[i]*stmp[i]%mod;
165     dft(ans,gi);
166     for(int i=n;i<limit;i++) ans[i]=0;
167 }
168 
169 void qiudao(ll *a,ll *ans,int n) {
170     for(int i=1;i<n;i++) ans[i-1]=a[i]*i%mod;
171 }
172 
173 void jifen(ll *a,ll *ans,int n) {
174     for(int i=1;i<=n;i++) ans[i]=a[i-1]*in[i]%mod;
175 }
176 
177 ll ltmp[Maxn],ltmp2[Maxn];
178 
179 void ln(ll *a,ll *ans,int n) {
180     ycl(n<<1);memset(ltmp,0,limit<<4);
181     memset(ltmp2,0,limit<<4);
182     inv(a,ltmp,n);
183     qiudao(a,ltmp2,n);
184     ycl(n<<1);
185     dft(ltmp,gg),dft(ltmp2,gg);
186     for(int i=0;i<limit;i++) ltmp[i]=ltmp[i]*ltmp2[i]%mod;
187     dft(ltmp,gi);
188     jifen(ltmp,ans,n-1);
189 }
190 
191 ll etmp[Maxn];
192 
193 void exp(ll *a,ll *ans,int n) {
194     if(n==1) {
195         ans[0]=1;
196         return ;
197     }
198     exp(a,ans,(n+1)>>1);
199     ycl(n<<1);memset(etmp,0,limit<<4);
200     ln(ans,etmp,n);
201     ycl(n<<1);
202     for(int i=0;i<n;i++) etmp[i]=modd(a[i]-etmp[i]);
203     etmp[0]=modd(etmp[0]+1);
204     dft(etmp,gg),dft(ans,gg);
205     for(int i=0;i<limit;i++) ans[i]=ans[i]*etmp[i]%mod;
206     dft(ans,gi);
207     for(int i=n;i<limit;i++) ans[i]=0;
208 }
209 
210 ll ptmp[Maxn];
211 
212 void pow(ll *a,ll *ans,int n,int k) {
213     ln(a,ptmp,n);
214     for(int i=0;i<n;i++) ptmp[i]=ptmp[i]*k%mod;
215     exp(ptmp,ans,n);
216 }
217 
218 signed main() {
219 //    freopen("test.in","r",stdin);
220 //    freopen("out","w",stdout);
221     read(n,k);
222     n++;
223     for(int i=0;i<n;i++) read(f[i]);
224     memcpy(h,f,sizeof(h));
225     in[1]=1;
226     for(int i=2;i<=n;i++) in[i]=modd(-in[mod%i]*(mod/i)%mod);
227     Sqrt(f,g,n);memset(f,0,sizeof(f));
228     inv(g,f,n);memset(g,0,sizeof(g));
229     jifen(f,g,n);memset(f,0,sizeof(f));
230     exp(g,f,n);
231     for(int i=1;i<n;i++) g[i]=modd(h[i]-f[i]);
232     g[0]=modd(2-f[0]);memset(f,0,sizeof(f));
233     ln(g,f,n);
234     f[0]=modd(f[0]+1);memset(g,0,sizeof(g));
235     pow(f,g,n,k);memset(f,0,sizeof(f));
236     qiudao(g,f,n);
237     n--;
238     for(int i=0;i<n;i++) printf("%lld ",f[i]);
239     putchar('
');
240     return 0;
241 }
多项式全家桶(loj150)

数论

数据结构

 1 #include<bits/stdc++.h>
 2 #define qmin(x,y) (x=min(x,y))
 3 #define qmax(x,y) (x=max(x,y))
 4 #define vi vector<int>
 5 #define vit vector<int>::iterator
 6 #define pir pair<int,int>
 7 #define fr first
 8 #define sc second
 9 #define mp(x,y) make_pair(x,y)
10 #define rsort(x,y) sort(x,y),reverse(x,y)
11 using namespace std;
12 
13 typedef long long ll;
14 const int Maxn=110000;
15 const int inf=0x3f3f3f3f;
16 
17 #define lch ch[root][0]
18 #define rch ch[root][1]
19 #define fat fa[root]
20 
21 int ch[Maxn][2],fa[Maxn];
22 
23 inline int son(int root) {
24     return ch[fat][1]==root;
25 }
26 
27 inline void update(int root) {
28     /*......*/
29 }
30 
31 void rotate(int root) {
32     int y=fat,z=fa[y];
33     if(z) ch[x][son(y)]=root;
34     else rot=root;
35     int d=son(root),x=ch[root][d^1];
36     if(x) fa[x]=y;
37     ch[y][d]=x;
38     ch[x][d^1]=y;
39     fat=z;
40     update(y);
41 }
42 
43 void splay(int root,int topp=0) {
44     while(fat!=topp) {
45         if(fa[fat]!=topp) rotate(son(root)==son(fat)?fat:root);
46         rotate(root);
47     }update(root);
48 }
49 
50 int main() {
51     return 0;
52 }
Splay
  1 #include<bits/stdc++.h>
  2 #define qmin(x,y) (x=min(x,y))
  3 #define qmax(x,y) (x=max(x,y))
  4 #define vi vector<int>
  5 #define vit vector<int>::iterator
  6 #define pir pair<int,int>
  7 #define fr first
  8 #define sc second
  9 #define mp(x,y) make_pair(x,y)
 10 #define rsort(x,y) sort(x,y),reverse(x,y)
 11 using namespace std;
 12 
 13 typedef long long ll;
 14 const int Maxn=110000;
 15 const int inf=0x3f3f3f3f;
 16 
 17 #define lch ch[root][0]
 18 #define rch ch[root][1]
 19 #define fat fa[root]
 20 
 21 int fa[Maxn],ch[Maxn][2],flag[Maxn],st[Maxn],top;
 22 
 23 inline void update(int root) {
 24     /*......*/
 25 }
 26 
 27 inline int isroot(int root) {
 28     return ch[fat][0]==root||ch[fat][1]==root;
 29 }
 30 
 31 inline int son(int root) {
 32     return ch[fat][1]==root;
 33 }
 34 
 35 inline void pushr(int root) {
 36     flag[root]^=1;
 37     swap(lch,rch);
 38 }
 39 
 40 inline void pushdown(int root) {
 41     if(flag[root]) {
 42         flag[root]^=1;
 43         pushr(lch);
 44         pushr(rch);
 45     }
 46 }
 47 
 48 int min(int root) {
 49     pushdown(root);
 50     if(lch) return min(lch);
 51     return root;
 52 }
 53 
 54 void rotate(int root) {
 55     int y=fat,z=fa[y];
 56     if(isroot(z)) ch[z][son(y)]=root;
 57     int d=son(root),x=ch[root][d^1];
 58     ch[y][d]=x;
 59     fa[y]=root;
 60     fa[root]=z;
 61     if(x) fa[x]=y;
 62     ch[root][d^1]=y;
 63     update(y);
 64 }
 65 
 66 void splay(int root) {
 67     top=0;
 68     int temp=root;
 69     while(isroot(temp)) st[++top]=temp,temp=fa[temp];
 70     for(int i=top;i>=1;i--) pushdown(st[i]);
 71     while(isroot(root)) {
 72         if(isroot(fat)) rotate(son(root)==son(fat)?fat:root);
 73         rotate(root);
 74     }update(root);
 75 }
 76 
 77 void access(int root) {
 78     for(int i=0;root;root=fa[i=root])
 79         splay(root),rch=i,update(root);
 80 }
 81 
 82 void makeroot(int root) {
 83     access(root);
 84     splay(root);
 85     pushr(root);
 86 }
 87 
 88 int findroot(int root) {
 89     access(root);
 90     splay(root);
 91     int temp=min(root);
 92     return temp;
 93 }
 94 
 95 void split(int root,int y) {
 96     makeroot(root);
 97     access(y);
 98     splay(y);
 99 }
100 
101 void link(int root,int y) {
102     makeroot(root);
103     if(findroot(y)!=root) fat=y;
104 }
105 
106 void cut(int root,int y) {
107     makeroot(root);
108     if(findroot(y)==root&&fat==y&&rch==0) fat=ch[y][0]=0,update(y);
109 }
110 
111 int main() {
112     return 0;
113 }
LCT

字符串

 1 #include<bits/stdc++.h>
 2 #define qmin(x,y) (x=min(x,y))
 3 #define qmax(x,y) (x=max(x,y))
 4 #define vi vector<int>
 5 #define vit vector<int>::iterator
 6 #define pir pair<int,int>
 7 #define fr first
 8 #define sc second
 9 #define mp(x,y) make_pair(x,y)
10 #define rsort(x,y) sort(x,y),reverse(x,y)
11 using namespace std;
12 
13 typedef long long ll;
14 const int Maxn=110000;
15 const int inf=0x3f3f3f3f;
16 
17 int cmp(int *r,int a,int b,int l) {
18     return r[a]==r[b]&&r[a+l]==r[b+l];
19 }
20 
21 int wa[Maxn],wb[Maxn],ws[Maxn],wv[Maxn];
22 
23 void getsa(int *r,int *sa,int n,int m) {
24     int *x=wa,*y=wb;
25     for(int i=0;i<m;i++) ws[i]=0;
26     for(int i=0;i<n;i++) ws[x[i]=r[i]]++;
27     for(int i=1;i<m;i++) ws[i]+=ws[i-1];
28     for(int i=n-1;i>=0;i--) sa[--ws[x[i]]]=i;
29     for(int j=1,p=1;p<n;j<<=1,m=p) {
30         p=0;
31         for(int i=n-j;i<n;i++) y[p++]=i;
32         for(int i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
33         for(int i=0;i<m;i++) ws[i]=0;
34         for(int i=0;i<n;i++) ws[wv[i]=x[y[i]]]++;
35         for(int i=1;i<m;i++) ws[i]+=ws[i-1];
36         for(int i=n-1;i>=0;i--) sa[--ws[wv[i]]]=y[i];
37         swap(x,y),p=1,x[sa[0]]=0;
38         for(int i=1;i<n;i++) x[sa[i]]=cmp(y,sa[i],sa[i-1],j)?p-1:p++;
39     }
40 }
41 
42 void geth(int *r,int *sa,int n) {
43     int k=0;
44     for(int i=0;i<n;i++) ran[sa[i]]=i;
45     for(int i=0;i<n;h[ran[i++]]=k,k=max(0,k-1))
46     for(int j=sa[ran[i]-1];r[i+k]==r[j+k];k++);
47 }
48 
49 int main() {
50     return 0;
51 }
SA
 1 #include<bits/stdc++.h>
 2 #define qmin(x,y) (x=min(x,y))
 3 #define qmax(x,y) (x=max(x,y))
 4 #define vi vector<int>
 5 #define vit vector<int>::iterator
 6 #define pir pair<int,int>
 7 #define fr first
 8 #define sc second
 9 #define mp(x,y) make_pair(x,y)
10 #define rsort(x,y) sort(x,y),reverse(x,y)
11 using namespace std;
12 
13 typedef long long ll;
14 const int Maxn=110000;
15 const int inf=0x3f3f3f3f;
16 
17 int ch[Maxn][26],len[Maxn],link[Maxn],cnt=1;
18 
19 int newnode(int lenn=0) {
20     int now=++cnt;
21     len[now]=lenn;
22 }
23 
24 int cp(int x,int y) {
25     memcpy(ch[x],ch[y],sizeof(ch[x]));
26     link[x]=link[y];
27 }
28 
29 void extend(int x) {
30     int cur=newnode(len[last]+1);
31     int p=last; last=cur;
32     while(p&&!ch[p][x]) {
33         ch[p][x]=cur;
34         p=link[p];
35     }
36     if(p) {
37         int q=ch[p][x];
38         if(len[q]==len[p]+1) link[cur]=q;
39         else {
40             int clone=newnode(len[p]+1);
41             cp(clone,q),link[q]=link[cur]=clone;
42             while(p&&ch[p][x]==q) {
43                 ch[p][x]=clone;
44                 p=link[p];
45             }
46         }
47     }
48     else link[cur]=1;
49 }
50 
51 int main() {
52     return 0;
53 }
SAM

计算几何

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<cmath>
  5 using namespace std;
  6 
  7 struct point {
  8     double x,y;
  9     point (double xx=0,double yy=0) {
 10         x=xx;
 11         y=yy;
 12     }
 13 };
 14 
 15 struct line {
 16     point x,y;
 17     double jj;
 18     line (point xx=point(),point yy=point()) {
 19         x=xx;
 20         y=yy;
 21     }
 22 };
 23 
 24 point operator + (point a,point b) {
 25     return point(a.x+b.x,a.y+b.y);
 26 }
 27 
 28 point operator - (point a,point b) {
 29     return point(a.x-b.x,a.y-b.y);
 30 }
 31 
 32 point operator * (double x,point a) {
 33     return point(x*a.x,x*a.y);
 34 }
 35 
 36 double operator * (point a,point b) {
 37     return a.x*b.y-a.y*b.x;
 38 }
 39 
 40 double operator / (point a,point b) {
 41     return a.x*b.x+a.y*b.y;
 42 }
 43 
 44 bool operator < (line a,line b) {
 45     if(a.jj==b.jj) return dcmp((b.x-a.x)*(b.y-a.x))>=0;
 46     return a.jj<b.jj;
 47 }
 48 
 49 double len(point a) {
 50     return sqrt(a/a);
 51 }
 52 
 53 int dcmp(double x) {
 54     if(fabs(x)<eps) return 0;
 55     return x<0?-1:1;
 56 }
 57 
 58 double dist(point a,line b) {
 59     return fabs((a-b.x)*(b.y-b.x)/len(b.y-b.x));
 60 }
 61 
 62 double dist2(point a,line b) {
 63     if(dcmp((a-b.x)/(b.y-b.x))<0) return len(a-b.x);
 64     if(dcmp((a-b.y)/(b.x-b.y))<0) return len(a-b.y);
 65     return dist(a,b);
 66 }
 67 
 68 bool xj(line a,line b) {
 69     point x=a.y-a.x,y=b.y-b.x;
 70     return dcmp((x*(b.x-a.x))*(x*(b.y-a.x)))<=0&&dcmp((y*(a.x-b.x))*(y*(a.y-b.x)))<=0;
 71 }
 72 
 73 point jd(line a,line b) {
 74     double k1,k2,t;
 75     k1=(b.y-b.x)*(a.y-b.x);
 76     k2=(a.x-b.x)*(b.y-b.x);
 77     t=k1/(k1+k2);
 78     return a.y+t*(a.x-a.y);
 79 }
 80 
 81 int cmp(point x,point y) {
 82     int k=dcmp((x-p[1])*(y-p[1]));
 83     if(k==0) return x.x<y.x;
 84     return k>0;
 85 }
 86 
 87 void tb() {
 88     int k=1;
 89     for(int i=1;i<=n;i++)
 90         if(p[i].y<p[k].y||(p[i].y==p[k].y&&p[i].x<p[k].x)) k=i;
 91     swap(p[1],p[k]);
 92     sort(p+2,p+n+1,cmp);
 93     num=1;
 94     sxz[1]=p[1];
 95     p[++n]=p[1];
 96     for(int i=2;i<=n;i++) {
 97         while(num!=1&&dcmp((sxz[num]-sxz[num-1])*(p[i]-sxz[num-1]))<=0) num--;
 98         sxz[++num]=p[i];
 99     }
100 }
101 
102 void bpm() {
103     sort(l+1,l+n+1);
104     int top=2,bot=1;
105     for(int i=1;i<=n;i++) {
106         if(dcmp(l[i].jj-l[i-1].jj)!=0) tot++;
107         l[tot]=l[i];
108     }
109     n=tot;q[1]=l[1];q[2]=l[2];
110     for(int i=3;i<=n;i++) {
111         while(bot<top&&jud(q[top],q[top-1],l[i])) top--;
112         while(bot<top&&jud(q[bot],q[bot+1],l[i])) bot++;
113         q[++top]=l[i];
114     }
115     while(bot<top&&jud(q[top],q[top-1],q[bot])) top--;
116     while(bot<top&&jud(q[bot],q[bot+1],q[top])) bot++;
117     q[top+1]=q[bot];
118     tot=0;
119     for(int i=bot;i<=top;i++) sxz[++tot]=jd(q[i],q[i+1]);
120 }
121 
122 int main() {
123     return 0;
124 }
计算几何
原文地址:https://www.cnblogs.com/shanxieng/p/my_banzis.html