提交时间:2024-11-04 08:18:46

运行 ID: 34246

#include<bits/stdc++.h> #define ll long long using namespace std; const int N=5e3+10; int w[N],p[N],a[N]; int c[N];int n,s;ll py=0; int calc(){ ll res=0; for(int i=1;i<=n;i++){ if(c[i]) res+=w[i]; }return res-py; }vector<int> E[N],G[N]; bool in_r[N]; ll f[N][N]; ll g[N][4]; int du[N]; void topo(){ queue<int> q; for(int i=1;i<=n;i++) for(auto ed:G[i]) du[ed]++; for(int i=1;i<=n;i++) if(du[i]==0) q.push(i); while(!q.empty()){ int p=q.front();q.pop();in_r[p]=0; for(auto ed:G[p]){ du[ed]--; if(du[ed]==0) q.push(ed); } } }void dfs(int u){ for(int i=0;i<=n;i++) f[u][i]=1ll*(i%2)*w[u]-1ll*i*p[u]; for(auto v:E[u]){ if(!in_r[v]) dfs(v); else continue; for(int i=1;i<=n;i++) f[v][i]=max(f[v][i],f[v][i-1]); for(int i=0;i<=n;i++) f[u][i]+=f[v][i]; }if(u==s) f[u][0]=-(1e18+10); }void dp(int u,int d){ //for(int i=0;i<=n;i++) for(int j=0;j<=2;j++) g[1][i][j]=-(1e18+10); for(int i=0;i<=n;i++){ for(int j=2;j>=0;j--){ ll tmp=-(1e18+10); for(int k=j;k>=0;k--){ if(i+j-k<0) continue; ll vl=0;if(d>1) vl=g[i+j-k][k]; tmp=max(tmp,vl+f[u][j]); }g[i][j]=tmp; } }//for(int i=0;i<=n;i++) for(int j=0;j<=2;j++) g[0][i][j]=g[1][i][j]; if(u==s) return ; for(auto v:G[u]){ if(in_r[v]) dp(v,d+1); } } void slv(){ 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[i].clear(),G[i].clear(); for(int i=1;i<=n;i++) E[a[i]].push_back(i),G[i].push_back(a[i]); for(int i=1;i<=n;i++) in_r[i]=1,du[i]=0;topo(); for(int i=0;i<=n;i++) for(int j=0;j<=2;j++) g[i][j]=-(1e18+10); //for(int i=1;i<=n;i++) cout<<in_r[i]<<' ';cout<<endl; ll ans=-(1e18+10); if(in_r[s]==0){ dfs(s); for(int i=1;i<=2;i++) ans=max(ans,f[s][i]); }else{ int cnt=0;//cout<<"jp8"; //for(int i=1;i<=n;i++) cout<<in_r[i]<<' '; for(int i=1;i<=n;i++) if(in_r[i]) dfs(i),cnt++; //cout<<"! "<<cnt<<endl; int nx=a[s];//cout<<f[nx][0]<<endl; if(cnt==2){ ans=max(max(f[nx][0]+f[s][1],f[nx][0]+f[s][2]),f[nx][1]+f[s][1]); }else{ dp(a[s],1); for(int i=0;i<=n;i++) for(int j=0;j<=2;j++) ans=max(ans,g[i][j]); } }cout<<ans+p[s]<<'\n'; } int main(){ int t;cin>>t;while(t--) slv(); return 0; }