Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
34206 baka24 【S】T4 C++ 运行出错 0 0 MS 88 KB 2615 2024-11-03 20:26:04

Tests(0/20):


#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back #define inx(u) int I=h[(u)],v=edge[I].v,w=edge[I].w;I;I=edge[I].nx,v=edge[I].v,w=edge[I].w int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=5010,N=20,inf=2000000000; int n,s,m,ans,a[MAXN],p[MAXN]; struct Edge{int v,nx,w;}edge[MAXN<<1];int h[MAXN],CNT;void add_side(int u,int v,int w){ // cout<<u<<" "<<v<<" "<<w<<endl; edge[++CNT]={v,h[u],w};h[u]=CNT;} bool w0,p0,a0,c[MAXN],vis[MAXN]; int e[MAXN],cnt,hs[MAXN]; bool dfs_chk(int u){ for(inx(u)){ if(v==s){ e[++cnt]=u; hs[u]=1; return 1; } bool tmp=dfs_chk(v); if(tmp){ e[++cnt]=u; hs[u]=1; return 1; } } return 0; } int f[MAXN][MAXN],g[MAXN][MAXN][3]; void dfs(int u){ for(int k=0;k<=n;k++)f[u][k]=k%2*a[u]-p[u]*k; for(inx(u))if(!hs[v]){ dfs(v); int tmp=f[v][0]; for(int k=0;k<=n;k++){ tmp=max(tmp,f[v][k]); f[u][k]+=tmp; } } } void slv(){ for(int i=1;i<=n;i++)h[i]=c[i]=a[i]=p[i]=0;w0=p0=0;CNT=cnt=ans=0; n=read(),s=read(); for(int i=1;i<=n;i++)a[i]=read(); for(int i=1;i<=n;i++)p[i]=read(); for(int i=1;i<=n;i++)add_side(read(),i,p[i]); bool ty=dfs_chk(s); if(!ty){ dfs(s); printf("%lld\n",max(f[s][1],f[s][2])+p[s]); } else{ for(int i=1;i<=cnt;i++)dfs(e[i]); if(cnt==2){ printf("%lld\n",max(f[e[1]][0]+f[e[2]][2],max(f[e[1]][1]+f[e[2]][1],f[e[1]][0]+f[e[2]][1]))); } else{ for(int i=1;i<=cnt;i++){ for(int j=0;j<=n;j++){ int tmp=g[i-1][j][0]; for(int k=0;k<=2;k++){ tmp=max(tmp,g[i-1][j][k]); g[i][j][k]=f[e[i]][j+k]+tmp; // cout<<i<<","<<j+k<<":"<<g[i][j][k]<<endl; } } // cout<<endl; } int ans=0; for(int i=0;i<=n;i++)for(int k=0;k<3;k++)if(i+k>0&&i+k<=n)ans=max(ans,g[cnt][i][k]); printf("%lld\n",ans+p[s]); } } } signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); int _=read();while(_--) slv(); return 0; }


测评信息: