zoukankan      html  css  js  c++  java
  • 省选前总结

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

    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,联立解方程即可。

    莫队算法

    带修改莫队:$(lfloorfrac l {S_1} floor, lfloorfrac r {S_2} floor, t)$

    树上莫队:$(mathrm{blockID}(u), mathrm{dfn}(v))$或括号序列

    树上带修改莫队:$(mathrm{blockID}(u),mathrm{blockID}(v),t)$

    消圈算法

    网络里有负圈,就平白无故给这个圈循环流一下,即使没有起点到终点的流经过也行

    SAM

    上下界网络流

    起点连到每个点流量入边下界之和,每个点连到终点出边下界之和

    有源汇的连(T,S,inf)变成无源汇,从超级源汇跑一次得可行流,要最大或最小就再从本来的源汇跑一下。

  • 相关阅读:
    CWinApp类 功能
    CreateCompatibleBitmap
    CreateCompatibleDC CreateCompatibleBitmap SelectObject详解
    Linux学习_菜鸟教程_4
    Linux学习_菜鸟教程_1
    Linux学习_菜鸟教程_2
    Linux学习_菜鸟教程_3
    MATLAB生成正弦波
    03补件处理流程
    对数据库中所有的表进行操作
  • 原文地址:https://www.cnblogs.com/Enceladus/p/6762740.html
Copyright © 2011-2022 走看看