HDU 6662 Acesrc and Travel 换根DP,宇宙最傻记录

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn=1e6+50;
const ll mod=1e9+7;

int a[maxn],b[maxn];
vector<int>G[maxn];
ll dp[maxn][2]; /// 0 zhang 1 liu
ll hello[maxn][2];
ll hello2[maxn][2];
int who1[maxn][2];
int who2[maxn][2];

void go1(int u,int v){
    who1[u][1]=who1[u][0];
    who1[u][0]=v;
}
void go2(int u,int v){
    who2[u][1]=who2[u][0];
    who2[u][0]=v;
}

ll flag[maxn];
int n;
void dfs1(int u,int f){
    dp[u][0]=a[u]-b[u];
    dp[u][1]=b[u]-a[u];
    for(auto i:G[u]){
        if(i==f)continue;
        dfs1(i,u);
        int v=i;
        if(dp[v][0]>dp[who1[u][0]][0]){
            go1(u,v);
        }
        else if(dp[v][0]>dp[who1[u][1]][0]){
            who1[u][1]=v;
        }
        if(dp[v][1]>dp[who2[u][0]][1]){
            go2(u,v);
        }
        else if(dp[v][1]>dp[who2[u][1]][1]){
            who2[u][1]=v;
        }
    }
    if(who1[u][0]!=0){
        dp[u][0]-=dp[who2[u][0]][1];
        dp[u][1]-=dp[who1[u][0]][0];
    }
   /*
   cout<<"dp["<<u<<"]["<<0<<"]="<<dp[u][0]<<endl;
    cout<<"dp["<<u<<"]["<<1<<"]="<<dp[u][1]<<endl;
    for(int i=1;i<=2;i++){
        for(int j=0;j<=1;j++){
            if(i==1)cout<<"who1["<<u<<"]["<<j<<"]="<<who1[u][j]<<endl;
            else cout<<"who2["<<u<<"]["<<j<<"]="<<who2[u][j]<<endl;
        }
    }
    */
}
ll sum[maxn];
int tmp1[maxn][2];
int tmp2[maxn][2];
int tmp3[maxn][2];
int tmp4[maxn][2];
ll aha1[maxn][2];
ll aha2[maxn][2];

void dfs2(int u,int f){
    sum[u]=dp[u][0];
   // cout<<"dp["<<u<<"]["<<0<<"]="<<dp[u][0]<<endl;
    for(auto t:G[u]){
        if(t==f)continue;
        int v=t;

        for(int i=0;i<=1;i++){
            aha1[u][i]=dp[u][i];
            aha2[u][i]=dp[v][i];
        }

        dp[u][0]+=dp[who2[u][0]][1];
        dp[u][1]+=dp[who1[u][0]][0];


        for(int j=0;j<=1;j++){
            tmp1[u][j]=who1[u][j];
            tmp2[u][j]=who2[u][j];
            tmp3[u][j]=who1[v][j];
            tmp4[u][j]=who2[v][j];
        }


        if(who1[u][0]==v){
            who1[u][0]=who1[u][1];
        }
        if(who2[u][0]==v){
            who2[u][0]=who2[u][1];
        }
        if(who1[u][0]!=0){
            dp[u][0]-=dp[who2[u][0]][1];
            dp[u][1]-=dp[who1[u][0]][0];
        }

        if(who1[v][0]!=0){
            dp[v][0]+=dp[who2[v][0]][1];
            dp[v][1]+=dp[who1[v][0]][0];
        }

        if(dp[u][0]>dp[who1[v][0]][0]){
            go1(v,u);
        }
        else if(dp[u][0]>dp[who1[v][1]][0]){
            who1[v][1]=u;
        }
        if(dp[u][1]>dp[who2[v][0]][1]){
            go2(v,u);
        }
        else if(dp[u][1]>dp[who2[v][1]][1]){
            who2[v][1]=u;
        }

        if(who1[v][0]!=0){
            dp[v][0]-=dp[who2[v][0]][1];
            dp[v][1]-=dp[who1[v][0]][0];
        }

      //  cout<<"dp["<<u<<"]["<<0<<"]="<<dp[u][0]<<endl;
      //  cout<<"dp["<<u<<"]["<<1<<"]="<<dp[u][1]<<endl;
     /*   for(int i=1;i<=2;i++){
            for(int j=0;j<=1;j++){
                if(i==1)cout<<"who1["<<u<<"]["<<j<<"]="<<who1[u][j]<<endl;
                else cout<<"who2["<<u<<"]["<<j<<"]="<<who2[u][j]<<endl;
            }
        }*/

       /* cout<<"***************"<<endl;
        cout<<"dp["<<v<<"]["<<0<<"]="<<dp[v][0]<<endl;
        cout<<"dp["<<v<<"]["<<1<<"]="<<dp[v][1]<<endl;*/
        /*for(int i=1;i<=2;i++){
            for(int j=0;j<=1;j++){
                if(i==1)cout<<"who1["<<v<<"]["<<j<<"]="<<who1[v][j]<<endl;
                else cout<<"who2["<<v<<"]["<<j<<"]="<<who2[v][j]<<endl;
            }
        }

        cout<<"nnnnnnnnnnnnnnn"<<endl;*/
        dfs2(v,u);


        dp[v][0]+=dp[who2[v][0]][1];
        dp[v][1]+=dp[who1[v][0]][0];

        for(int j=0;j<=1;j++){
            who1[u][j]=tmp1[u][j];
            who2[u][j]=tmp2[u][j];
            who1[v][j]=tmp3[u][j];
            who2[v][j]=tmp4[u][j];
        }
        if(who1[v][0]!=0){
            dp[v][0]-=dp[who2[v][0]][1];
            dp[v][1]-=dp[who1[v][0]][0];
        }
        dp[u][0]-=dp[who2[u][0]][1];
        dp[u][1]-=dp[who1[u][0]][0];
/*
        for(int j=1;j<=2;j++){
        for(int k=0;k<=1;k++){
            if(j==1){
                cout<<"who1["<<u<<"]["<<k<<"]="<<who1[u][k]<<endl;
            }
            else{
                cout<<"who1["<<u<<"]["<<k<<"]="<<who2[u][k]<<endl;
            }
        }
       }*/
        for(int i=0;i<=1;i++){
            dp[u][i]=aha1[u][i];
            dp[v][i]=aha2[u][i];
        }
    }
}

int main(){
    std::ios::sync_with_stdio(false);
    int t;
    cin>>t;
    dp[0][0]=-1e18;
    dp[0][1]=-1e18;
    while(t--){
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            G[i].clear();
            dp[i][0]=dp[i][1]=0;
            sum[i]=0;
            hello[i][0]=hello[i][1]=0;
            who1[i][0]=who1[i][1]=0;
            who2[i][0]=who2[i][1]=0;
        }
        for(int i=1;i<=n;i++)cin>>b[i];
        for(int i=1;i<n;i++){
            int u,v;cin>>u>>v;
            G[u].push_back(v);
            G[v].push_back(u);
        }

        dfs1(1,0);
       // cout<<"**************"<<endl;
        dfs2(1,0);
        ll ans=0;
        ll mx=-1e18;
        for(int i=1;i<=n;i++){
            mx=max(sum[i],mx);
        }
        cout<<mx<<endl;
    }
    return 0;
}
/*
5
5
1 2 4 100 1000
5 3 7 0 0
1 2
1 3
3 4
3 5

*/

posted @ 2019-08-14 18:18  luowentao  阅读(328)  评论(0编辑  收藏  举报