Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34220 | baka24 | 【S】T4 | C++ | 运行出错 | 0 | 0 MS | 84 KB | 2841 | 2024-11-03 20:52:57 |
#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;} 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&1)*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]=a[i]=p[i]=e[i]=hs[i]=0;CNT=1,cnt=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++){ int x=read(); // add_side(x,i,p[i]); } return; // 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){ // // cout<<e[1]<<" "<<f[e[1]][0]<<" "<<f[e[1]][1]<<" "<<f[e[1]][2]<<endl; // // cout<<e[2]<<" "<<f[e[2]][0]<<" "<<f[e[2]][1]<<" "<<f[e[2]][2]<<endl; // printf("%lld\n",p[s]+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&&j+k<=n;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; // } // ans=-inf; // 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(){ int _=read();while(_--) slv(); return 0; }