Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
34266 swzzzz 【S】T4 C++ 解答错误 10 70 MS 664 KB 1897 2024-11-04 11:14:45

Tests(2/20):


#include<bits/stdc++.h> using namespace std; #define N 5005 #define ll long long int t; int n,s; int w[N],p[N],a[N]; vector<int>son[N]; bool vis[N],in_ring[N]; vector<int>ring; ll f[N]; void find(){ memset(vis,0,sizeof(vis)); memset(in_ring,0,sizeof(in_ring)); ring.clear(); int node=a[s]; while (!vis[node]) { vis[node]=1; node=a[node]; } int i=a[node]; ring.push_back(node); in_ring[node]=1; while (i!=node) { in_ring[i]=1; ring.push_back(i); i=a[i]; } } void dp(int x){ if(x==s || in_ring[x]) f[x]=0; else f[x]=w[x]-p[x]; for(int i:son[x]){ if(!in_ring[i]){ dp(i); f[x]+=f[i]; } } f[x]=max(f[x],(ll)0); } int main(){ //freopen("color3.in","r",stdin); //freopen("color3.out","w",stdout); cin>>t; while (t--) { memset(f,0,sizeof(f)); scanf("%d%d",&n,&s); for(int i=1;i<=n;i++) son[i].clear(); for(int i=1;i<=n;i++) scanf("%d",&w[i]); for(int i=1;i<=n;i++) scanf("%d",&p[i]); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); son[a[i]].push_back(i); } find(); if(!in_ring[s]) { dp(s); cout<<f[s]+w[s]; } else { ll tmp=0; ll ans=0; for(int i:ring){ dp(i); } //cout<<endl; tmp=f[s]+w[s]; ans=tmp; for(int i=ring.size()-2;i>=0;i--){ //cout<<ring[i+1]<<' '<<tmp<<endl; tmp+=f[ring[i]]+w[ring[i]]-p[ring[i]]; ans=max(ans,tmp); } //cout<<endl; cout<<ans; } cout<<endl; } return 0; }


测评信息: