博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

省选前总结

主要是给自己的,一些易忘知识点的总结吧。

 

 

 

 

Tarjan求桥及割点

割点:根的有俩儿子就是割点,其他的点如果子树中有儿子连接不到它祖先那里去就是割点(即存在low[son[u]]>=dfn[u])。

桥:结点u的子结点v的后代通过反向边只能连回v(low[v]>dfn[u])。

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);
}
View Code

 

 

 

 

 

拓展欧几里得

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;
}
View Code

 

 

 

 

大模数乘法

inline ll cc(ll x,ll y){
    x=x*y-(ll)(((ld)x*y+0.01)/M)*M;
    return x<0?x+M:x;
}
View Code

 

 

 

 

 

FFT板纸

    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:

(A , B) -> (A+B*W , A-B*W)
FFT
(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)
FWTxor
(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)
FWTand
(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)
FWTor

 

 

 

 

 

 

辛普森积分系数

$\frac{1}{6}$   $\frac{4}{6}$   $\frac{1}{6}$

 

 

 

 

 

 

虚树

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;
}
View Code

 

 

 

 

 

 

拉格朗日乘数法

求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)变成无源汇,从超级源汇跑一次得可行流,要最大或最小就再从本来的源汇跑一下。

posted @ 2017-04-25 16:22  swm_sxt  阅读(235)  评论(0编辑  收藏  举报