蓝桥杯准备的模板

一丶并查集

#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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值