【模板】各类我会的傻逼算法模板合集(建设中

如果模板有误请杀了我

好了结束了可以关掉了

最大流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\n",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);
    }
}

posted @ 2016-12-23 22:40 zhouyis 阅读(...) 评论(...) 编辑 收藏