提交时间:2024-11-03 17:08:12

运行 ID: 34187

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back typedef long long ll; using namespace std; const int maxn=5e5+10,mod=1e9+7; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,s,w[maxn],p[maxn],a[maxn],vis[maxn],tg[maxn],inc[maxn]; ll dp[5005][5005],DP[2][5005][3]; vector<int>cyc,v[maxn]; void fc(){ up(i,1,n)tg[i]=inc[i]=0; int u=s;vector<int>A; while(!tg[u])A.p_b(u),tg[u]=u,u=a[u]; down(i,int(A.size())-1,0)if(A[i]==u){ cyc.clear(); up(j,i+1,int(A.size())-1)inc[A[j]]=1,cyc.p_b(A[j]);inc[u]=1; cyc.p_b(u); break; } } void dfs(int u){ up(i,0,n)dp[u][i]=0; for(int x:v[u]){ if(inc[x])continue; dfs(x);ll mx=0; up(j,0,n)mx=max(mx,dp[x][j]),dp[u][j]+=mx; }up(i,0,n){ if(i&1)dp[u][i]+=w[u]; if(u==s)dp[u][i]-=p[u]*1ll*(i-1); else dp[u][i]-=p[u]*1ll*i; }if(u==s)dp[u][0]=-1e18; } void slv(){ n=read(),s=read(); up(i,1,n)v[i].clear(); up(i,1,n)w[i]=read();up(i,1,n)p[i]=read();up(i,1,n)a[i]=read(),v[a[i]].p_b(i); fc();if(!inc[s]){dfs(s);printf("%lld\n",max(dp[s][1],dp[s][2]));return;} int sz=cyc.size(); if(sz==2){ dfs(cyc[0]),dfs(cyc[1]); printf("%lld\n",max({ dp[cyc[0]][0]+dp[cyc[1]][1],dp[cyc[0]][1]+dp[cyc[1]][1],dp[cyc[0]][0]+dp[cyc[1]][2] })); return; } up(i,0,sz-1){ int op=i&1; dfs(cyc[i]); //printf("%d\n",i); //up(j,0,n)printf("! %lld\n",dp[cyc[i]][j]); if(!i){ up(j,0,n)up(k,0,2)DP[op][j][k]=dp[cyc[i]][j]; }else { up(j,0,n)up(k,0,2)DP[op][j][k]=-1e18; up(j,0,n)up(k,0,2)up(ct,0,k)if(j>=ct)DP[op][j][k]=max(DP[op][j][k],DP[!op][j-ct][k-ct]+dp[cyc[i]][j]); } }ll mx=-1e18; up(j,0,n)up(k,0,2)mx=max(mx,DP[(sz-1)&1][j][k]); printf("%lld\n",mx); } int main(){ //freopen("color.in","r",stdin); //freopen("color.out","w",stdout); int t=read();while(t--)slv(); fclose(stdin); fclose(stdout); return 0; }