一丶并查集
#include <iostream>
using namespace std;
int par[10000];
int tall[10000];
void init(int n)
{
for(int i=0; i<n; i++)
{
par[i]=i;
tall[i]=0;
}
}
int findRoot(int x)
{
if(par[x]==x)
return x;
else
return par[x]=findRoot(par[x]);
}
void unite(int x,int y)
{
x=findRoot(x);
y=findRoot(y);
if(x==y)
return;
if(tall[x]<tall[y])
{
par[x]=y;
}
else
{
par[y]=x;
if(tall[x]==tall[y])
{
tall[x]++;
}
}
}
bool same(int x,int y)
{
return findRoot(x)==findRoot(y);
}
int main()
{
init(1000);
unite(0,1);
unite(2,3);
unite(100,101);
unite(3,100);
unite(999,0);
if(same(0,1))
cout << "Hello world!" << endl;
for(int i=0; i<1000; i++)
{
for(int j=i+1; j<1000; j++)
{
if(same(i,j))
cout<<i<<":"<<j<<" "<<"哈哈哈"<<endl;
}
}
return 0;
}
二丶SG函数
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
#define N 100
#define MAXN 1000+10
int f[N],S[MAXN],SG[MAXN];
void getSG(int n){
int i,j;
memset(SG,0,sizeof(SG));
for(i=1;i<=n;i++){
memset(S,0,sizeof(S));
for(j=1;f[j]<=i&&j<=N;j++){
S[SG[i-f[j]]]=1;
}
for(j=0;;j++)if(!S[j]){
SG[i]=j;
break;
}
}
}
int main()
{
int i,j;
f[1]=1;
f[2]=2;
for(i=3;i<17;i++){
f[i]=f[i-1]+f[i-2];
}
getSG(1000);
int m,n,p;
while(scanf("%d%d%d",&m,&n,&p)!=EOF){
if(m==0&&n==0&&p==0)break;
if(SG[m]^SG[n]^SG[p])printf("Fibo\n");
else printf("Nacci\n");
}
return 0;
}
三丶混合背包
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define maxN 1000
int f[maxN],w;
void ZOPack(int wi,int vi){
for(int j=w;j>=0;j--){
if(j>=wi){
f[j]=max(f[j],f[j-wi]+vi);
}
}
}
void ComPack(int wi,int vi){
for(int j=0;j<=w;j++){
if(j>=wi){
f[j]=max(f[j],f[j-wi]+vi);
}
}
}
void MulPack(int ni,int wi,int vi){
if(ni*wi>=w){
ComPack(wi,vi);
return;
}
int k=1,amount=ni;
while(k<ni){
ZOPack(wi*k,vi*k);
amount=amount-k;
k=k*2;
}
ZOPack(wi*amount,vi*amount);
}
int main()
{
int cases,n,ni,wi,vi;
cin>>cases;
while(cases--){
memset(f,0,sizeof(f));
cin>>n>>w;
for(int i=0;i<n;i++){
cin>>ni>>wi>>vi;
//cout<<"奇怪"<<endl;
MulPack(ni,wi,vi);
}
cout<<f[w]<<endl;
}
return 0;
}
四丶最短路dijkstra
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define MAX_V 1000
const int INF=10000000;
struct edge{
int to,cost;
};
typedef pair<int,int> P;
int V;
vector<edge> G[MAX_V];
int d[MAX_V];
void dijkstra(int s){
priority_queue<P,vector<P>,greater<P> > que;
fill(d,d+V,INF);
d[s]=0;
que.push(P(0,s));
while(!que.empty()){
P p=que.top();que.pop();
int v=p.second;
if(d[v]<p.first)continue;
for(int i=0;i<G[v].size();i++){
edge e=G[v][i];
if(d[e.to]>d[v]+e.cost){
d[e.to]=d[v]+e.cost;
que.push(P(d[e.to],e.to));
}
}
}
}
int main()
{
return 0;
}
五丶线段树
#include <iostream>
using namespace std;
#define MAXN 4*10000
int a[10000];
struct segment{
int l,r,sum,lazy;
}tree[MAXN];
void build(int rt,int l,int r){
tree[rt].l=l;
tree[rt].r=r;
tree[rt].lazy=0;
if(l==r){
tree[rt].sum=a[l];
}
else{
int mid =(l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
}
}
void push_up(int rt){
tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
}
void push_down(int rt){
if(tree[rt].lazy){
tree[rt<<1].lazy+=tree[rt].lazy;
tree[rt<<1|1].lazy+=tree[rt].lazy;
tree[rt<<1].sum+=tree[rt].lazy*(tree[rt<<1].r-tree[rt<<1].l+1);
tree[rt<<1|1].sum+=tree[rt].lazy*(tree[rt<<1|1].r-tree[rt<<1|1].l+1);
}
}
void update(int rt,int l,int r,int c){
if(tree[rt].l>r||tree[rt].r<l)return;
if(tree[rt].l>=l&&tree[rt].r<=r){
tree[rt].lazy+=c;
tree[rt].sum+=c*(tree[rt].r-tree[rt].l+1);
return;
}
push_down(rt);
int mid=(l+r)>>1;
if(l<=mid)update(rt<<1,l,r,c);
if(mid+1<=r)update(rt<<1|1,l,r,c);
push_up(rt);
}
int query(int rt ,int l,int r){
if(tree[rt].l>r||tree[rt].r<l)return 0;
if(tree[rt].l>=l&&tree[rt].r<=r)return tree[rt].sum;
push_down(rt);
return query(rt<<1,l,r)+query(rt<<1|1,l,r);
}
int main()
{
for(int i=1;i<=10;i++){
a[i]=i;
}
build(1,1,10);
for(int i=1;i<=10;i++){
cout<<query(1,i,i)<<endl;
}
cout<<"就哈"<<endl;
cout<<tree[1].sum<<endl;
int res=query(1,3,7);
cout<<res<<endl;
update(1,1,9,10);
cout<<tree[1].sum<<endl;
cout<<query(1,9,10)<<endl;
for(int i=1;i<=10;i++){
cout<<query(1,i,i)<<endl;
}
return 0;
}