Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34228 | yuanjiabao | 【S】T4 | C++ | 解答错误 | 0 | 1 MS | 416 KB | 1863 | 2024-11-03 21:14:36 |
#include<iostream> #include<cstring> using namespace std; #define int long long const int N=5010; inline int read(){ int i=getchar(),r=0,s=1; while(i<'0'||i>'9'){if(i=='-')s=-1;i=getchar();} while(i>='0'&&i<='9')r=(r<<1)+(r<<3)+(i^48),i=getchar(); return s*r; } int n,s,w[N],p[N],fa[N]; int deg[N],q[N],front,back; int son[N],bro[N]; int rt[N],cnt; void init(){ memset(deg,0,(n+5)*sizeof(int)); n=read(),s=read(); for(int i=1;i<=n;i++)w[i]=read(); for(int i=1;i<=n;i++)p[i]=read(); for(int i=1;i<=n;i++)fa[i]=read(),deg[fa[i]]++; front=back=cnt=0; // for(int i=1;i<=n;i++)if(!deg[i])q[++back]=i; // while(front<back){ // int nd=q[++front]; // bro[nd]=son[fa[nd]]; // son[fa[nd]]=nd; // if(!--deg[fa[nd]])q[++back]=fa[nd]; // } // if(deg[s]){ // rt[cnt++]=s; // while(fa[rt[cnt-1]]!=rt[0])rt[cnt]=fa[rt[cnt-1]],cnt++; // } } int f[N][N],mx[N][N]; void dp(int nd){ for(int i=son[nd];i;i=bro[i])dp(i); mx[nd][0]=0; for(int j=1;j<=n;j++){ f[nd][j]=(j%2)*w[nd]-j*p[nd]; for(int i=son[nd];i;i=bro[i])f[nd][j]+=mx[i][j]; mx[nd][j]=max(mx[nd][j-1],f[nd][j]); } } signed main(){ // freopen("color.in","r",stdin); // freopen("color.out","w",stdout); int T;cin>>T; while(T--){ init(); // if(!deg[s]){ // dp(s); // printf("%lld\n",mx[s][n]+p[s]); // continue; // } // for(int i=0;i<cnt;i++)dp(rt[i]); // if(cnt==2){ // int x=rt[0],y=rt[1]; // int ans=f[x][1]+f[y][0]+p[x]; // ans=max(ans,f[x][1]+f[y][1]+p[x]); // ans=max(ans,f[x][0]+f[y][0]-p[x]); // printf("%lld\n",ans); // } } return 0; }