模板集(。

维蒂斯保佑。

全排列:

#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_______

基本没了?

posted @ 2018-09-17 12:15  嵇渔  阅读(72)  评论(0编辑  收藏  举报