板子

· · 个人记录

快读:

int read()
{
    int x=0,ch=getchar();
    while(!isdigit(ch))
    {
        ch=getchar();
    }
    while(isdigit(ch))
    {
        x=x*10+ch-'0',ch=getchar();
    }
    return x;
}

快输:

void print(int x)
{
    if(x<0)
    {
       putchar('-');
       x=-x;
    }
    if(x>9)
    {
        print(x/10);
    }
    putchar(x%10+'0');
}

对拍:

:loop

makedata.exe

std.exe

baoli.exe

fc std.out baoli.out

if %errorlevel% == 1 pause

goto loop

floyd:

for(int k=1;k<=n;k++)
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
        }
    }
}

Dijkstra:

void dij(int s,int t)
{
    bool vis[maxn]={0};
    memset(dis,0x3f,sizeof(dis));
    dis[s]=0;
    for(int i=1;i<=n;i++)
    {
        int u;
        int maxu=inf;
        for(int j=1;j<=n;j++)
        {
            if(!vis[j]&&maxu>dis[j])
            {
                maxu=dis[j],u=j;
            }
        }   
        vis[u]=1;
        for(int j=0;j<g[u].size();j++)
        {
            int v=g[u][j].to,w=g[u][j].w;
            if(dis[v]>dis[u]+w)
            {
                dis[v]=dis[u]+w;
            }
        }
    }
}

SPFA:

void spfa(int s)
{
    memset(dis,0x3f,sizeof(dis));
    dis[s]=0;
    q.push(s);
    inq[s]=1;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        inq[u]=0;
        for(int i=0;i<g[u].size();i++)
        {
            int v=g[u][i].to,w=g[u][i].w;
            if(dis[v]>dis[u]+w)
            {
                dis[v]=dis[u]+w;
                if(!inq[v])
                {
                    q.push(v);
                    inq[v]=1;
                }   
            }
        }
    }
}

堆优化的Dijkstra:

struct node
{
    int to,dis,next;
}e[maxm];
int head[maxn],dis[maxn],cnt;
bool vis[maxn];
void add_edge(int u,int v,int w)
{
    cnt++;
    e[cnt].dis=w;
    e[cnt].to=v;
    e[cnt].next=head[u];
    head[u]=cnt;
}
struct point
{
    int dis;
    int pos;
    bool operator<(const point b)const
    {
        return dis>b.dis;
    }
};
void pri_dij(int s)
{
    priority_queue<point> q;
    memset(vis,0,sizeof(vis));
    memset(dis,0x3f,sizeof(dis));
    dis[s]=0;
    q.push((node){s,0});
    while(!q.empty())
    {
        node tmp=q.top();
        q.pop();
        int u=tmp.pos;
        if(vis[u])
        {
            continue;
        }
        vis[u]=1;
        for(int i=head[u];i;i=e[i].next)
        {
            int v=e[i].to,w=e[i].dis;
            if(dis[v]>dis[u]+w)
            {
                dis[v]=dis[u]+w;
                if(!vis[v])
                {
                    q.push((node){v,dis[v]});
                }
            }
        }
    }
}

prim:

void prim()
{
    memset(dis,0x3f,sizeof(dis));
    dis[1]=0;
    for(int i=1;i<=n;i++)
    {
        int next=0;
        for(int j=1;j<=n;j++)
        {
            if(!vis[j]&&dis[j]<dis[next])
            {
                next=j;
            }
        }
        vis[next]=1;
        for(int j=1;j<=n;j++)
        {
            if(!vis[j]&&dis[j]>g[next][j])
            {
                dis[j]=g[next][j];
            }
        }
        tot+=dis[next];
    }
}

ST表:

void build()
{
    for(int j=1;1<<j<=n;j++)
    {
        for(int i=1;i+(1<<j)-1<=n;i++)
        {
            f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]);
        }
    }
}
int query(int x,int y)
{
    int ans=log2(y-x+1);
    return max(f[x][ans],f[y-(1<<ans)+1][ans]);
}

并查集:

int fifa(int x)
{
    if(x==p[x])
    {
        return x;
    }
    int root=fifa(p[x]);
    return p[x]=root;
}
void join(int x,int y)
{
    int px=fifa(x);
    int py=fifa(y);
    if(px!=py)
    {
        p[px]=py;
    }
}
bool issame(int x,int y)
{
    int px=fifa(x);
    int py=fifa(y);
    if(px==py)
    {
        return 1;
    }
    return 0;
}

线段树:

void build_tree(int root,int l,int r)
{
    if(l==r)
    {
        tree[root]=a[l];
        return;
    }
    int mid=(l+r)/2;
    int lson=root*2;
    int rson=root*2+1;
    build_tree(lson,l,mid);
    build_tree(rson,mid+1,r);
    tree[root]=tree[lson]+tree[rson];
}
void fun(int root,int l,int r,int v)
{
    tree[root]+=(r-l+1)*v;
    lazy[root]+=v;
}
void pushdown(int root,int l,int r)
{
    int mid=(l+r)/2;
    int lson=root*2;
    int rson=root*2+1;
    fun(lson,l,mid,lazy[root]);
    fun(rson,mid+1,r,lazy[root]);
    lazy[root]=0;
}
void update(int root,int l,int r,int sp,int ep,int v)
{
    if(r<sp||ep<l)
    {
        return;
    }
    if(sp<=l&&r<=ep)
    {
        fun(root,l,r,v);
        return;
    }
    pushdown(root,l,r);
    int mid=(l+r)/2;
    int lson=root*2;
    int rson=root*2+1;
    update(lson,l,mid,sp,ep,v);
    update(rson,mid+1,r,sp,ep,v);
    tree[root]=tree[lson]+tree[rson];
}
int query(int root,int l,int r,int sp,int ep)
{
    if(r<sp||ep<l)
    {
        return 0;
    }
    if(sp<=l&&r<=ep)
    {
        return tree[root];
    }
    pushdown(root,l,r);
    int mid=(l+r)/2;
    int lson=2*root;
    int rson=2*root+1;
    int la=query(lson,l,mid,sp,ep);
    int ra=query(rson,mid+1,r,sp,ep);
    return la+ra;
}

树状数组:

int lowbit(int x)
{
    return x&-x;
}
void update(int x,int v)
{
    while(x<=n)
    {
        d[x]+=v;
        x+=lowbit(x);
    }
}
int query(int x)
{
    int res=0;
    while(x)
    {
        res+=d[x];
        x-=lowbit(x);
    }
    return res;
}

最近公共祖先(LCA):

void dfs(int s,int t)
{
    a[s]=a[t]+1;
    f[s][0]=t;
    for(int i=1;(1<<i)<=a[s];i++)
    {
        f[s][i]=f[f[s][i-1]][i-1];
    }
    for(int i=head[s];i;i=g[i].w)
    {
        if(g[i].to!=t)
        {
            dfs(g[i].to,s);
        }
    }
}
int lca(int x,int y)
{
    if(a[x]>a[y])
    {
        swap(x,y);
    }
    int p=a[y]-a[x];
    for(int i=20;i>=0;i--)
    {
        if((p>>i)&1)
        {
            y=f[y][i];
        }
    }
    if(x==y)
    {
        return x;
    }
    for(int i=20;i>=0;i--)
    {
        if(f[x][i]!=f[y][i])
        {
            x=f[x][i];
            y=f[y][i];
        }
    }
    return f[x][0];
}

哈希:

int Hash(string &a)
{
    int res=0;
    for(int i=0;i<a.length();i++)
    {
        res+=res*base+a[i];
    }
    return res;
}

快速幂:

int pow(int a,int b,int p)
{
    int ans=1;
    while(b>0)
    {
        if(b%2)
        {
            ans=(ans*a)%p;
        }
        a=a*a%p;
        b/=2;
    }
    return ans%p;
}

龟速乘:

int pow(int a,int b,int p)
{
    int ans=1;
    while(b>0)
    {
        if(b%2)
        {
            ans=(ans+a)%p;
        }
        a=a+a%p;
        b/=2;
    }
    return ans%p;
}

矩阵快速幂:

struct mat
{
    int a[110][110];
    mat(){memset(a,0,sizeof(a));}
    mat operator* (mat b)const
    {
        mat c;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                for(int k=1;k<=n;k++)
                {
                    c.a[i][j]+=(a[i][k]*b.a[k][j])%mod;
                    c.a[i][j]%=mod;
                }
            }
        }
        return c;
    }
}b;
mat matpow(mat b,int t)
{
    mat ans;
    for(int i=1;i<=n;i++)
    {
        ans.a[i][i]=1;
    }
    while(t)
    {
        if(t%2)
        {
            ans=ans*b;

        }
        b=b*b;
            t>>=1;
    }
    return ans;
}

扩展中国剩余定理(EXCRT):

ll gsmul(ll a,ll b,ll p)
{
    ll ans=0;
    while(b)
    {
        if(b&1)
        {
            ans+=a;
            ans%=p;
        }
        a+=a;
        a%=p;
        b>>=1;
    }
    return ans;
}
int exgcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    else
    {
        int x2,y2;
        int gcd=exgcd(b,a%b,x2,y2);
        x=y2;
        y=x2-(a/b)*y2;
        return gcd;
    }
}
void exchina()
{
    for(int i=2;i<=n;i++)
    {
        int a=A[i-1],b=A[i],d=B[i]-B[i-1];
        int x,y;
        int gcd=exgcd(a,b,x,y);
        int m=b/gcd;
        x=(x%m+m)%m;
        x=gsmul(x,(d/gcd%m+m)%m,m);
        A[i]=b/gcd*a,B[i]=B[i-1]+a*x;
    }
    cout<<B[n];
}

严格次小生成树:

struct node
{
    int u,v,w,tag;
}g[300010],a[300010];
bool cmp(node a,node b)
{
    return a.w<b.w;
}
int p[300010];
int n,m;
int fifa(int x)
{
    if(x==p[x])
    {
        return x;
    }
    return p[x]=fifa(p[x]);
}
int bz[300010][20],deep[300010];
int head[300010],tot;
void add(int u,int v,int w)
{
    g[++tot].u=u,g[tot].v=v,g[tot].w=w,g[tot].tag=head[u],head[u]=tot;
    g[++tot].u=v,g[tot].v=u,g[tot].w=w,g[tot].tag=head[v],head[v]=tot;
}
int maxi[300010][20];
int mini[300010][20];
void dfs(int u,int fa)
{
    bz[u][0]=fa;
    for(int i=head[u];i;i=g[i].tag)
    {
        int v=g[i].v;
        if(v==fa)
        {
            continue;
        }
        deep[v]=deep[u]+1ll;
        maxi[v][0]=g[i].w;
        mini[v][0]=-1e15;
        dfs(v,u);
    }
}
int lca(int x,int y)
{
    if(deep[x]<deep[y])
    {
        swap(x,y);
    }
    for(int i=18;i>=0;i--)
    {
        if(deep[bz[x][i]]>=deep[y])
        {
            x=bz[x][i];
        }
    }
    if(x==y)
    {
        return x;
    }
    for(int i=18;i>=0;i--)
    {
        if(bz[x][i]^bz[y][i])
        {
            x=bz[x][i],y=bz[y][i];
        }
    }
    return bz[x][0];
}
int qmax(int u,int v,int maxx)
{
    int ans=-1e15;
    for(int i=18;i>=0;i--)
    {
        if(deep[bz[u][i]]>=deep[v])
        {
            if(maxx!=maxi[u][i])
            {
                ans=max(ans,maxi[u][i]);
            }
            else
            {
                ans=max(ans,mini[u][i]);
            }
            u=bz[u][i];
        }
    }
    return ans;
void cal()
{
    for(int i=1;i<=18;i++)
    {
        for(int j=1;j<=n;j++)
        {
            bz[j][i]=bz[bz[j][i-1]][i-1];
            maxi[j][i]=max(maxi[j][i-1],maxi[bz[j][i-1]][i-1]);
            mini[j][i]=max(mini[j][i-1],mini[bz[j][i-1]][i-1]);
            if(maxi[j][i-1]>maxi[bz[j][i-1]][i-1])
            {
                mini[j][i]=max(mini[j][i],maxi[bz[j][i-1]][i-1]);
            }
            else if(maxi[j][i-1]<maxi[bz[j][i-1]][i-1])
            {
                mini[j][i]=max(mini[j][i],maxi[j][i-1]);
            }
        }
    }
}

扩展欧几里得(乘法逆元):

int exgcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    else
    {
        int x2,y2;
        int d=exgcd(b,a%b,x2,y2);
        x=y2;
        y=x2-(a/b)*y2;
        return d;
    }
}

八聚氧:

#define fastcall __attribute__((optimize("-O3")))
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")

高精度:

高精度板子