各类常见模板更新(不定期更新)

  俗话说得好:模板敲得好,NOIP炸不了。

  因此为了防止比赛时想到了题解而敲不出来的情况,我们要坚持刷模板。

  (争取每次上线的话打1~2个吧)

  (排名顺序没有任何意义,想到什么写什么)

  SPFA(对应题目Luogu P3371 【模板】单源最短路径)

#include<cstdio>
#include<vector>
using namespace std;
const int N=10005,INF=2147483647;
vector <int> a[N],l[N];
int n,m,s,dis[N],i,x,y,z,q[N*20+10];
bool f[N];
inline void read(int &x)
{
    x=0; char ch=getchar(); int flag=1;
    while (ch<'0'||ch>'9') { if (ch=='-') flag=-1; ch=getchar(); }
    while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    x*=flag;
}
int main()
{
    read(n); read(m); read(s);
    for (i=1;i<=m;++i)
    {
        read(x); read(y); read(z);
        a[x].push_back(y); l[x].push_back(z);
    }
    for (i=1;i<=n;++i)
    dis[i]=INF;
    dis[s]=0; f[s]=1; q[1]=s;
    int head=0,tail=1;
    while (head<tail)
    {
        int now=q[++head];
        f[now]=0;
        for (i=0;i<a[now].size();++i)
        {
            int k=a[now][i];
            if (dis[k]>dis[now]+l[now][i])
            {
                dis[k]=dis[now]+l[now][i];
                if (!f[k])
                {
                    f[k]=1;
                    q[++tail]=k;
                }
            }
        }
    }
    for (i=1;i<=n;++i)
    printf("%d ",dis[i]);
    return 0;
}

  Dijstra(堆优化)对应题目Luogu P3371 【模板】单源最短路径)

#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int N=10005,INF=2147483647;
vector <int> a[N],l[N];
struct data
{
    int num,s;
    bool operator < (const data &a) const
    {
        return a.s<s;
    }
};
priority_queue <data> small;
int n,m,s,dis[N],i,x,y,z,q[N*20+10];
bool f[N];
inline void read(int &x)
{
    x=0; char ch=getchar(); int flag=1;
    while (ch<'0'||ch>'9') { if (ch=='-') flag=-1; ch=getchar(); }
    while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    x*=flag;
}
int main()
{
    read(n); read(m); read(s);
    for (i=1;i<=m;++i)
    {
        read(x); read(y); read(z);
        a[x].push_back(y); l[x].push_back(z);
    }
    for (i=1;i<=n;++i)
    dis[i]=INF;
    dis[s]=0;
    small.push((data){s,0});
    while (!small.empty())
    {
        int now=small.top().num; small.pop();
        if (f[now]) continue;
        f[now]=1;
        for (i=0;i<a[now].size();++i)
        {
            int k=a[now][i];
            if (dis[k]>dis[now]+l[now][i])
            {
                dis[k]=dis[now]+l[now][i];
                small.push((data){k,dis[k]});
            }
        }
    }
    for (i=1;i<=n;++i)
    printf("%d ",dis[i]);
    return 0;
}

   线段树(朴素Lazytag)(对应题目 Luogu  P3372 【模板】线段树 1)

#include<cstdio>
using namespace std;
typedef long long LL;
const int N=100005;
LL seg[N*4+10],add[N*4+10],i,n,m,a[N],x,y,z;
inline void read(LL &x)
{
    x=0; char ch=getchar(); int flag=1;
    while (ch<'0'||ch>'9') { if (ch=='-') flag=-1; ch=getchar(); }
    while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    x*=flag;
}
inline void write(LL x)
{
    if (x/10) write(x/10);
    putchar(x%10+'0');
}
inline void up(LL root) { seg[root]=seg[root*2]+seg[root*2+1]; }
inline void down(LL root,LL l,LL r)
{
    if (add[root])
    {
        add[root*2]+=add[root];
        add[root*2+1]+=add[root];
        seg[root*2]+=add[root]*l;
        seg[root*2+1]+=add[root]*r;
        add[root]=0;
    }
}
inline void build(LL root,LL l,LL r)
{
    if (l==r) seg[root]=a[l]; else
    {
        int mid=l+r>>1;
        build(root*2,l,mid);
        build(root*2+1,mid+1,r);
        up(root);
    }
}
inline void change(LL root,LL l,LL r,LL ql,LL qr,LL v)
{
    if (l>=ql&&r<=qr) 
    {
        add[root]+=v;
        seg[root]+=v*(r-l+1);
    } else
    {
        int mid=l+r>>1;
        down(root,mid-l+1,r-mid);
        if (ql<=mid) change(root*2,l,mid,ql,qr,v);
        if (mid<qr) change(root*2+1,mid+1,r,ql,qr,v);
        up(root);
    }
}
inline LL query(LL root,LL l,LL r,LL ql,LL qr)
{
    if (l>=ql&&r<=qr) return seg[root]; else
    {
        int mid=l+r>>1;
        down(root,mid-l+1,r-mid);
        LL res=0;
        if (ql<=mid) res+=query(root*2,l,mid,ql,qr);
        if (mid<qr) res+=query(root*2+1,mid+1,r,ql,qr);
        return res;
    }
}
int main()
{
    read(n); read(m);
    for (i=1;i<=n;++i)
    read(a[i]);
    build(1,1,n);
    while (m--)
    {
        read(z);
        if (z==1)
        {
            read(x); read(y); read(z);
            change(1,1,n,x,y,z);
        } else
        {
            read(x); read(y);
            write(query(1,1,n,x,y));
            putchar('
');
        }
    }
    return 0;
}

  RMQ(ST表)(对应题目 P3865 【模板】ST表)

#include<bits/stdc++.h>
using namespace std;
const int N=100005,P=20;
int f[N][P],n,m,x,y,i,j;
inline void read(int &x)
{
    x=0; char ch=getchar(); int flag=1;
    while (ch<'0'||ch>'9') { if (ch=='-') flag=-1; ch=getchar(); }
    while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    x*=flag;
}
inline void write(int x)
{
    if (x/10) write(x/10);
    putchar(x%10+'0');
}
inline int max(int a,int b) { return a>b?a:b; }
int main()
{
    read(n); read(m);
    for (i=1;i<=n;++i)
    read(f[i][0]);
    for (j=1;j<P;++j)
    for (i=1;i+(1<<j)-1<=n;++i)
    f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
    while (m--)
    {
        read(x); read(y);
        int mid=(int)log2(y-x+1);
        write(max(f[x][mid],f[y-(1<<mid)+1][mid]));
        putchar('
');
    }
    return 0;
}

  K短路(Astar)(对应题目P2483 【模板】k短路([SDOI2010]魔法猪学院))

// luogu-judger-enable-o2
#include<cstdio>
#include<queue>
using namespace std;
typedef double DB;
const int N=5005;
struct data
{
    int num;
    DB s;
    bool operator <(const data &a) const 
    {
        return a.s<s;
    }
};
struct Astar
{
    int num;
    DB s,rs;
    bool operator <(const Astar &a) const 
    {
        return a.s+a.rs<s+rs;
    }
};
priority_queue <data> small;
priority_queue <Astar> tree;
vector <int> a[N],b[N];
vector <DB> l[N],rl[N];
int n,m,i,x,y,ans;
DB z,tot,dis[N],sum;
bool vis[N];
inline void read(int &x)
{
    x=0; char ch=getchar();
    while (ch<'0'||ch>'9') ch=getchar();
    while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
}
int main()
{
    read(n); read(m); scanf("%lf",&tot);
    for (i=1;i<=m;++i)
    {
        read(x); read(y); scanf("%lf",&z);
        a[x].push_back(y); l[x].push_back(z);
        b[y].push_back(x); rl[y].push_back(z);
    }
    for (i=1;i<=n;++i)
    dis[i]=1e9;
    dis[n]=0;
    small.push((data){n,0});
    while (!small.empty())
    {
        int now=small.top().num; small.pop();
        if (vis[now]) continue;
        vis[now]=1;
        for (i=0;i<b[now].size();++i)
        {
            int k=b[now][i];
            if (dis[k]>dis[now]+rl[now][i])
            {
                dis[k]=dis[now]+rl[now][i];
                small.push((data){k,dis[k]});
            }
        }
    }
    tree.push((Astar){1,0,dis[1]});
    while (!tree.empty())
    {
        int now=tree.top().num; DB temp=tree.top().s; tree.pop();
        if (now==n) { if (sum+temp>tot) { printf("%d",ans); return 0; } else ans++,sum+=temp; }
        for (i=0;i<a[now].size();++i)
        tree.push((Astar){a[now][i],temp+l[now][i],dis[a[now][i]]});
    }
    return 0;
}

  Dinic (对应题目 P3376 【模板】网络最大流)

#include<cstdio>
#include<cstring>
using namespace std;
const int N=10005,M=100005,INF=2e9;
struct edge
{
    int to,next,c;
}e[M*2];
int q[N],head[N],dep[N],n,m,s,t,i,x,y,z,k=-1;
inline void read(int &x)
{
    x=0; char ch=getchar();
    while (ch<'0'||ch>'9') ch=getchar();
    while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
}
inline void add(int x,int y,int z)
{
    e[++k].to=y; e[k].c=z; e[k].next=head[x]; head[x]=k;
}
inline int min(int a,int b)
{
    return a<b?a:b;
}
inline bool BFS(int s,int t)
{
    memset(dep,0,sizeof(dep));
    int H=0,T=1;
    q[1]=s; dep[s]=1;
    while (H<T)
    {
        int now=q[++H];
        for (int i=head[now];i!=-1;i=e[i].next)
        if (!dep[e[i].to]&&e[i].c>0)
        {
            dep[e[i].to]=dep[now]+1;
            q[++T]=e[i].to;
        }
    }
    return dep[t]?1:0;
}
inline int DFS(int now,int dist)
{
    if (now==t) return dist;
    int res=0;
    for (int i=head[now];i!=-1&&dist;i=e[i].next)
    if (dep[e[i].to]==dep[now]+1&&e[i].c>0)
    {
        int dis=DFS(e[i].to,min(e[i].c,dist));
        dist-=dis; res+=dis;
        e[i].c-=dis; e[i^1].c+=dis;
    }
    if (!res) dep[now]=0;
    return res;
}
inline int Dinic(int s,int t)
{
    int sum=0;
    while (BFS(s,t)) sum+=DFS(s,INF);
    return sum;
}
int main()
{
    memset(e,-1,sizeof(e));
    memset(head,-1,sizeof(head));
    read(n); read(m); read(s); read(t);
    for (i=1;i<=m;++i)
    {
        read(x); read(y); read(z);
        add(x,y,z); add(y,x,0);
    }
    printf("%d",Dinic(s,t));
    return 0;
}
原文地址:https://www.cnblogs.com/cjjsb/p/8178688.html