Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
39008 LYLAKIOIAKIOI 【BJ】T2 C++ 解答错误 97 232 MS 198608 KB 3221 2025-12-08 18:47:01

Tests(166/171):


#include<bits/stdc++.h> #define ll long long using namespace std; const int N=5050,MS=1.1e6+10; int w[N],p[N],a[N]; int n,s; ll f[N][N],g[N][3],sum[N]; vector<int> E[N],iE[N],T[N]; int du[N],to[N];bool in_r[N]; int siz[N],loc[N];ll tmp[N]; void dfs(int u){ memset(f[u],0xc0,sizeof(f[u])); f[u][0]=0;int cur=1; for(auto v:T[u]){ dfs(v); for(int i=0;i<=n;i++) f[v][i]-=1ll*p[v]*i,tmp[i]=-1e18; for(int i=0;i<=cur;i++){ for(int j=0;j<=siz[v];j++){ tmp[max(i,j)]=max(tmp[max(i,j)],f[u][i]+f[v][j]); } }memcpy(f[u],tmp,sizeof(f[u])); cur+=siz[v]; }siz[u]=cur; for(int i=n;i>=0;i--){ if(i&1){ f[u][i+1]=max(f[u][i+1],f[u][i]); f[u][i]+=w[u]; }else{ f[u][i+1]=max(f[u][i+1],f[u][i]+w[u]); } } for(int i=0;i<=n;i++){ f[u][i+2]=max(f[u][i+2],f[u][i]); } /*for(int i=0;i<=n;i++){ cout<<u<<' '<<i<<' '<<f[u][i]<<endl; }*/ } int main(){ //freopen("coloring.in","r",stdin); //freopen("coloring.out","w",stdout); cin>>n>>s; for(int i=1;i<=n;i++) cin>>w[i]; for(int i=1;i<=n;i++) cin>>p[i]; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++){ E[a[i]].push_back(i); iE[i].push_back(a[i]);du[a[i]]++; } queue<int> q; for(int i=1;i<=n;i++)if(!du[i]) q.push(i); while(!q.empty()){ int p=q.front();q.pop(); for(auto ed:iE[p]){ du[ed]--; if(!du[ed]) q.push(ed); } } int cnt=0; for(int i=1;i<=n;i++){ if(du[i]) cnt++,in_r[i]=1; } for(int i=1;i<=n;i++){ for(auto j:E[i]){ if(in_r[i]&&in_r[j]){ to[i]=j; }else{ T[i].push_back(j); } } } ll ans=-1e18; if(!in_r[s]){ dfs(s); ans=max(f[s][1],f[s][2]-p[s]); }else{ for(int i=1;i<=n;i++){ if(in_r[i]) dfs(i); } if(to[to[s]]==s){ int t=to[s]; ans=max(f[s][1]+f[t][0],max(f[s][1]+f[t][1]-p[t],f[s][2]+f[t][0]-p[s])); }else{ int len=1;loc[len]=s; int now=to[s]; while(now!=s){ loc[++len]=now;now=to[now]; }memset(g,0xc0,sizeof(g)); ll tsum=0;sum[1]=0; for(int i=2;i<=len;i++) sum[i]=sum[i-1]+p[loc[i]]; tsum=sum[len]+p[s]; for(int i=0;i<=n;i++) g[i][0]=0; for(int i=len;i>=1;i--){ for(int j=n;j>=0;j--){ g[j][1]=max(g[j][1],g[j][0]-sum[i]); g[j][2]=max(g[j][2],g[j][1]-sum[i]-p[s]); for(int o=0;o<=2;o++){ g[j][o]=max(g[j][o]+f[loc[i]][j+o],(ll)-1e18); } //cout<<i<<' '<<loc[i]<<' '<<j<<' '<<g[j][0]<<' '<<g[j][1]<<' '<<g[j][2]<<' '<<endl; } }for(int i=0;i<=n;i++){ ans=max(ans,max(g[i][1],g[i][2])-tsum*i); } } }cout<<ans<<endl; return 0; }


测评信息: