模板库

· · 个人记录

目录

点击即可跳转到对应部分

最大流 费用流 快读快写 多项式/二次剩余

平衡树(替罪羊结构体版)

最短路dij 最短路spfa(带负环)

RMQ 2-SAT LCT+并查集

数论 对拍库 矩阵(乘法/方程/行列式)

网络最大流

#include<iostream>
#include<cstdio>
using namespace std;
#define For(u,i,v) for(int i=head[u],v=tu[i].v;i;i=tu[i].ne,v=tu[i].v)
typedef long long liu;
struct bian{
    liu f;int ne,v;
};
const int N=100000,M=1000000;
bian tu[M];int we=1;
int head[N];
int des[N],gap[N];
int qi,zo;liu ans;
void out(){
    for(int o=1;o<=9;o++){cout<<o<<" : ";
        For(o,i,v){cout<<v<<","<<tu[i].f<<" ";}cout<<endl;}}
void clear(int le){ans=0;
    for(int i=1;i<=le;i++){des[i]=gap[i]=0;}
}
void cclear(int le){
    for(int i=1;i<=we;i++){tu[i].v=tu[i].f=tu[i].ne=0;}
    we=1;for(int i=1;i<=le;i++)head[i]=0;
}
int bfs(){static int l[N];
    int h=0,w=0;l[w++]=zo;
    while(w>h){
        int u=l[h];h++;
        For(u,i,v){
            if(tu[i^1].f==0)continue;
            if(des[v]||v==zo)continue;
            gap[des[v]=des[u]+1]++;l[w++]=v;
        }
    }return des[qi]!=0;
} 
liu dfs(int w,liu f){
    if(w==zo){ans+=f;return f;}int uo=f;
    For(w,i,v){
        if(tu[i].f==0)continue;
        if(des[v]!=des[w]-1)continue;
        int o=dfs(v,min(f,tu[i].f));
        if(o==0)continue;
        f-=o;tu[i].f-=o;tu[i^1].f+=o;
        if(f==0)return uo;
    }
    --gap[des[w]]?++gap[++des[w]]:des[qi]=-9999;
    return uo-f;
} 
liu ISAP(int qii,int zoo){
    clear(zoo+2);
    qi=qii;zo=zoo;
    if(!bfs())return 0;
    while(des[qi]>=0){
        dfs(qi,1e9);
    }return ans;
}
void add(int u,int v,int f){
    tu[++we].ne=head[u];head[u]=we;tu[we].v=v;tu[we].f=f;
    tu[++we].ne=head[v];head[v]=we;tu[we].v=u;tu[we].f=0;
} 
int in[N],ou[N];
void more(int u,int v,int f1,int f2){
    add(u,v,f2-f1);in[v]+=f1;ou[u]+=f1;
}
int getans(int n,int qi,int zo){
    int op=0;
    for(int i=1;i<=n;i++){
        int k=in[i]-ou[i];
        if(k==0)continue;
        else if(k>0){
            op+=k;add(n+1,i,k);
        }else add(i,n+2,-k);    
        in[i]=ou[i]=0;
    }add(zo,qi,1e9);if(ISAP(n+1,n+2)!=op){cclear(n+2);return -1;}
    head[qi]=tu[head[qi]].ne;head[zo]=tu[head[zo]].ne;
    int po=ISAP(qi,zo);cclear(n+2);return op+po;
}

dinic

#include<iostream>
#define For(u,v,i) for(int i=he[u],v=t[i].v;i;i=t[i].ne,v=t[i].v)
using namespace std;
struct bian{
    int ne,v,f;
}t[1000000];
int qi,zo;
const int N=100000;
int d[N],ga[N],l[N],he[N],mk[N],we=1,tib=0;
void add(int u,int v,int f){
    t[++we].ne=he[u];he[u]=we;t[we].v=v;t[we].f=f;
    t[++we].ne=he[v];he[v]=we;t[we].v=u;t[we].f=0;
}
void out(int n){
    for(int j=1;j<=n;j++){cout<<j<<" :: ";
        For(j,v,i)cout<<v<<","<<t[i].f<<"  ";cout<<endl;
    }
}
bool bfs(){tib++;
    int w=0,h=0;l[w++]=zo;mk[zo]=tib;
    while(w>h){
        int u=l[h];h++;
        For(u,v,i){
            if(mk[v]==tib)continue;
            if(t[i^1].f){
                mk[v]=tib;
                ga[d[v]=d[u]+1]++;l[w++]=v;
            }
        }
    }return mk[qi]==tib;
}
int ans=0;
int dfs(int w,int f){
    if(w==zo){ans+=f;return f;}
    int uf=f;
    For(w,v,i){
        if(d[v]!=d[w]-1||t[i].f==0)continue;
        int o=dfs(v,min(f,t[i].f));
        if(o){f-=o;t[i].f-=o;t[i^1].f+=o;if(f==0)return uf;}
    }
    return uf-f;
}
int Dinic(){
    while(bfs())dfs(qi,1e9);return ans;
}
int main(){
    int n,m;cin>>n>>m>>qi>>zo;
    for(int i=1;i<=m;i++){
        int a1,a2,a3;cin>>a1>>a2>>a3;add(a1,a2,a3);
    }
    cout<<Dinic();return 0;
}

最小费用最大流

#include<iostream>
#include<vector>
#define For(u,v,i) for(int i=he[u],v=t[i].v;i;v=t[i=t[i].ne].v) 
using namespace std;
typedef long long ll; 
struct bian{
    int u,v,ne;ll f,l;
};
const int N=100000,M=1000000;
bian t[M];
int he[N],l[N],p[N],we=1,qi,zo,in[N];
ll d[N],o[N];
ll inf=1e18;
void more(int u,int v,ll l,ll f){
    t[++we].ne=he[u];he[u]=we;t[we].u=u;t[we].v=v;t[we].l=l;t[we].f=f;
}
void add(int u,int v,ll l,ll f){more(u,v,l,f);more(v,u,0,-f);}
void out(int n){
    for(int p=1;p<=n;p++){cout<<p<<"::";
        For(p,v,i){
            cout<<v<<","<<t[i].l<<","<<t[i].v<<"  ";
        }cout<<endl;
    }
}
bool spfa(int n){
    int w=0,h=0;l[w++]=qi;in[qi]=1;
    for(int i=1;i<=n;i++){d[i]=inf*2;p[i]=o[i]=0;}o[qi]=inf;d[qi]=0;
    while(w>h){
        int u=l[h];h++;in[u]=0;
        For(u,v,i){
            if(t[i].l==0)continue;
            if(d[v]>d[u]+t[i].f){
                d[v]=d[u]+t[i].f;o[v]=min(o[u],t[i].l);p[v]=i;
                if(in[v]==0){in[v]=1;l[w++]=v;}
            }
        }
    }return o[zo];
}
ll ans,ansf;
void run(int n){
    ans=ansf=0;
    while(spfa(n)){
        ans+=o[zo];ansf+=o[zo]*1LL*d[zo];
        for(int i=p[zo];i;i=p[t[i].u]){
            t[i].l-=o[zo];t[i^1].l+=o[zo];
        }
    }
}
inline int read(){
    int x=0,f=1;char a1=getchar();while(a1<'0'||a1>'9'){if(a1=='-')f=-f;a1=getchar();}
    while(a1>='0'&&a1<='9'){x=x*10+(a1^48);a1=getchar();}return x*f;
}
int main(){

}

spfa+dij

#include<iostream>
#include<queue>
#define For(u,v,i) for(int i=he[u],v=t[i].v;i;v=t[i=t[i].ne].v)
using namespace std;
const int N=60000,M=1000000;
struct bian{
    int u,v,f,l,ne;
};bian t[M];
int d[N],p[N],he[N],o[N],hw[N],we=1,l[M],qi,zo,in[N];
void add(int u,int v,int l,int f){
    t[++we].ne=he[u];he[u]=we;t[we].u=u;t[we].v=v;t[we].l=l;t[we].f=f;
    t[++we].ne=he[v];he[v]=we;t[we].u=v;t[we].v=u;t[we].l=0;t[we].f=-f;
} 
int spfa(int n){
    int h=0,w=0;l[w++]=qi;
    for(int i=1;i<=n;i++){d[i]=2e9;o[i]=0;}d[qi]=0;in[qi]=1;o[qi]=2e9;
    while(w>h){
        int u=l[h];h++;in[u]=0;
        For(u,v,i){
            if(t[i].l==0)continue;
            if(d[u]+t[i].f<d[v]){
                o[v]=min(o[u],t[i].l);d[v]=d[u]+t[i].f;p[v]=i;
                if(in[v]==0){in[v]=1;l[w++]=v;}
            }
        }
    }
    return o[zo];
}struct rot{int h,d;};
bool operator < (rot a,rot b){return a.d>b.d;} 
priority_queue<rot> e;
int dij(int n){e.push(rot{qi,0});
    for(int i=1;i<=n;i++){d[i]=2e9;o[i]=0;in[i]=0;}d[qi]=0;o[qi]=2e9;
    for(int te=1;te<=n;te++){
        while(!e.empty()&&in[e.top().h])e.pop();
        if(e.empty())break;
        int u=e.top().h;e.pop();in[u]=1;
        For(u,v,i){
            if(in[v]||t[i].l==0)continue;
            int le=t[i].f+hw[u]-hw[v];
            if(d[u]+le<d[v]){
                o[v]=min(o[u],t[i].l);d[v]=d[u]+le;p[v]=i;
                e.push(rot{v,d[v]}); 
            }
        }
    }while(!e.empty())e.pop();
    return o[zo];
}
int ans,ansf;
void ask(int n){ans=ansf=0;
    if(!spfa(n))return;do{
        ans+=o[zo];ansf+=o[zo]*1LL*(d[zo]+hw[zo]-hw[qi]);
        for(int i=1;i<=n;i++)hw[i]+=d[i];
        for(int u=zo,i=p[u];u!=qi;i=p[u=t[i].u]){
            t[i].l-=o[zo];t[i^1].l+=o[zo];
        }
    }while(dij(n));
}
void clear(int n){
    we=1;for(int i=1;i<=n;i++){he[i]=in[i]=p[i]=hw[i]=0;}
}

FASTIO


inline char gc() {
    static char buf[1048576], *p1, *p2;
    return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1048576, stdin), p1 == p2) ? EOF : *p1++;}

inline int read() {
    char c = gc(); int r = 0;
    for (; c < '0' || '9' < c; c = gc());for (; '0' <= c && c <= '9'; c = gc()) r = r * 10 + (c - '0');return r;}
inline int read(){
    int x=0,f=1;char a1=getchar();while(a1<'0'||a1>'9'){if(a1=='-')f=-f;a1=getchar();}
    while(a1>='0'&&a1<='9'){x=x*10+(a1^48);a1=getchar();}return x*f;}
inline void write(int a){
    if(a<0){putchar('-');a=-a;}if(a==0){putchar('0');return;}
    int z=0,k=0;while(a){z=(z*10)+a%10;a/=10;k++;}while(k--){putchar('0'+(z%10));z/=10;}}

typedef long long ll;
inline long long read(){
    long long x=0,f=1;char a1=getchar();while(a1<'0'||a1>'9'){if(a1=='-')f=-f;a1=getchar();}
    while(a1>='0'&&a1<='9'){x=x*10+(a1^48);a1=getchar();}return x*f;}
inline void write(ll a,int ok=1){
    if(a<0){putchar('-');a=-a;}if(a==0)putchar('0');else
    {unsigned long long z=0,k=0;while(a){z=(z*10)+a%10;a/=10;k++;}while(k--){putchar('0'+(z%10));z/=10;}}if(ok==1)putchar('\n');else if(ok==2)putchar(' ');}

write自带换行,附加参数0取消,2改为空格

多项式全家桶

压行了,但在后面有说明(也就不到100行)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#define clr(i,k) memset(i,0,sizeof(int)*(k))
#define cpy(i,j,k) memcpy(i,j,sizeof(int)*(k))
#define mu 998244353
#define getln int ln=1;while(ln<n)ln<<=1;
#define getmi int mi=(l+r)/2;
#define add1(e,f) e+=f;if(e>=mu)e-=mu;
#define add2(e,f) e-=f;if(e<0)e+=mu;
using namespace std;typedef long long ll;
int kpow(ll a,int b=mu-2){ll ans=1;while(b){if(b&1)ans=ans*a%mu;a=a*a%mu;b>>=1;}return ans;} 
////////////////////////////////
ll ci;struct comp{
    ll a,i;comp operator *(comp b){return (comp){(a*b.a+i*b.i%mu*ci)%mu,(a*b.i+i*b.a)%mu};}
    comp operator %(int b){return (comp){a%b,i%b};}};
comp kpow(comp a,ll b){comp ans=(comp){1,0};while(b){if(b&1)ans=ans*a%mu;a=a*a%mu;b>>=1;}return ans;}
bool fang(int n){return kpow(n,(mu-1)/2)==1;}
int msqrt(int n){if(n<=0)return n;if(!fang(n))return -1;ll a;do{a=rand()*1LL*rand()+1;a%=mu;ci=(a*1LL*a-n+mu)%mu;
    }while(fang(ci));comp w=(comp){a,1};w=kpow(w,(mu+1)/2);int a1=w.a,a2=mu-a1;if(a1>a2)swap(a1,a2);return a1;}
////////////////////////////////
const int G=3,iG=kpow(G),N=1001000;
inline long long read(){
    long long x=0,f=1;char a1=getchar();while(a1<'0'||a1>'9'){if(a1=='-')f=-f;a1=getchar();}
    while(a1>='0'&&a1<='9'){x=x*10+(a1^48);a1=getchar();}return x*f;}
inline void write(ll a,int ok=1){
    if(a<0){putchar('-');a=-a;}if(a==0)putchar('0');else
    {ll z=0,k=0;while(a){z=(z*10)+a%10;a/=10;k++;}while(k--){putchar('0'+(z%10));z/=10;}}
    if(ok==1)putchar('\n');else if(ok==2)putchar(' ');}   
void print(int a[],int n){for(int i=0;i<n;i++)write(a[i],2);putchar('\n');}
int mod_read(int m=mu){int x=0;char a1=getchar();while(a1<'0'||a1>'9')a1=getchar();
    while(a1>='0'&&a1<='9'){x=(x*10LL+(a1^48))%m;a1=getchar();}return x;}
int readp(int a[],int o=0){int n=(o?o:read());for(int i=0;i<n;i++)a[i]=read();return n; }
void NTT(int s[],int op,int n){
    static int las,r[N];getln;if(las!=ln){for(int i=1;i<ln;i++)r[i]=((r[i>>1]>>1)|(i&1?ln>>1:0));las=ln;}
    for(int i=0;i<ln;i++)if(i<r[i])swap(s[i],s[r[i]]);for(int i=1,i2=2;i<ln;i<<=1,i2<<=1){
        int u=kpow(op?G:iG,(mu-1)/i2);for(int j=0;j<ln;j+=i2){ll d=1;for(int l=j;l<j+i;++l){
                int tt=d*s[l+i]%mu;s[l+i]=s[l];add2(s[l+i],tt);add1(s[l],tt);d=d*u%mu;}}}
    if(op==0){int yu=kpow(ln);for(int i=0;i<n;i++)s[i]=s[i]*1LL*yu%mu;}}
void dot(int a[],int b[],int n){for(int i=0;i<n;i++)a[i]=a[i]*1LL*b[i]%mu;}
void times(int a[],int b[],int n,int m){n+=m;getln;NTT(a,1,n);NTT(b,1,n);dot(a,b,ln);NTT(a,0,ln);clr(a+n-1,ln);}
void invp(int s[],int n){
    getln;static int r[N],w[N],sa[N],sav[N];w[0]=kpow(s[0]);
    for(int i=1,i2=2;i<ln;i<<=1,i2<<=1){cpy(r,w,i);cpy(sa,s,i2);NTT(r,1,i2);cpy(sav,r,i2);NTT(sa,1,i2);dot(r,sa,i2);
        NTT(r,0,i2);clr(r,i);NTT(r,1,i2);dot(r,sav,i2);NTT(r,0,i2);for(int j=i;j<i2;j++){w[j]=2LL*w[j]-r[j]+mu;if(w[j]>=mu)w[j]-=mu;}
    }cpy(s,w,n);clr(r,ln<<1);clr(w,ln<<1);clr(sa,ln<<1);}
void fan(int a[],int n){for(int i=0;i<n/2;i++)swap(a[i],a[n-i-1]);} 
void div(int a[],int b[],int n,int m){
    static int w[N],r[N];getln;clr(w,ln<<1);clr(r,ln<<1);int yu=n-m+1;cpy(w,a,n);cpy(r,b,m);fan(a,n);fan(b,m);
    invp(b,yu);times(a,b,n,n);clr(b,ln<<1);cpy(b,r,m);clr(a+yu,ln<<1);fan(a,yu);clr(r,ln);cpy(r,a,yu);times(b,a,n,yu);
    for(int i=0;i<m-1;i++)b[i]=(w[i]-b[i]+mu)%mu;cpy(a,r,yu);clr(b+m-1,ln);}
int iv[N],ic[N],inid;
void init(int n,int ko=0){iv[0]=iv[1]=ic[0]=1;
    for(ll i=1;i<=n;i++)ic[i]=ic[i-1]*i%mu;for(int i=2;i<=n;i++)iv[i]=iv[mu%i]*1LL*(mu-mu/i)%mu;
    if(ko)for(int i=2;i<=n;i++)iv[i]=iv[i]*1LL*iv[i-1]%mu;inid=ko?0:n;}
void dao(int s[],int n){for(int i=1;i<n;i++)s[i-1]=s[i]*1LL*i%mu;s[n-1]=0;}
void jifen(int s[],int n){if(inid<n)init(n);for(int i=n-1;i;i--)s[i]=s[i-1]*1LL*iv[i]%mu;s[0]=0;}
void lnp(int s[],int n){static int o[N];cpy(o,s,n);dao(s,n);invp(o,n);times(s,o,n,n);jifen(s,n);clr(s+n,n<<1);getln;clr(o,ln<<1);}
void sqrtp(int s[],int n){
    getln;static int r[N],w[N],sa[N];w[0]=1;
    for(int i=1,i2=2;i<ln;i<<=1,i2<<=1){for(int j=0;j<i;j++){r[j]=w[j]*2;if(r[j]>=mu)r[j]-=mu;}invp(r,i2);
        cpy(sa,w,i2);NTT(sa,1,i2);dot(sa,sa,i2);NTT(sa,0,i2);for(int j=0;j<i2;j++){add1(sa[j],s[j]);}
        times(sa,r,i2,i2);clr(r,i2<<1);for(int j=i;j<i2;j++)w[j]=sa[j];clr(sa,i2<<1);
    }cpy(s,w,n);clr(r,ln<<1);clr(w,ln<<1);clr(sa,ln<<1);}
void expp(int s[],int n){
    getln;static int r[N],w[N];w[0]=1;for(int i=1,i2=2;i<ln;i<<=1,i2<<=1){cpy(r,w,i);clr(r+i,i2);lnp(r,i2);
    for(int j=0;j<i2;j++){r[j]=s[j]-r[j];add1(r[j],mu);}add1(r[0],1);times(w,r,i2,i2);clr(w+i2,i2);}cpy(s,w,n);clr(r,ln<<1);clr(w,ln<<1);}
void kpowp(int s[],int n,int k){lnp(s,n);for(int i=0;i<n;i++)s[i]=s[i]*1LL*k%mu;expp(s,n);}
void FDT(int s[],int n,int op){static int r[N];getln;if(op)for(int i=0;i<n;i++)r[i]=iv[i];
    else for(int i=0;i<n;i++)r[i]=(i&1)?(mu-iv[i]):iv[i];times(s,r,n,n);clr(r,ln<<1);clr(s+n,ln<<1);}
void FDTtimes(int a[],int b[],int n,int m){
    n+=m;init(n,1);FDT(a,n,1);FDT(b,n,1);for(int i=0;i<n;i++){a[i]=a[i]*1LL*b[i]%mu*ic[i]%mu;}FDT(a,n,0);}
const int UM=2;/*推荐2e7*/ int g[N],*f[N],*d[N],tmp[N],t[UM],*to=t,t2[UM],*to2=t;
void Cdtop(int w,int l,int r){
    if(l==r){f[w]=to;d[w]=to2;if(l==0){f[w][0]=d[w][0]=g[0];}
        else{f[w][1]=d[w][1]=g[l]*1LL*kpow(g[l-1])%mu;f[w][0]=d[w][0]=(mu-f[w][1])*1LL*(l-1)%mu;}   
        to+=5;to2+=5;return;};getmi;Cdtop(w*2,l,mi);Cdtop(w*2+1,mi+1,r);
    f[w]=to,d[w]=to2;int n=r-l+2;getln;cpy(tmp,f[w*2],mi-l+2);NTT(tmp,1,n);
    cpy(f[w],f[w*2+1],r-mi+1);NTT(f[w],1,n);dot(f[w],tmp,ln);NTT(f[w],0,ln);clr(f[w]+n,ln);
    cpy(d[w],d[w*2+1],r-mi+1);NTT(d[w],1,n);dot(d[w],tmp,ln);NTT(d[w],0,ln);
    for(int i=0;i<mi-l+2;i++){add1(d[w][i],d[w*2][i]);}to+=2*n;to2+=2*n;clr(tmp,ln<<1);}
void DtoP(int s[],int n){to=t;to2=t2;cpy(g,s,n);Cdtop(1,0,n-1);cpy(s,d[1],n);clr(t,to-t+10);clr(t2,to2-t2+10);}
void dcdq(int w,int l,int r){if(l==r){d[w]=to;d[w][0]=(mu-l)%mu;d[w][1]=1;to+=3;return;}getmi;
    dcdq(w*2,l,mi);dcdq(w*2+1,mi+1,r);d[w]=to;cpy(d[w],d[w*2],mi-l+2);cpy(tmp,d[w*2+1],r-mi+1);
    times(d[w],tmp,mi-l+2,r-mi+1);clr(tmp,4*(r-mi+1));to+=r-l+4;}
void Cptod(int w,int l,int r){if(l==r){tmp[l]=f[w][0];return;}getmi;
    f[w*2+1]=to2;to2+=4*(r-l+1);f[w*2]=to2;to2+=4*(r-l+1);
    cpy(f[w*2+1],f[w],r-l+1);cpy(f[w*2],d[w*2],r-l+1);
    div(f[w*2+1],f[w*2],r-l+1,mi-l+2);Cptod(w*2,l,mi);Cptod(w*2+1,mi+1,r);}
void PtoD(int s[],int n){to=t;f[1]=to2=t2;to2+=n+5;cpy(f[1],s,n);
    dcdq(1,0,n-1);Cptod(1,0,n-1);cpy(s,tmp,n);clr(t,to-t+10);clr(t2,to2-t2+10);} 
/* kpow(a,b) a^b%mu(省略b为逆元)                    msqrt(x) x的较小二次剩余         
read()::读ll    mod_read(m=mu)读一个数,边读边mod     write(a,ok=1)写一个ll,ok=1换行,2空格      print(a*,n)输出数组a前n个数 
readp(a*,n)读一个n项式,省略n时也读入n并返回n        NTT(a*,op,n)op=1为正0逆,a长n位             dot(a*,b*,n) 点乘a,b
times(a*,b*,n,m)a=a*b,NTT掉b                         invp(a*)a=a^-1                              fan(a*,n)  反转n项式a 
   div(a*,b*,n,m)a=a/b b=a%b                         init(n)预处理1-n的ic[x]=x!,ic[x]=x^1附带参数1使ic[x]=(x!)^-1  
dao(a*,n) jifen(a*n) 对a求导/积分                    lnp(a*,n) expp(a*,n) 求ln a/e^a             sqrtp(a*,n) 求a^0.5 
kpowp(a*,n,k) a=a^k 要求a[0]=1                       FDT(a*,n)求下降式a的EGF                     FDTtimes(a*,b*,n,m) 同times,但为下降式 
UM 转化下降式和多项式用,最好取2e7                   DtoP(a*,n)下降式转多项式                   PtoD(a*,n)多项式转下降式 */ 

替罪羊平衡树

#include<iostream>
#include<vector>
using namespace std;
const int N=1000000;
double A=0.75,B=0.3;
int zz[N],hea;
struct sheep{
    vector<int> s,f,g,b,si,c[2];
    int head,we=0;
    void out(int w){cout<<head<<"::\n";
        for(int i=1;i<=w;i++){
        cout<<i<<" : "<<s[i]<<" = "<<f[i]<<" "<<c[0][i]<<","<<c[1][i]<<" "<<si[i]<<" "<<g[i]<<" "<<b[i]<<endl;
        }
    }   
    void dfs(int w){if(w==0)return; 
        dfs(c[0][w]);if(si[w])zz[++hea]=w;dfs(c[1][w]);
    }
    int build(int fa,int l,int r){
        if(r<l)return 0;int mi=(l+r)/2,w=zz[mi];f[w]=fa;
        c[0][w]=build(w,l,mi-1);c[1][w]=build(w,mi+1,r);
        g[w]=si[w]+g[c[0][w]]+g[c[1][w]];b[w]=0;
        return w;
    }
    void recon(int x){
        hea=0;dfs(x);
    //  for(int i=1;i<=hea;i++)cout<<zz[i]<<" ";cout<<endl<<endl<<endl;
        if(f[x]==0)head=build(f[x],1,hea);
        else c[s[f[x]]<s[x]][f[x]]=build(f[x],1,hea);
    }
    void check(int x,int op){
        int w=x;hea=0;
        while(w){if(!op)b[w]++;w=f[w];zz[++hea]=w;}
        for(int i=hea-1;i;i--){
            w=zz[i];
            if(g[w]*B<b[w]||max(g[c[0][w]],g[c[1][w]])>g[w]*A){
                recon(w);return;
            }
        }
    }
    void insert(int x){
        if(s.size()<we+2){
            int u=s.size()*2+3;
            s.resize(u);c[0].resize(u);c[1].resize(u);f.resize(u);g.resize(u);b.resize(u);si.resize(u);
        }
        int w=head;int fa=-1;
        while(w){g[fa=w]++; 
            if(s[w]==x){si[w]++;return;}
            w=c[x>s[w]][w];
        };w=++we;f[w]=fa;s[w]=x;g[w]=si[w]=1;
        if(fa==-1){head=w;f[w]=0;}else c[x>s[fa]][fa]=w;
        check(w,1);
    }
    void del(int x){
        int w=head;
        while(w){
            g[w]--; 
            if(s[w]==x){check(w,--si[w]);break;}
            w=c[x>s[w]][w];
        };if(g[head]==0)head=0;
    }
    int getrank(int x){
        int w=head,ans=1;
        while(w){
            if(s[w]==x)return ans+g[c[0][w]];
            if(x>s[w]){ans+=g[c[0][w]]+si[w];w=c[1][w];}
            else w=c[0][w];
        }return ans;
    }
    int rankget(int x){
        int w=head;
        while(w){
            if(g[c[0][w]]>=x)w=c[0][w];
            else if(g[c[0][w]]+si[w]>=x)return s[w];
            else{x-=(g[c[0][w]]+si[w]);w=c[1][w];} 
        }
        return 0;
    }
    int qian(int x){return rankget(getrank(x)-1);}
    int hou(int x){return rankget(getrank(x+1));}
};
inline int read(){
    int x=0,f=1;char a1=getchar();while(a1<'0'||a1>'9'){if(a1=='-')f=-f;a1=getchar();}
    while(a1>='0'&&a1<='9'){x=x*10+(a1^48);a1=getchar();}return x*f;
}
sheep a;
int main(){

}

标准dij最短路

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int N=1000000;
vector<int> t[N],c[N];
int d[N],in[N];
struct rout{
    int h,d;
};bool operator < (rout a,rout b){return a.d>b.d;}
priority_queue<rout> tu; 
void add(int u,int v,int w){t[u].push_back(v);t[v].push_back(u);
c[u].push_back(w);c[v].push_back(w);
}void more(int u,int v,int w){t[u].push_back(v);c[u].push_back(w);}
int inf=((1LL<<31)-1);
int dij(int n,int u,int v){
    for(int i=1;i<=n;i++)d[i]=inf;d[u]=0;tu.push(rout{u,0});
    while(!tu.empty()){int u=tu.top().h;tu.pop();if(in[u])continue;
        in[u]=1;int pl=t[u].size();
        for(int i=0,v;i<pl;i++){v=t[u][i];
            if(!in[v]&&d[v]>d[u]+c[u][i])tu.push(rout{v,d[v]=d[u]+c[u][i]});
        }
    }return d[v];
}
int main(){

}

判负环spfa

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int N=1000000;
vector<int> t[N],c[N];
int d[N],l[N*15],in[N],al[N];
void add(int u,int v,int w){t[u].push_back(v);t[v].push_back(u);
c[u].push_back(w);c[v].push_back(w);
}void more(int u,int v,int w){t[u].push_back(v);c[u].push_back(w);}
int inf=((1LL<<31)-1);
bool spfa(int n,int u){
    int h=0,w=0;
    for(int i=1;i<=n;i++){d[i]=inf;al[i]=in[i]=0;}d[u]=0;l[w++]=u;
    while(w>h){int u=l[h];in[u]=0;h++;int pl=t[u].size();
        for(int i=0,v;i<pl;i++){v=t[u][i];
            if(d[v]>d[u]+c[u][i]){
                d[v]=d[u]+c[u][i];if(in[v])continue;in[v]=1;
                if(++al[v]>=n)return 1;l[w++]=v;
            }
        }
    }return 0;
}
void clear(int n){for(int i=1;i<=n;i++){t[i].clear();c[i].clear();}}

int main(){

}

O(n--1)RMQ

结构体版:

#define rint register int
int lg[1000000],last;
struct RMQ{
    vector<int> b,ho,qi,ku;vector<vector<int> >st;
    void make(int n){if(n<=last)return;last=n;for(rint i=1,lo=0,ln=2;i<=n;i++){lg[i]=lo;if(i>=ln){lo++;ln<<=1;}}}
    void init(int a[],int n,int B){
        b.resize(n+2);ho.resize(n+2);qi.resize(n+2);ku.resize(n+2);make(n/B+10);st.resize(n/B+10);
        for(rint i=1,jo=1;jo<=n;i++){int ma=0;
            for(rint o=1;o<=B&&jo<=n;jo++,o++){b[jo]=a[jo];ku[jo]=i;ma=max(ma,a[jo]);}
            st[i].push_back(ma);
        }int zo=ku[n];
        for(rint i=1;(1<<i)<=zo;i++){
            int le=(1<<i)-1,h=1<<(i-1);
            for(rint j=1;j+le<=zo;j++)st[j].push_back(max(st[j][i-1],st[j+h][i-1]));
        }for(rint i=1;i<=n;i++)qi[i]=max((ku[i-1]!=ku[i]?0:qi[i-1]),a[i]);
        for(rint i=n;i;i--)ho[i]=max((ku[i+1]!=ku[i]?0:ho[i+1]),a[i]);}
    inline int ask(rint l,rint r){rint an=0,z=ku[l],y=ku[r];
        if(z==y){for(rint j=l;j<=r;j++)an=max(an,b[j]);return an;
        }else{z++;y--;if(z>y)return max(ho[l],qi[r]);
            rint o=lg[y-z+1];return max(max(ho[l],qi[r]),max(st[z][o],st[y-(1<<o)+1][o]));}}
};

非结构体

const int N=20000010,NB=10010;
int b[N],ho[N],qi[N];
int ku[N],st[NB][15];
int lg[NB];
#define rint register int
void init(int a[],int n,int B){
    for(rint i=1,jo=1;jo<=n;i++){
        int ma=0;
        for(rint o=1;o<=B&&jo<=n;jo++,o++){
            ku[jo]=i;ma=max(ma,a[jo]);
        }st[i][0]=ma;
    }int zo=ku[n];
    for(rint i=1;(1<<i)<=zo;i++){
        int le=(1<<i)-1,h=1<<(i-1);
        for(rint j=1;j+le<=zo;j++){
            st[j][i]=max(st[j][i-1],st[j+h][i-1]);
        }
    }
    for(rint i=1;i<=n;i++)qi[i]=max((ku[i-1]!=ku[i]?0:qi[i-1]),a[i]);
    for(rint i=n;i;i--)ho[i]=max((ku[i+1]!=ku[i]?0:ho[i+1]),a[i]);
    for(rint i=1,lo=0,ln=2;i<=zo;i++){lg[i]=lo;if(i>=ln){lo++;ln<<=1;}}
}
int ask(int a[],int l,int r){
    int an=0,z=ku[l],y=ku[r];
    if(z==y){
        for(rint j=l;j<=r;j++)an=max(an,a[j]);return an;
    }else{z++;y--;
        if(z>y)return max(ho[l],qi[r]);
        int o=lg[y-z+1];
        return max(max(ho[l],qi[r]),max(st[z][o],st[y-(1<<o)+1][o]));
    }
}

2-SAT模板

#include<iostream>
#include<vector>
using namespace std;
const int N=2100000;
vector<int> t[N];
void add(int a,int b){
    t[a].push_back(b);
}
#define Z(i,j) (((i)*2)-1+(j))
void add(int a,int b,int c,int d){
    if(a==c){
        if(b==d)add(Z(a,b^1),Z(a,b));
    }else {
        add(Z(a,b^1),Z(c,d));add(Z(c,d^1),Z(a,b));
    }
}
int lo[N],d[N],dfn,scc,sc[N],zz[N],hea,in[N];
void tarjan(int w){
    zz[++hea]=w;d[w]=lo[w]=++dfn;in[w]=1;
    int pl=t[w].size();
    for(int i=0,v;i<pl;i++){
        v=t[w][i];
        if(!d[v]){
            tarjan(v);lo[w]=min(lo[w],lo[v]);
        }else if(in[v])lo[w]=min(lo[w],d[v]);
    }
    if(d[w]==lo[w]){int v;scc++;
        do{sc[v=zz[hea--]]=scc;in[v]=0;}while(v!=w);
    }
}
int ans[N];
bool run(int n){
    for(int i=1;i<=2*n;i++){
        if(d[i]==0)tarjan(i);
    }
    for(int i=1;i<=2*n;i+=2){
        if(sc[i]==sc[i+1])return 0;
    }
    for(int i=2;i<=2*n;i+=2){
        ans[i/2]=(sc[i]<sc[i-1]);
    }return 1;
}
void clear(int n){
    for(int i=1;i<=2*n;i++){
        d[i]=lo[i]=sc[i]=in[i]=0;
    }hea=dfn=scc=0;
}

LCT加并查集

#include<iostream>
#include<algorithm>
#define rt(i) (s[f[i]][0]!=i&&s[f[i]][1]!=i)
using namespace std;
const int N=500002;
int f[N],s[N][2],v[N],q[N],x[N],fo[N];
void fan(int w){
    if(w==0)return;
    x[w]^=1;swap(s[w][0],s[w][1]);
}
void down(int w){
    if(x[w]){
        fan(s[w][0]);fan(s[w][1]);x[w]=0;
    }
}
void up(int w){
    v[w]=q[w];fo[w]=w;
    if(s[w][0]&&v[w]>v[s[w][0]])v[w]=v[s[w][0]],fo[w]=fo[s[w][0]];
    if(s[w][1]&&v[w]>v[s[w][1]])v[w]=v[s[w][1]],fo[w]=fo[s[w][1]];
}
void out(int n){
    for(int i=1;i<=n;i++){
        cout<<i<<" :: "<<f[i]<<" <"<<s[i][0]<<","<<s[i][1]<<"> "<<v[i]<<" "<<fo[i]<<" "<<q[i]<<endl;
    }
}
int opt=0;
void read(int &x){
    x=0;char a1=getchar();
    while(a1<'0'||a1>'9')a1=getchar();
    while(a1>='0'&&a1<='9'){
        x=x*10+(a1^48);a1=getchar();
    }
}
void zhuan(int w){
    if(f[w]==0)return;
    int fa=f[w],gr=f[fa],k=s[fa][1]==w,s2=s[w][!k];
    if(!rt(fa))s[gr][s[gr][1]==fa]=w;
    f[w]=gr;f[fa]=w;s[fa][k]=s2;s[w][!k]=fa;
    if(s2)f[s2]=fa;up(fa);
}
int z[N],he=0;
void splay(int w){
    int fa,gr=w;
    z[++he]=w;
    while(!rt(gr))z[++he]=gr=f[gr];
    while(he)down(z[he--]);
    while(!rt(w)){
        fa=f[w];gr=f[fa];
        if(!rt(fa))zhuan(((s[gr][1]==fa)^(s[fa][1]==w))?w:fa);
        zhuan(w);
    }
    up(w);
} 
void acc(int w){
    for(int so=0;w;w=f[so=w]){
        splay(w);s[w][1]=so;up(w);
    }
}
void make(int w){
    acc(w);splay(w);fan(w);
}
int find(int w){
    acc(w);splay(w);
    while(s[w][0]){down(w);w=s[w][0];}
    splay(w);
    return w;
}
int split(int x,int y){
    make(x);acc(y);splay(y);return f[x]==y;
}
void link(int x,int y){
    make(x);
    if(find(y)!=x)f[x]=y;up(y);
}
void cut(int x,int y){
    make(x);
    if(find(y)==x&&f[y]==x&&!s[y][0]){
        f[y]=s[x][1]=0;up(x);
    }//out();
}
void change(int w,int k){
    splay(w);q[w]=k;//up(w);
}
struct bian{
    int u,v,l;
};
bool cmp(bian a,bian b){
    return a.l<b.l; 
}
int fa[N];
int fin(int a){
    return fa[a]==a?a:fa[a]=fin(fa[a]);
}
bian t[N];
int annex(int a,int b){
    a=fin(a);b=fin(b);if(a==b)return 1;
    fa[a]=b;return 0;
}

数论全家桶

高度压行

#include<cmath>
#include<map>
#include<cstdio>
#include<algorithm>
#include<ctime>
using namespace std;
typedef long long ll;

inline ll read(){
    ll x=0,f=1;char a1=getchar();while(a1<'0'||a1>'9'){if(a1=='-')f=-f;a1=getchar();}
    while(a1>='0'&&a1<='9'){x=x*10+(a1^48);a1=getchar();}return x*f;}
inline void write(int a){
    if(a<0){putchar('-');a=-a;}if(a==0){putchar('0');return;}
    int z=0,k=0;while(a){z=(z*10)+a%10;a/=10;k++;}while(k--){putchar('0'+(z%10));z/=10;}}

ll gcd(ll a,ll b){if(a==0)return b;if(a<0)a=-a;ll t;while(b){t=a%b;a=b;b=t;}return a;}
ll exgcd(ll a,ll b,ll &x,ll &y){//ax+by=gcd(a,b);  return gcd(a,b)
    if(b==0){x=1;y=0;return a;}ll z=exgcd(b,a%b,y,x);y-=x*(a/b);return z;}
ll inv(ll a,ll p){if(p==1)return 1;ll a1,a2;exgcd(a,p,a1,a2);return (a1%p+p)%p;}
ll mul(ll a,ll b,ll m){//return a*b%m
    ll d=((long double)a/m*b+0.5);long long r=a*b-d*m;return r<0?r+m:r;}
ll kpow(ll a,ll b,ll p){//return a^b%m
    ll ans=1;if(p>1000000010)while(b){if(b&1)ans=mul(ans,a,p);a=mul(a,a,p);b>>=1;}
    else while(b){if(b&1)ans=ans*a%p;a=a*a%p;b>>=1;}return ans;}
bool merge(ll &x1,ll &p1,ll x2,ll p2){//s=x1(mod p1),s=x2(mod p2)-->s=x1(mod p1),no answer->1
    ll e=(x2-x1%p2+p2)%p2,k,o,z=exgcd(p1,p2,k,o),np=p1/z*p2;
    if(e%z)return 1;k=mul(k,e/z,np);x1=(x1+mul(p1,k,np))%np;p1=np;return 0;}
ll indef(ll a,ll b,ll c,ll &x,ll &y){//ax+by=c;  return gcd(a,b)(No solution->return 0)
    ll z=exgcd(a,b,x,y);if(c%z!=0)return 0;ll t=a/z;a=b/z;b=t;
    x*=c/z;y*=c/z;ll s=ceil((-x+1)/(double)a);x+=a*s;y-=b*s;return z;}
ll modef(ll a,ll c,ll p){//ax=c(mod p)return x;  (No solution->return -1)
    ll x=0,y=0;int e=indef(a,p,c,x,y);return e?x:-1;}
ll bsgs(ll a,ll c,ll p){//a^x=c(mod p)  (gcd(a,p)==1))return x;
    map<ll,ll> t;t.clear();ll u=sqrt(p-1)+1;ll k=1,e=1;
    for(ll i=0;i<u;i++,k=mul(k,a,p))t[mul(k,c,p)]=i+1;e=k;
    for(ll i=u;i<=p+u;i+=u,e=mul(e,k,p))if(t.count(e))return i-t[e]+1;return -999999;}
ll exbsgs(ll a,ll c,ll p){//a^x=c(mod p) return x;  (No solution->return a nagetive number)
    if(p==1)return a==c?0:-1000;if(c==1)return 0;if(!a)return (!c)?1:-1000;
    if(a==c)return 1;ll z=gcd(a,p);if(z==1)return bsgs(a,c,p);if(c%z)return -999999;
    c/=z;p/=z;c=mul(c,inv(a/z,p),p);return exbsgs(a%p,c,p)+1;}
    //不保证接下来的函数正确性
bool hack(ll n,ll p){ll t=n-1;while(!(t&1))t>>=1;ll bu=kpow(p,t,n);
    if(bu==1||bu==n-1)return 0;while((t<<=1)<n-1){bu=mul(bu,bu,n);if(bu==n-1)return 0;}return 1;}
bool ptest(ll n){//return [n is an prime]
    if(n<2)return 0;for(int i=2;i*i<=min(n,2000ll);i++)if(n%i==0)return 0;if(n<=2000)return 1;
    int pic[8]={2,3,5,7,13,19,61,233};for(int i=0;i<8;i++)if(hack(n,pic[i]))return 0;return 1;}
ll prho(ll n,int _th){//return one of n's factor
    const int lim=128;ll sa[lim+10]={};ll x1=(_th+1)%n,x2=mul(x1,x1,n)+_th;ll bu;int to=0;
    while(1){bu=mul(x1-x2,bu,n);sa[++to]=x1-x2;
        if(to==lim){if(gcd(n,bu)>1)break;to=0;}
        x1=mul(x1,x1,n)+_th;x2=mul(x2,x2,n)+_th;x2=mul(x2,x2,n)+_th;
    }for(int i=1;i<=to;i++){bu=gcd(n,sa[i]);if(bu>1)return bu;}return n;}
int sovfz(ll n,ll fz[]){
    if(n==1||ptest(n)){fz[1]=n;return 1;}ll z;
    int ce[15]={2,3,5,7,11,13,17,19,23,29,31,37,41,43};
    for(int i=0;i<14;i++)if(n%ce[i]==0){z=ce[i];goto jum;}
    z=prho(n,rand()%(n-1)+1);while(z==n)z=prho(n,rand()%(n-1)+1);
    jum:;int e=sovfz(z,fz);e+=sovfz(n/z,fz+e);return e;
}
int getfz(ll n,ll fz[]){int e=sovfz(n,fz);sort(fz+1,fz+e+1);e=unique(fz+1,fz+e+1)-fz;return e-1;}
ll getg(ll n,ll mu,int cnt,ll fz[]){
    for(int i=1;i<=n;i++){if(kpow(i,mu,n)!=1)continue;
        for(int j=1;j<=cnt;j++){if(kpow(i,mu/fz[j],n)==1)goto out; }return i;out:;}return 0;}
ll mu(ll n,ll fz[],int cnt){if(n==1)return 0;ll ans=1;//return miu(n)
    for(int i=1;i<=cnt;i++){ans*=fz[i]-1;n/=fz[i];while(n%fz[i]==0){n/=fz[i];ans*=fz[i];}}return ans;}
ll getord(ll n,ll p,ll mu,ll fz[],ll cnt){
    ll ans=1;for(int i=1;i<=cnt;i++){ll sav=mu;int c=0;while(sav%fz[i]==0){sav/=fz[i];c++;}
        for(ll x=1;c;x*=fz[i],c--){if(kpow(n,sav*x,p)>1)ans*=fz[i];}
    }return ans;
}

自动对拍机

使用方式是将你的程序my.cpp,标程std.cpp,自动生成器gen.cpp,测试器(名字无关紧要)放入一个文件夹,编译前三个,运行测试器即可

自动测试器

#include<iostream>
#include<windows.h>
#include<ctime>
using namespace std;
int main(){int k=0;
    while(1){cerr<<"generating-->";
        system("gen.exe");cerr<<"running yours-->";//生成器 
        system("my.exe < ask.in > ask.out");cerr<<"running std-->";//程序 
        system("std.exe < ask.in > ask.ans");cerr<<"OK!"<<endl;//std 
        int p=system("fc ask.out ask.ans");
        if(p==1){
            return 0;
        }else cout<<++k<<" "<<clock()<<endl;
    }
}

生成询问

#include<iostream>
#include<ctime>
#include<cstdlib>
#include<cstdio>
#include<fstream>
using namespace std;
long long e9=1e9,la;
unsigned int rran(){return la^=((rand()^rand())*rand())^rand()%e9;}
int ran(int a){return rran()%a+1;}//return 1-a
int main(){
    srand(time(NULL)+clock());
    ifstream sdin("seed.txt");sdin>>la; 
    ofstream sdout("seed.txt");sdout<<rran(); 

    ofstream cout("ask.in");
    //在这行之后写生成数据的代码
    int n;cout<<n<<endl;
    for(int i=1;i<=n;i++)
    //......
    return 0; 
} 

矩阵全家桶

#include<iostream>
#include<vector>
#include<cstdio>
#define num long long
#define abs(a) (((a)<0)?(-(a)):(a))
using namespace std;

num mu;
const int nu=1001;
struct matrix{
    vector<vector<num> > t;
    num x,y;
    void resi(int a,int b){
        t.clear();
        x=a;y=b;
        t.resize(a+1);
        for(int i=1;i<=a;i++){
            t[i].resize(b+1);
        }
    }
    void read(int a,int b){
    //  resi(a,b);
        for(int i=1;i<=a;i++){
            for(int j=1;j<=b;j++){
                cin>>t[i][j];
            }
        } 
    } 
    void out(){
        for(int i=1;i<=x;i++){
            for(int j=1;j<=y;j++){
                cout<<t[i][j]<<" ";
            }cout<<endl;
        } 
    } 
    void swp(int a,int b){
        for(int i=1;i<=y;i++){
            swap(t[a][i],t[b][i]);
        }
    }
    long long det(){
        int p[nu];for(int i=1;i<=x;i++)p[i]=0;int ww=1;
        for(int i=1;i<=x;i++){
            for(int j=i+1;j<=x;j++){
                if(j==i)continue;
                while(t[i][i]){
                    int di=t[j][i]/t[i][i];
                    for(int l=i;l<=x;l++){
                        t[j][l]=(t[j][l]-1LL*di*t[i][l]%mu+mu)%mu;
                    }
                    swp(i,j);ww=-ww;
                }
                swp(i,j);ww=-ww;
                t[j][i]=0;
            }
        }
        num ans=ww;
        for(int i=1;i<=x;i++){
            ans=ans*t[i][i]%mu; 
        }
        return (ans+mu)%mu;
    }   
};

xxs

int r[N],g;
int p[N];
void xxs(int n){
    for(int i=2;i<=n;i++){
        if(p[i]==0){
            r[++g]=i;zh[i]=i;
        }for(int j=1;j<=g;j++){
            int v=i*r[j];if(v>n)break;
            p[v]=1;zh[v]=r[j];if(i%r[j]==0)break;
        }
    }
}

缺省源

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<vector>
#include<map>
#include<queue>
#define getmi int mi=(l+r)/2;
#define addm(a,b); {a+=b;if(a>=mu)a-=mu;}
#define decm(a,b); {a-=b;if(a<0)a+=mu;}
#define mtim(a,b) a=a*1LL*(b)%mu
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
inline long long read(){
    long long x=0,f=1;char a1=getchar();while(a1<'0'||a1>'9'){if(a1=='-')f=-f;a1=getchar();}
    while(a1>='0'&&a1<='9'){x=x*10+(a1^48);a1=getchar();}return x*f;}
inline void write(ll a,int ok=1){
    if(a<0){putchar('-');a=-a;}if(a==0)putchar('0');else
    {unsigned long long z=0,k=0;while(a){z=(z*10)+a%10;a/=10;k++;}while(k--){putchar('0'+(z%10));z/=10;}}if(ok==1)putchar('\n');else if(ok==2)putchar(' ');}
const int N=1000000;

int main(){

    return 0;
}