模板集(。

维蒂斯保佑。

全排列:

#include<iostream>
#include<string.h>
using namespace std;

int n,a[11];
bool b[11];

int s(int k);
int p();
int s(int k)
{
    int i;
    for(i=1;i<=n;++i)
    {
        if(b[i])
        {
            a[k]=i;
            b[i]=false;
            if(k==n) p();
            else s(k+1);
            b[i]=true;
        }
    }
}
int p()
{
    for(int i=1;i<n;++i)cout<<a[i]<<" ";
    cout<<a[n]<<endl;
}
int main()
{
    memset(b,true,sizeof(b));
    cin>>n;
    s(1);
    return 0;
}

组合:

#include<iostream>
using namespace std;

int n,r,a[101];
bool b[101]={0};

int s(int k);
int p();
int s(int k)
{
    int i;
    for(i=a[k-1]+1;i<=n;++i)
    {
        if(!b[i])
        {
            a[k]=i;
            b[i]=1;
            if(k==r)p();
            else s(k+1);
            b[i]=0;
        }
    }
}
int p()
{
//  for(int i=1;i<r;++i)cout<<a[i]<<" ";
//  cout<<a[r]<<endl;
}
int main()
{
    cin>>n>>r;
    s(1);
    return 0;
}

01背包:

#include<iostream>
#include<cstring>
using namespace std;
int p[1000],t[1000],f[10000];
int main()
{
    int v,n;
    cin>>v>>n;
    for(int i=0;i<n;++i)
        cin>>t[i]>>p[i];
    memset(f,-1,sizeof(f));
    f[0]=0;
    for(int i=0;i<n;++i)
        for(int j=v;j>=t[i];--j)
            f[j]=f[j]>f[j-t[i]]+p[i]?f[j]:f[j-t[i]]+p[i];
    cout<<f[v];
    return 0;
}

完全背包:

#include<iostream>
#include<cstring>
using namespace std;
int p[1000],t[1000],f[10000];
int main()
{
    int v,n;
    cin>>v>>n;
    for(int i=0;i<n;++i)
        cin>>t[i]>>p[i];
    memset(f,-1,sizeof(f));
    f[0]=0;
    for(int i=0;i<n;++i)
        for(int j=t[i];j<=v;++j)
            f[j]=f[j]>f[j-t[i]]+p[i]?f[j]:f[j-t[i]]+p[i];
    cout<<f[v];
    return 0;
}

无价值的01背包:

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    int a[35],v,n;
    bool f[21000];
    cin>>v>>n;
    for(int i=0;i<n;++i)
        cin>>a[i];
    memset(f,false,sizeof(f));
    f[0]=true;
    for(int i=0;i<n;++i)
        for(int j=v;j>=a[i];--j)
            if(f[j]==false)
                f[j]=f[j-a[i]];
    int x=v;
    while(f[x]==false)
        --x;
    cout<<v-x;
    return 0;
}

网络流(Dinic):

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;

int _(int a,int b)
{
    return a>b?b:a;
}

struct nod
{
    int x,y,c,pre,ver;
}w[2000000];
int k,las[100000],st,ed;
 
void ins(int x,int y,int c)
{
    int k1=++k;
        w[k].x=x;
            w[k].y=y;
                w[k].c=c;
            w[k].pre=las[x];
        las[x]=k;
    int k2=++k;
        w[k].x=y;
            w[k].y=x;
                w[k].c=0;
            w[k].pre=las[y];
        las[y]=k;
    w[k1].ver=k2;
    w[k2].ver=k1;
}

int h[100000];
bool hier()
{
    memset(h,0,sizeof(h));
    h[st]=1;
    queue<int> q;
    q.push(st);
    while(!q.empty())
    {
        int x=q.front();
        for(int i=las[x];i>-1;i=w[i].pre)
        {
            int y=w[i].y;
            if(w[i].c&&h[y]==0)
            {
                h[y]=h[x]+1;
                q.push(y);
            }
        }
        q.pop();
    }
    if(h[ed])return true;
    else return false;
}

int fluis(int x,int f)
{
    if(x==ed)return f;
    int a=0,t;
    for(int i=las[x];i>-1;i=w[i].pre)
    {
        int y=w[i].y;
        if(w[i].c&&h[y]==h[x]+1&&a<f)
        {
            a+=(t=fluis(y,_(w[i].c,f-a)));
            w[i].c-=t;
            w[w[i].ver].c+=t;
        }
    }
    if(a==0)h[x]=0;
    return a;
}

int main()
{
    int m,n;
    cin>>m>>n;
    st=1;
    ed=n;
    k=0;
    memset(las,-1,sizeof(las));
    for(int i=0;i<m;++i)
    {
        int x,y,c;
        cin>>x>>y>>c;
        ins(x,y,c);
    }
    int s=0;
    while(hier())
        s+=fluis(st,99999999);
    cout<<s;
    return 0;
}

线段树:

#include<iostream>
using namespace std;

int tree[210000]={0},left_[210000],right_[210000],unit[110000];
/*
    tree  : 二叉树                     (key->value)
    left_ : 每节点对应的左区间       (key->unit)
    right_: 每节点对应的右区间       (key->unit)
    unit  : 每个单位区间对应的节点     (unit->key)
*/

int create(int l,int r,int k)
{
    left_[k]=l;
    right_[k]=r;
    if(l==r)unit[l]=k;
    else
    {
        create(l,(l+r)/2,2*k);
        create((l+r)/2+1,r,2*k+1);
    }
}

int add(int k,int a)
{
    int i=unit[k];
    while(i!=0)
    {
        tree[i]+=a;
        i/=2;
    }
}

int query(int l,int r)
{
    int p=unit[l],ans=0;
    while(!(right_[p]>r)&&right_[p]>0)
    {
        if(left_[p/2]<l||right_[p/2]>r)
        {
            ans+=tree[p];
            p=unit[right_[p]+1];
            continue;
        }
        else p/=2;
    }
    return ans;
}

int main()
{
    int n;
    cin>>n;
    create(1,n,1);
    int w;
    cin>>w;
    for(int i=0;i<w;++i)
    {
        char c;
        int a,b;
        cin>>c>>a>>b;
        if(c=='x')
            add(a,b);
        if(c=='y')
            cout<<query(a,b)<<"\n";
    }
    return 0;
}

极值线段树(似乎有bug?):

#include<iostream>
using namespace std;

int tree[210000]={0},left_[210000],right_[210000],unit[110000];
/*
    tree  : 二叉树                     (key->value)
    left_ : 每节点对应的左区间       (key->unit)
    right_: 每节点对应的右区间       (key->unit)
    unit  : 每个单位区间对应的节点     (unit->key)
*/

int _(int a,int b)
{
    return a>b?a:b;
}

int create(int l,int r,int k)
{
//  cout<<k<<":["<<l<<","<<r<<")\n";
    left_[k]=l;
    right_[k]=r;
    if(l==r)unit[l]=k;
    else
    {
        create(l,(l+r)/2,2*k);
        create((l+r)/2+1,r,2*k+1);
    }
}

int change(int k,int a)
{
    int i=unit[k];
    tree[i]=a;
    i/=2;
    while(i!=0)
    {
//      cout<<i<<":["<<left_[i]<<","<<right_[i]<<") -> "<<tree[i]+a<<endl;
        tree[i]=_(tree[i*2],tree[i*2+1]);
        i/=2;
    }
}

int query(int l,int r)
{
    int p=unit[l],ans=tree[p];
    while(!(right_[p]>r)&&right_[p]>0)
    {
//      cout<<"at "<<p<<":["<<left_[p]<<","<<right_[p]<<")\n";
        if(left_[p/2]<l||right_[p/2]>r)
        {
//          cout<<"crest. value:"<<tree[p]<<endl;
            ans=_(ans,tree[p]);
            p=unit[right_[p]+1];
            continue;
        }
        else p/=2;
    }
//  cout<<"at "<<p<<":["<<left_[p]<<","<<right_[p]<<")\n";
    return ans;
}

int main()
{
    int n;
    cin>>n;
    create(1,n,1);
    int w;
    cin>>w;
    for(int i=0;i<w;++i)
    {
        char c;
        int a,b;
        cin>>c>>a>>b;
        if(c=='x')
            change(a,b);
        if(c=='y')
            cout<<query(a,b)<<"\n";
    }
    return 0;
}

网上 借鉴的zkw线段树:

#include<iostream>
#include<cstdio>
#include<cstring>
#define lc d<<1
#define rc d<<1|1
using namespace std;

int n,m,s;
struct node
{
    long long s,l,n;
}tr[1<<20];

void crea()
{
    for(s=1;s<=n;s<<=1);
    for(int i=1;i<=n;++i)
    {
        cin>>tr[i+s].s;
        tr[i+s].n=1;
    }
    for(int d=s-1;d;d--)
    {
        tr[d].s=tr[lc].s+tr[rc].s;
        tr[d].n=tr[lc].n+tr[rc].n;
    }
}

void delta(int x,int y,long long t)
{
    int nx=0,ny=0;
    for(x+=s,y+=s;x^y^1;x>>=1,y>>=1)
    {
        tr[x].s+=t*nx;
        if(!(x&1))
        {
            tr[x+1].l+=t;
            nx+=tr[x+1].n;
            tr[x+1].s+=tr[x+1].n*t;
        }
        tr[y].s+=t*ny;
        if(y&1)
        {
            tr[y-1].l+=t;
            ny+=tr[y-1].n;
            tr[y-1].s+=tr[y-1].n*t;
        }
    }
    for(;x>=1&&y>=1;x>>=1,y>>=1)
        tr[x].s+=t*nx,tr[y].s+=t*ny;
}

long long query(int x,int y)
{
    long long rt=0,nx=0,ny=0;
    for(x+=s,y+=s;x^y^1;x>>=1,y>>=1)
    {
        rt+=tr[x].l*nx+tr[y].l*ny;
        if(!(x&1))
        {
            rt+=tr[x+1].s;
            nx+=tr[x+1].n;
        }
        if(y&1)
        {
            rt+=tr[y-1].s;
            ny+=tr[y-1].n;
        }
    }
    for(;x>=1&&y>=1;x>>=1,y>>=1)
        rt+=tr[x].l*nx+tr[y].l*ny;    
    return rt;
}

int main()
{
    cin>>n>>m;
    crea();
    for(int i=1;i<=m;++i)
    {
        int x,y,v;
        cin>>v>>x>>y;
        if(v==2)
            cout<<query(x-1,y+1)<<"\n";
        else if(v==1)
        {
            long long z;
            cin>>z;
            delta(x-1,y+1,z);
        }
    }
}

并查集:

#include<iostream>
#include<cstdio>
using namespace std;

struct node
{
    int head;
    int next;
    int num;
    int last;
} ufs[5100];
    
int create(int a)
{
    ufs[a].head=a;
    ufs[a].next=-1;
    ufs[a].num=1;
    ufs[a].last=a;
}

int mergefore(int x,int y)
{
    ufs[ufs[x].last].next=y;
    ufs[x].last=ufs[y].last;
    ufs[x].num+=ufs[y].num;
    ufs[y].last=0;
    ufs[y].num=0;
    int a=y;
    while(a>-1)
    {
        ufs[a].head=x;
        a=ufs[a].next;
    }
}

int merge(int x,int y)
{
    x=ufs[x].head;
    y=ufs[y].head;
    if(ufs[x].num>ufs[y].num)
    {
        mergefore(x,y);
        return 0;
    }
    else mergefore(y,x);
    return 0;
}

int main()
{
    int n,m,p;
    cin>>n>>m>>p;
    for(int i=1;i<=n;++i)create(i);
    for(int i=0;i<m;++i)
    {
        int x,y;
        cin>>x>>y;
        if(ufs[x].head!=ufs[y].head)
            merge(x,y);
    }
    for(int i=0;i<p;++i)
    {
        int a,b;
        cin>>a>>b;
        if(ufs[a].head==ufs[b].head)cout<<"Yes\n";
        else cout<<"No\n";
    }
    return 0;
}

Dijkstra+堆优化:

#include<iostream>
#include<queue>
#include<vector>
#define pr pair<long long,int> 
using namespace std;

int _(int a,int b)
{
    return a>b?b:a;
}

priority_queue<pr,vector<pr>,greater<pr> > q;
bool b[100000];

struct nod
{
    int x,y,l,pre;
}w[2000000];
int k=1,las[100000],dis[100000];

void ins(int x,int y,int l)
{
    w[k].x=x;
    w[k].y=y;
    w[k].l=l;
    w[k].pre=las[x];
    las[x]=k;
    ++k;
}

int main()
{
    int n,m,s;
    cin>>n>>m>>s;
    for(int i=1;i<=n;++i)
        dis[i]=2147483647;
    dis[s]=0;
    for(int i=1;i<=m;++i)
    {
        int x,y,l;
        cin>>x>>y>>l;
        ins(x,y,l);
    }
    q.push(make_pair(0,s));
    while(!q.empty())
    {
        int d=q.top().second;
        q.pop();
        if(!b[d])
        {
            b[d]=1;
            for(int i=las[d];i;i=w[i].pre)
            {
                int v=w[i].y;
                dis[v]=_(dis[v],dis[d]+w[i].l);
                q.push(make_pair(dis[v],v));
            }
        }
    }
    for(int i=1;i<=n;++i)
        cout<<dis[i]<<" ";
    return 0;
}

数论模板(待更新):

#define ______BEGIN______ using namespace std;
#define _______END_______ int main(){return 0;}

#include<cmath>
#include<algorithm>
#include<iostream>

//加了这一段是不是比较正式…… 
//这是一组关于数论的模板。没了。
//不要编译。不要编译。不要编译。 

______BEGIN______

//最大公约数。 
int gcd(int a,int b)
{
    if(b) return gcd(b,a%b);
    return a;
}

//素数判断(。
bool isp(int a)
{
    if(!a||!(a-1))
        return false;
    for(int i=2;i<=sqrt(a);++i)
        if(a%i==0)
            return false;
    return true;
} 

_______END_______

字符串模板(待更新):

#define ______BEGIN______ using namespace std;
#define _______END_______ int main(){return 0;}

#include<string>
#include<algorithm>
#include<iostream>

//加了这一段是不是比较正式…… 
//这是一组关于字串处理的模板。没了。
//可能会涉及高精度。 
//不要编译。不要编译。不要编译。 

______BEGIN______

//将整数转换为字串。 
string ntos(int a)
{
    string s;
    s.resize(0);
    while(a)
    {
        int k=s.size();
        s.resize(k+1);
        s[k]=(char)(a%10+'0');
        a/=10;
    }
    reverse(s.begin(),s.end());
    return s;
}

//将字符串转换为整数。 
int ston(string s)
{
    int a=0;
    for(int i=0;i<s.size();++i)
        a=a*10+(s[i]-'0');
    return a;
}

//快速读入(?
inline int qread()
{
    char c=getchar();
    int n=0,p=1;
    while(c<'0'||c>'9')
    {
        if(c=='-')
            p=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        n=n*10+c-'0';
        c=getchar();
    }
    return n*p;
} 

//高精度比较(大于,自行修改)。
bool cmp(string a,string b)
{
    if(a.size()==b.size())
        return a>b;
    return a.size()>b.size();
} 

_______END_______

基本没了?

转载于:https://www.cnblogs.com/V-Carlyle/p/9661396.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值