2022 CCPC 广州站 Alice and Her Lost Cat

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 #define rg register
  4 #define ll long long
  5 #define ld long double
  6 #define FOR(i,a,b) for(register int i=a;i<=b;++i)
  7 #define For(i,a,b) for(register int i=a;i>=b;--i)
  8 static char buf[100000],*pa(buf),*pb(buf);
  9 inline int rd();inline void wrt(int x);inline ll rdll();inline void wrtll(ll x);
 10 #define gc getchar()
 11 const ll INF=1E+17,modd=998244353,N=2E+3+10;
 12 
 13 int T,n,fa[N],mx1[N];
 14 ll a[N],t[N],f[N][N][2],bagg[N],bg[N][2],ans;
 15 vector<int> chd[N],cd[N];
 16 bool vis[N],vis1[N];
 17 
 18 void ps(int u)
 19 {
 20     vis1[u]=1;
 21     FOR(i,0,int(cd[u].size())-1)
 22     {
 23         int v=cd[u][i];
 24         if(vis1[v])
 25         {
 26             chd[v].push_back(u);
 27             fa[u]=v;
 28         }
 29         else ps(v);
 30     }
 31 }
 32 
 33 void doo(int u)
 34 {
 35     vis[u]=1;
 36     if(chd[u].size()==0)
 37     {
 38         f[u][0][1]=0;
 39         f[u][0][0]=a[u];
 40         f[u][1][0]=0;
 41         mx1[u]=1;return;
 42     }
 43     FOR(i,0,int(chd[u].size())-1)
 44     {
 45         int v=chd[u][i];
 46         if(!vis[v]) doo(v);
 47         mx1[u]+=mx1[v];
 48     }
 49     //bb1
 50     memset(bagg,3,sizeof(bagg));bagg[0]=0;
 51     FOR(i,0,int(chd[u].size())-1) For(j,mx1[u],0) 
 52     {
 53         bagg[j]=bagg[j]+f[chd[u][i]][0][0];
 54         FOR(k,1,j)
 55             bagg[j]=min(bagg[j],bagg[j-k]+f[chd[u][i]][k][0]);
 56     }
 57     FOR(i,0,mx1[u]) f[u][i][0]=min(f[u][i][0],bagg[i]);
 58     //bb2
 59     memset(bagg,3,sizeof(bagg));bagg[0]=0;
 60     FOR(i,0,int(chd[u].size())-1) For(j,mx1[u],0) 
 61     {
 62         bagg[j]=bagg[j]+min(f[chd[u][i]][0][0],f[chd[u][i]][0][1]);
 63         FOR(k,1,j)
 64             bagg[j]=min(bagg[j],bagg[j-k]+min(f[chd[u][i]][k][0],f[chd[u][i]][k][1]));
 65     }
 66     FOR(i,0,mx1[u]) f[u][i][0]=min(f[u][i][0],bagg[i]+a[u]);
 67     //bb3
 68     memset(bg,3,sizeof(bg));bg[0][0]=0;
 69     FOR(i,0,int(chd[u].size())-1) For(j,mx1[u],0) 
 70     {
 71         bg[j][1]=min(bg[j][1]+f[chd[u][i]][0][0],bg[j][0]+f[chd[u][i]][0][1]);
 72         bg[j][0]=bg[j][0]+f[chd[u][i]][0][0];
 73         FOR(k,1,j)
 74             bg[j][1]=min(bg[j][1],bg[j-k][0]+f[chd[u][i]][k][1]),
 75             bg[j][1]=min(bg[j][1],bg[j-k][1]+f[chd[u][i]][k][0]),
 76             bg[j][0]=min(bg[j][0],bg[j-k][0]+f[chd[u][i]][k][0]);
 77     }
 78     FOR(i,0,mx1[u]) f[u][i][1]=min(f[u][i][1],min(bg[i][0],bg[i][1]));
 79     return;
 80 }
 81 
 82 int main()
 83 {
 84     T=rd();while(T--){
 85     memset(f,3,sizeof(f));
 86     ans=INF;
 87     memset(mx1,0,sizeof(mx1));
 88     memset(vis,0,sizeof(vis));
 89     memset(vis1,0,sizeof(vis1));
 90     //f0
 91     n=rd();
 92     FOR(i,1,n) chd[i].clear(),cd[i].clear();
 93     //FOR(i,1,n) cout<<chd[i].size()<<" ";cout<<endl;
 94     FOR(i,1,n) a[i]=rdll();
 95     FOR(i,1,n) t[i]=rdll();
 96     FOR(i,1,n-1) 
 97     {
 98         int u=rd(),v=rd();
 99         cd[u].push_back(v);
100         cd[v].push_back(u);
101     }
102     ps(1);
103     doo(1);
104     FOR(i,0,mx1[1]) ans=min(ans,t[i]+min(f[1][i][0],f[1][i][1]));
105     cout<<ans<<endl;
106     }return 0;
107 }
108 inline int rd()
109 {
110     register int x(0);register char c(gc);bool bbb=1;
111     if(c=='-') {bbb=0;c=gc;}
112     while(c<'0'||c>'9')c=gc;
113     while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=gc;
114     if(bbb)return x;else return -x;
115 }
116 inline ll rdll()
117 {
118     register ll x(0);register char c(gc);bool bbb=1;
119     if(c=='-') {bbb=0;c=gc;}
120     while(c<'0'||c>'9')c=gc;
121     while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=gc;
122     if(bbb)return x;else return -x;
123 }

 

posted @ 2022-11-14 18:35  universeplayer  阅读(234)  评论(0编辑  收藏  举报