Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
37711 | LYLAKIOIAKIOI | 【BJ】T1 | C++ | 通过 | 100 | 192 MS | 33136 KB | 2534 | 2025-05-02 14:33:24 |
#include<bits/stdc++.h> using namespace std; const int N=2050; int n,m; int w[N],s[N],v[N<<1],buc[N<<1]; namespace sub1{ bool chk(){ return (n<=20)&&(m<=20); } void slv(){ int U=(1<<n)-1;int ans=0; for(int S=0;S<=U;S++){ int res=0; int val=1e9;bool flg=1; vector<int> mdf; for(int i=0;i<n;i++){ if((S>>i)&1){ if(w[i+1]<=val){ val=w[i+1]; res+=v[w[i+1]];res-=s[i+1]; buc[w[i+1]]++;mdf.push_back(w[i+1]); int now=w[i+1]; while(buc[now]>=2){ //cout<<now<<' '<<buc[now]<<endl; int vl=buc[now];buc[now]%=2; res+=(vl/2)*v[now+1]; buc[now+1]+=vl/2;mdf.push_back(now+1); now++; } }else{ flg=0; } } }for(auto ed:mdf) buc[ed]=0; if(!flg) continue; ans=max(ans,res);//cout<<S<<' '<<res<<endl; }cout<<ans<<endl; } } void cmx(int &a,int b){if(b>a) a=b;} namespace sub2{ int f[N<<1][N],lim[N<<1]; bool chk(){ return (n<=220)&&(m<=220); }void slv(){ memset(f,0xc0,sizeof(f)); for(int i=0;i<=n+m;i++) f[i][0]=0,lim[i]=0; for(int i=n;i>=1;i--){ int id=(i&1); //memset(f[id],0,sizeof(f[id])); for(int j=n;j>=0;j--){ cmx(f[w[i]][j+1],f[w[i]][j]-s[i]+v[w[i]]); } int now=w[i],val=n; while(now<=n+m){ for(int j=val;j>=0;j--){ cmx(f[now+1][j/2],f[now][j]+(j/2)*v[now+1]); }val/=2;now++; } // /*for(int j=0;j<=n+m;j++){ for(int k=0;k<=n;k++){ cout<<f[j][k]<<' '; }cout<<endl; }cout<<endl;*/ // }int ans=0; for(int i=0;i<=n+m;i++){ for(int j=0;j<=1;j++) cmx(ans,f[i][j]); }cout<<ans<<endl; } }// 200 int main(){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>w[i]; for(int i=1;i<=n;i++) cin>>s[i]; for(int i=1;i<=n+m;i++) cin>>v[i]; if(sub1::chk()) sub1::slv(); else sub2::slv(); return 0; }