提交时间:2024-11-03 20:51:58
运行 ID: 34218
#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; }