Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
37711 LYLAKIOIAKIOI 【BJ】T1 C++ 通过 100 192 MS 33136 KB 2534 2025-05-02 14:33:24

Tests(65/65):


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


测评信息: