模板集(。
维蒂斯保佑。
全排列:
#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_______
基本没了?