zoukankan      html  css  js  c++  java
  • 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
    
    */
    
    
  • 相关阅读:
    信息安全大赛出的题目
    RedHat6 —— 配置IP地址
    PHP环境下配置WebGrind——让你的网站性能看得见
    PHP实例——验证邮件的主机是否存在
    Linux ——记一记那恐怖的 rm f
    这大半天就耗在一个jQuery跨域Json上了——jQuery跨域获取json数据总结
    常用的Mysql数据库操作语句大全
    ZOJ 3209 Treasure Map
    HDU 3452 Bonsai
    HDU 2577 How to Type
  • 原文地址:https://www.cnblogs.com/luowentao/p/11353842.html
Copyright © 2011-2022 走看看