主要是给自己的,一些易忘知识点的总结吧。
Tarjan求桥及割点
割点:根的有俩儿子就是割点,其他的点如果子树中有儿子连接不到它祖先那里去就是割点(即存在low[son[u]]>=dfn[u])。
桥:结点u的子结点v的后代通过反向边只能连回v(low[v]>dfn[u])。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
void tarjan(int u){ dfn[u]=low[u]=++order; bool flag=false; for (int i=0;i<edge[u].size();i++){ int v=edge[u][i]; if(!dfn[v]){ son[u]++; father[v]=u; tarjan(v); if(low[v]>=dfn[u]) flag=true; //点u为割点 if(low[v]>dfn[u]) cutedge.push_back(make_pair(min(v,u),max(v,u))); //边v-u为割边 low[u]=min(low[u],low[v]); } else if(v!=father[u]) low[u]=min(low[u],dfn[v]); } //根节点若有两棵或两棵以上的子树则该为割点 //非根节点若所有子树节点均没有指向u的祖先节点的回边则为割点 if((father[u]==0&&son[u]>1)||(father[u]&&flag)) cutpoint.push_back(u); }
拓展欧几里得
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
inline ll exgcd(ll a,ll b,ll &x,ll &y){ if (!b){ x=1;y=0; return a; } exgcd(b,a%b,y,x); y-=a/b*x; } inline ll ny(ll x){ ll X,Y; exgcd(x,M,X,Y); if (X<0) X+=M; return X; }
大模数乘法
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
inline ll cc(ll x,ll y){ x=x*y-(ll)(((ld)x*y+0.01)/M)*M; return x<0?x+M:x; }
FFT板纸
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
for (i=0,j=0;i<N;i++){ if (i>j) swap(x[i],x[j]); for (k=N>>1;(j^=k)<k;k>>=1); }
transform:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
(A , B) -> (A+B*W , A-B*W)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
(A , B) -> (A+B , A-B) (A , B) -> ((A+B)/2 , (A-B)/2) (A0 , A1)*(B0 , B1) (A0+A1,A0-A1) * (B0+B1,B0-B1) (A0B0+A0B1+A1B0+A1B1 , A0B0+A1B1-A1B0-A0B1) (A0B0+A1B1 , A0B1+A1B0)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
(A , B) -> (A+B , B) (A , B) -> (A-B , B) (A0 , A1) * (B0 , B1) (A0+A1 , A1) * (B0+B1,B1) (A0B0+A0B1+A1B0+A1B1 , A1B1) (A0B0+A0B1+A1B0 , A1B1)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
(A , B) -> (A , A+B) (A , B) -> (A , A-B) (A0 , A1) * (B0 , B1) (A0 , A0+A1) * (B0 , B0+B1) (A0B0 , A0B0+A1B0+A0B1+A1A1) (A0B0 , A1B0+A0B1+A1A1)
辛普森积分系数
$\frac{1}{6}$ $\frac{4}{6}$ $\frac{1}{6}$
虚树
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
bool cmp(int a,int b){return df[a]<df[b];} void Mavis(){ int NUM=m=read(); for (int i=1;i<=m;i++) u[i]=st[i]=read(),bo[u[i]]=1; sort(st+1,st+1+m,cmp); for (int i=1;i<m;i++) st[++NUM]=lca(st[i+1],st[i]);st[++NUM]=1; sort(st+1,st+1+NUM,cmp);top=0; for (int i=1;i<=NUM;i++) if (st[i]!=st[i-1]){ _l[st[i]]=0; while (top&&(df[ST[top]]>df[st[i]]||lo[ST[top]]<df[st[i]])) top--; _in(ST[top],st[i]);ST[++top]=st[i]; } DFS(1);DDFS(1,0,1e9);_DFS(1); for (int i=1;i<=m;i++) printf("%d ",D[u[i]]);puts(""); for (int i=1;i<=m;i++) bo[u[i]]=0; }
拉格朗日乘数法
求f(x,y,z)在g(x,y,z)=0的情况下的极值:对F(x,y,z,λ)=f(x,y,z)+λg(x,y,z)各变量求偏导,导函数为0,联立解方程即可。
莫队算法
带修改莫队:$(\lfloor\frac l {S_1}\rfloor, \lfloor\frac r {S_2}\rfloor, t)$
树上莫队:$(\mathrm{blockID}(u), \mathrm{dfn}(v))$或括号序列
树上带修改莫队:$(\mathrm{blockID}(u),\mathrm{blockID}(v),t)$
消圈算法
网络里有负圈,就平白无故给这个圈循环流一下,即使没有起点到终点的流经过也行
SAM
上下界网络流
起点连到每个点流量入边下界之和,每个点连到终点出边下界之和
有源汇的连(T,S,inf)变成无源汇,从超级源汇跑一次得可行流,要最大或最小就再从本来的源汇跑一下。