zoukankan      html  css  js  c++  java
  • 【模板】各类我会的傻逼算法模板合集(建设中

    如果模板有误请杀了我

    好了结束了可以关掉了

    最大流dinic

    const int M=100005,N=2*1234;
    struct edge{
        int to,next,cap;
    }e[M];
    int cnt=1,last[N],h[N];
    void insert(int a,int b,int c){
        e[++cnt]=(edge){b,last[a],c};last[a]=cnt;
        e[++cnt]=(edge){a,last[b],c};last[b]=cnt; 
    }
    bool bfs(int s,int t){
        memset(h,-1,sizeof(h));
        queue<int>q;
        q.push(s);h[s]=0;
        while(!q.empty()){
            int c=q.front();q.pop();
            for(int i=last[c];i;i=e[i].next){
                if(e[i].cap&&h[e[i].to]==-1){
                    h[e[i].to]=h[c]+1;
                    q.push(e[i].to);
                }
            }
        }
        return h[t]^(-1);
    }
    int dfs(int x,int t,int f){
        if(x==t)return f;
        int used=0,w=0;
        for(int i=last[x];i;i=e[i].next){
            if(h[e[i].to]==h[x]+1){
                w=dfs(e[i].to,t,min(f-used,e[i].cap));
                e[i].cap-=w;
                e[i^1].cap+=w;
                used+=w;
                if(used==f)
                    return f;
            }
        }
        if(!used)h[x]=-1;
        return used;
    }
    int dinic(int s,int t){
        int ans=0;
        while(bfs(s,t)){
            int flow=dfs(s,t,inf);
            ans+=flow;
            if(ans>=inf)return ans; 
        }
        return ans;
    }

    FFT

    struct cpx {
        double r,i;
        cpx(double real=0.0,double image=0.0) {r=real;i=image;}
        cpx operator +(const cpx w) {return cpx(r+w.r,i+w.i);}
        cpx operator -(const cpx w) {return cpx(r-w.r,i-w.i);}
        cpx operator *(const cpx w) {return cpx(r*w.r-i*w.i,r*w.i+i*w.r);}
    };
    cpx a[N],b[N];
    cpx epsilon[N],arti_epsilon[N];
    void init_epsilon(int n){
        double pi=acos(-1);
        for(int i=0;i!=n;i++){
            epsilon[i]=cpx(cos(2.0*pi*i/n),sin(2.0*pi*i/n)); 
            //arti_epsilon[i]=conj(epsilon[i]);
            arti_epsilon[i]=cpx(cos(2.0*pi*i/n),-sin(2.0*pi*i/n));
        }
    }
    void rev(int n,cpx*t){
        for(int i=0,j=0;i!=n;i++){
            if(i>j)swap(t[i],t[j]);
            for(int l=n/2;(j^=l)<l;l>>=1);
        }
    }
    void dft(int n,cpx*x,cpx*w){
        rev(n,x);
        for(int i=2;i<=n;i<<=1){
            int m=i/2;
            for(int j=0;j<n;j+=i){
                for(int k=0;k!=m;k++){
                    cpx t=x[j+m+k]*w[n/i*k];
                    x[j+m+k]=x[j+k]-t;
                    x[j+k]=x[j+k]+t;
                }
            }
        }
    }
    cpx c[N]; 
    void mul(cpx *a,cpx *b){
        int A,B;
        A=gi;B=gi;++A,++B;
        for(int i=0;i<A;i++)a[i].r=gi;
        for(int i=0;i<B;i++)b[i].r=gi;
        int t=max(A,B);
        int n=1;
        for(;n<t*2;n<<=1);
        init_epsilon(n);
        dft(n,a,epsilon);
        dft(n,b,epsilon);
        // py trade
        for(int i=0;i<n;i++)c[i]=a[i]*b[i];
        int nn=n;cout<<n;
        dft(n,c,arti_epsilon);
        for(int i=0;i<=A+B-1;i++)printf("%d ",(int)(c[i].r/nn+0.5));
    }

    树剖

    namespace slpf{
        #define N 123456
        #define M 223456
        struct edge{
            int to,next;
        }e[M];int rt,cnt,last[N],top[N],siz[N],dep[N],fa[N],son[N],id[N],hp[N],idcnt=0,hpcnt=0;
        void insert(int a,int b){
            e[++cnt]=(edge){b,last[a]};
            last[a]=cnt;
        }
        void dfs1(int x){
            siz[x]=1;
            for(int i=last[x];i;i=e[i].next){
                int j=e[i].to;
        //        fa[j]=x;
                dep[j]=dep[x]+1;
                dfs1(j);
                if(siz[j]>siz[son[x]])son[x]=j;
            }
        }
        void dfs2(int x,int t){
            top[x]=t;id[++idcnt]=x;hp[x]=idcnt;
            if(son[x])dfs2(son[x],t);
            for(int i=last[x];i;i=e[i].next)
                if(e[i].to!=son[x])dfs2(e[i].to,e[i].to);
            
        }
        int tiao(int x,int d){
            for(;fa[top[x]]&&dep[fa[top[x]]]>=d;x=fa[top[x]]);
            return id[hp[x]-dep[x]+d];
        }
        int lca(int a,int b){
            int f1=top[a],f2=top[b];
            while(f1!=f2){
                if(dep[f1]<dep[f2])
                swap(f1,f2),swap(a,b);
                a=fa[f1];
                f1=top[a];
            }
            return dep[a]>dep[b]?b:a;
        }
        void debug(){
            memset(dep,0,sizeof(dep));idcnt=0;
            memset(last,0,sizeof(last));cnt=0;
            memset(son,0,sizeof(son));memset(fa,0,sizeof(fa));
            memset(siz,0,sizeof(siz));
            int n=gi;
            for(int i=1;i<n;i++){
                int a=gi,b=gi;
                insert(a,b);
                fa[b]=a;
            } 
            int rat=1;
            while(fa[rat])rat=fa[rat];
            rt=rat;
            dfs1(rt);
            dfs2(rt,rt);
        printf("%d
    ",lca(gi,gi));
        };
    }

    计算几何(只有凸包,未完成

    const double eps=1e-8;
    int cmp(double x){
        if(fabs(x)<eps)return 0;
        if(x>0)return 1;
        return -1;
    } 
    struct point{
        double x,y;
        point(){
        }
        point(double a,double b):x(a),y(b){}
        void input(){
            scanf("%lf%lf",&x,&y);
        }
        friend point operator+(point a,point b){return point(a.x+b.x,a.y+b.y);}
        friend point operator-(point a,point b){return point(a.x-b.x,a.y-b.y);}
        friend point operator*(point a,double b){return point(a.x*b,a.y*b);}
        friend point operator*(double a,point b){return point(a*b.x,a*b.y);} 
        friend bool operator==(point a,point b){return !cmp(a.x-b.x)&&!cmp(a.y-b.y);}
        double norm(){return sqrt(x*x+y*y);}
    };
    double det(point a,point b){return a.x*b.y-a.y*b.x;}
    double dot(point a,point b){return a.x*b.x+a.y*b.y;}
    double dist(point a,point b){return (a-b).norm();}
    struct line{
        point a,b;
        line(point x,point y):a(x),b(y){}
    };
    struct convex{
        vector<point>P;
        convex(int Size=0){P.resize(Size);} 
    };
    bool lss(point a,point b){
        return cmp(a.x-b.x<0)||(cmp(a.x-b.x)==0&&cmp(a.y-b.y)<0); 
    }
    // checked by poj 1113
    convex Graham(vector<point> a){
        convex res(2*a.size()+5);
        sort(a.begin(),a.end(),lss);
        a.erase(unique(a.begin(),a.end()),a.end());
        int m=0;
        for(int i=0;i<a.size();i++){
            while(m>1&&cmp(det(res.P[m-1]-res.P[m-2],a[i]-res.P[m-2]))<=0)--m;
            res.P[m++]=a[i];
        }
        int k=m;//上凸壳大小 
        for(int i=a.size()-2;i>=0;i--){
            while(m>k&&cmp(det(res.P[m-1]-res.P[m-2],a[i]-res.P[m-2]))<=0)--m;
            res.P[m++]=a[i];
        }
        res.P.resize(m-(a.size()>1));
        return res;
    }
    void debug(){
        int n,L;
        n=gi;
        vector<point>a(n);
        for(int i=0;i<a.size();i++){
            a[i].input();
        }
    }

    SA

    #define N 400005
    struct Suffix_Array{
        int s[N],sa[N],rk[N],SA[N],RK[N],v[N],h[N],len;
        int mn[N][19],lg[N];
        void mul(int k,int *sa,int *rk,int *SA,int *RK){
            for(int i=1;i<=len;i++) v[rk[sa[i]]]=i;
            for(int i=len;i;i--) if(sa[i]>k) SA[v[rk[sa[i]-k]]--]=sa[i]-k;
            for(int i=len-k+1;i<=len;i++) SA[v[rk[i]]--]=i;
            for(int i=1;i<=len;i++) 
                RK[SA[i]]=RK[SA[i-1]]+(rk[SA[i]]!=rk[SA[i-1]]||rk[SA[i-1]+k]!=rk[SA[i]+k]);
        }
        void get_sa(int lim){
            for(int i=1;i<=len;i++) v[s[i]]++;
            for(int i=1;i<=lim;i++) v[i]+=v[i-1];
            for(int i=1;i<=len;i++) sa[v[s[i]]--]=i;
            for(int i=1;i<=len;i++) rk[sa[i]]=rk[sa[i-1]]+(s[sa[i-1]]!=s[sa[i]]);
            for(int k=1;k<=len;k<<=1) {
                mul(k,sa,rk,SA,RK);;
                memcpy(sa,SA,len+1<<2);
                memcpy(rk,RK,len+1<<2);
            }
            for(int k=0,j,i=1;i<=len;i++){
                j=sa[rk[i]-1];
                while(s[j+k]==s[i+k]) k++;
                h[rk[i]]=k;if(k) k--;
            }
            for(int i=1;i<=len;i++) mn[i][0]=h[i];
            for(int j=1;(1<<j)<=len;j++) {
                for(int i=1;i+(1<<j)-1<=len;i++)
                    mn[i][j]=min(mn[i][j-1],mn[i+(1<<j-1)][j-1]);
            }
            for(int i=2;i<=len;i++) lg[i]=lg[i>>1]+1;
        }
        int get_mn(int l,int r){
            int t=lg[r-l+1];
            return min(mn[l][t],mn[r-(1<<t)+1][t]);
        }
        int lcp(int x,int y){
            if(x>y) swap(x,y);
            return get_mn(x+1,y);
        }
    }

  • 相关阅读:
    VS2013 使用QCustomPlot等三方库如何配置
    error LNK1112:模块计算机类型"X64" 与目标计算机类型"X86" 冲突
    Qt 获取屏幕当前分辨率
    流程控制
    导航条和工作内容纪要
    js简介
    高度塌陷
    浮动
    文档流
    display和overflow
  • 原文地址:https://www.cnblogs.com/chouti/p/6216319.html
Copyright © 2011-2022 走看看