提交时间:2024-01-04 14:32:12
运行 ID: 24586
#include<iostream> #include<map> #include<set> #include<cassert> #include<vector> #include<algorithm> using namespace std; const int N=2010; const int LG=11; int n,m,l[N],s[N],c[N<<1],sum[N<<1]; int lg[1<<(LG+1)]; void init(){ cin>>n>>m; for(int i=2;i<(1<<(LG+1));i++)lg[i]=lg[i>>1]+1; for(int i=1;i<=n;i++)cin>>l[i]; for(int i=1;i<=n;i++)cin>>s[i]; for(int i=1;i<=n+m;i++)cin>>c[i],sum[i]=sum[i-1]+c[i]; reverse(l+1,l+n+1); reverse(s+1,s+n+1); } inline int lowz(int x){return x^=((1<<(LG+2))-1),x&-x;} map<int,int>f[N]; int main(){ // freopen("read.in","r",stdin); init(); f[0][0]=0; int ans=0; for(int i=0;i<=n;i++){ for(auto x:f[i]){ ans=max(ans,x.second); for(int j=i+1;j<=n;j++)if(l[i]<=l[j]){ int d=l[j]-l[i]; if(d>LG){ if(f[j].count(1))f[j][1]=max(f[j][1],x.second+c[j]-s[j]); else f[j][1]=x.second+c[j]-s[j]; } else{ int nx=(x.first>>d)+1; if(f[j].count(nx))f[j][nx]=max(f[j][nx],x.second+sum[lg[lowz(x.first>>d)]+l[j]]-sum[l[j]-1]-s[j]); else f[j][nx]=x.second+sum[lg[lowz(x.first>>d)]+l[j]]-sum[l[j]-1]-s[j]; } } } } cout<<ans; return 0; }