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