牛客网暑期ACM多校训练营(第七场)

zscoder场
A
签到

#include<bits/stdc++.h>
using namespace std;
int n,p[500000];

void find(int n){
    if(n<0) return;
    int x=1;
    while(x<=n)
        x<<=1;
    for(int i=n; i>=(x>>1); i--){
        p[i]=x-1-i;
        p[x-1-i]=i;
    }
    find(x-1-n-1);
    return;
}

int main(){
    scanf("%d",&n);
    find(n-1);
    for(int i=0; i<n; i++){
        printf("%d%c",p[i],i==n-1?'\n':' ');
    }
    return 0;
}

C
暴力

#include <bits/stdc++.h>
using namespace std;
unordered_map<string,int>mp[20];
string s;
string t;
int main(){
    int n;
    cin>>n>>s;
    mp[0][s]=1;
    for(int i=1;i<=n;i++){
        for(auto it=mp[i-1].begin();it!=mp[i-1].end();it++){
            s=it->first;
            t="";
            int len=(1<<(n+1-i));
            for(int j=0;j<len;j+=2){
                t+=((s[j]-'0')|(s[j+1]-'0'))+'0';
            }
            mp[i][t]+=it->second;
            t="";
            for(int j=0;j<len;j+=2){
                t+=((s[j]-'0')&(s[j+1]-'0'))+'0';
            }
            mp[i][t]+=it->second;
            t="";
            for(int j=0;j<len;j+=2){
                t+=((s[j]-'0')^(s[j+1]-'0'))+'0';
            }
            mp[i][t]+=it->second;
        }
    }
    cout<<mp[n]["1"]<<endl;
    //cout << "Totle Time : " << (double)clock() /CLOCKS_PER_SEC<< "s" << endl;
}

E
据说可以留五个点背包,比赛的时候不知道写的什么东西

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int k,n=0,m=0;
int u[10000],v[10000];
int c4[76]={0,0,0,0,1};
int c3[76]={0,0,0,1};
int c2[76]={0,0,1};
bool vis[70000];
int numa[70000],numb[70000],numc[70000];

void init(){
    for(int i=5; i<=75; i++){
        c4[i]=c4[i-1]*i/(i-4);
    }
    for(int i=4; i<=75; i++){
        c3[i]=c3[i-1]*i/(i-3);
    }
    for(int i=3; i<=75; i++){
        c2[i]=c2[i-1]*i/(i-2);
    }
    /*
    for(int i=1; i<=75; i++){
        cout<<i<<": "<<c2[i]<<" "<<c3[i]<<" "<<c4[i]<<endl;
    }
    */
}

int main(){
    init();
    scanf("%d",&k);
    int t4=75;
    while(c4[t4]>k) t4--;
    for(int i=1; i<=t4; i++){
        for(int j=i+1; j<=t4; j++){
            m++;
            u[m]=i;
            v[m]=j;
        }
    }
    n=t4+4;
    k-=c4[t4];
    int tmp=0;
    memset(vis,0,sizeof(vis));
    for(int a=0; a<=t4; a++){
        tmp+=c3[a];
        if(tmp<=k)
            for(int b=0; b<=t4; b++){
                tmp+=c3[b];
                if(tmp<=k)
                    for(int c=max(0,a+b-t4); c<=min(a,b); c++){
                        tmp+=c2[c];
                            if(tmp<=k && !vis[tmp]){
                                vis[tmp]=1;
                                numa[tmp]=a;
                                numb[tmp]=b;
                                numc[tmp]=c;
                            }
                        tmp-=c2[c];
                    }
                tmp-=c3[b];
            }
        tmp-=c3[a];
    }
    //cout<<"haha"<<endl;
    for(int i=0; i<=k; i++){
        if(vis[i] && vis[k-i]){
            int a=numa[i],b=numb[i],c=numc[i];
            for(int j=1; j<=a; j++){
                m++;
                u[m]=j;
                v[m]=t4+1;
            }
            for(int j=a+1-c; j<=a+b-c; j++){
                m++;
                u[m]=j;
                v[m]=t4+2;
            }
            m++;
            u[m]=t4+1;
            v[m]=t4+2;
            a=numa[k-i],b=numb[k-i],c=numc[k-i];
            for(int j=1; j<=a; j++){
                m++;
                u[m]=j;
                v[m]=t4+3;
            }
            for(int j=a+1-c; j<=a+b-c; j++){
                m++;
                u[m]=j;
                v[m]=t4+4;
            }
            m++;
            u[m]=t4+3;
            v[m]=t4+4;
            break;
        }
    }
    printf("%d %d\n",n,m);

    for(int i=1; i<=m; i++){
        printf("%d %d\n",u[i],v[i]);
    }

    //cout<<"hehe"<<endl;
    return 0;
}

J
随便dp下

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1010;
char s[N][N];
int n,m;
int pos[200],lmax[N][N],umax[N][N];
ll ans;
int len[60];
void init(){
    ans=0;
    for(int i=1; i<=n; i++){
        memset(pos,0,sizeof(pos));
        for(int j=1; j<=m; j++){
            lmax[i][j]=min(lmax[i][j-1]+1,j-pos[s[i][j]]);
            pos[s[i][j]]=j;
        }
    }
    for(int j=1; j<=m; j++){
        memset(pos,0,sizeof(pos));
        for(int i=1; i<=n; i++){
            umax[i][j]=min(umax[i-1][j]+1,i-pos[s[i][j]]);
            pos[s[i][j]]=i;
        }
    }
    for(int r=1; r<=m; r++){
        memset(len,0,sizeof(len));
        for(int d=1; d<=n; d++){
            for(int i=0; i<lmax[d][r]; i++){
                len[i]=min(len[i]+1,umax[d][r-i]);
                if(i)
                    len[i]=min(len[i],len[i-1]);
                ans+=len[i];
            }
            for(int i=lmax[d][r]; i<=54; i++)
                len[i]=0;
        }
    }
}

int main(){
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++){
        scanf("%s",s[i]+1);
    }
    init();
    printf("%lld\n",ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值