ABC261

C

用map存一下就行了

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+1;
int n;
char s[N][21];
map<string,int>v;
int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int main(){
    n=read();
    for(int i=1;i<=n;i++) cin>>s[i];
    for(int i=1;i<=n;i++){
        if(v.count(s[i])){
            v[s[i]]=v[s[i]]+1;
            cout<<s[i]<<"("<<v[s[i]]<<")"<<endl;
        }
        else{
            v.insert(pair<string,int>(s[i],0));
            cout<<s[i]<<endl;
        }
    }
	return 0;
}

D

\(f[n][v][0/1]\)表示第n次硬币向上或向下,分数为v时的最大值,再注意一下细节

#include<bits/stdc++.h>
using namespace std;
const int N=5e3+1;
int n,m,a[N],w[N];
long long ans,f[N][N][2];
int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int main(){
    n=read();m=read();
    for(int i=1;i<=n;i++) a[i]=read();
    for(int i=1;i<=m;i++){
        int x=read();
        w[x]+=read();
    }
    for(int i=1;i<=n;i++)
        for(int j=0;j<=i;j++){
            long long tmp=max(f[i-1][0][0]+w[0],f[i-1][j][1]+w[0]);
            f[i][0][0]=max(f[i][0][0],tmp);
            if(j){
                if(j==1) f[i][j][1]=a[i]+w[j]+max(f[i-1][0][0],f[i-1][j-1][1]);
                else f[i][j][1]=a[i]+w[j]+f[i-1][j-1][1];
            }
        }
    ans=max(ans,f[n][0][0]);
    for(int i=0;i<=n;i++)
        ans=max(f[n][i][1],ans);
    printf("%lld",ans);
	return 0;
}

E

我们可以对所有操作一位一位的来考虑,设\(f[k][0/1]\)表示在进行了系列操作后,当第k位为0获1时,会变成什么

这样我们便不用每次重复操作

#include<bits/stdc++.h>
using namespace std;
int n,val;
int f[2][31],ans[31];
void work(int op,int v){
    int cnt=0;
    for(int i=1;i<=30;i++){
        int t=v&1;
        ++cnt;v=v>>1;
        if(op==1) f[0][cnt]=f[0][cnt]&t,f[1][cnt]=f[1][cnt]&t;
        if(op==2) f[0][cnt]=f[0][cnt]|t,f[1][cnt]=f[1][cnt]|t;
        if(op==3) f[0][cnt]=f[0][cnt]^t,f[1][cnt]=f[1][cnt]^t;
    }
}
int qpow(){
    int re=0,v=1;
    for(int i=1;i<=30;i++){
        if(ans[i]) re+=v;
        v=v<<1;
    }
    return re;
}
void calc(){
    int tmp=val;
    for(int i=1;i<=30;i++){
        ans[i]=0;
        int t=tmp&1;
        ans[i]=f[t][i];
        tmp=tmp>>1;
    }
    val=qpow();
}
int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int main(){
    n=read();val=read();
    for(int i=0;i<31;i++)
        f[0][i]=0,f[1][i]=1;
    for(int i=1;i<=n;i++){
        int op=read(),v=read();
        work(op,v);calc();
        printf("%d\n",val);
    }
	return 0;
}

posted @ 2022-07-24 21:42  DQY_dqy  阅读(36)  评论(0编辑  收藏  举报