• Codeforces Round #527 (Div. 3) . F Tree with Maximum Cost


    题目链接
    题意:给你一棵树,让你找一个顶点ii,使得这个点的dis(i,j)a[j]sum dis(i,j)*a[j]最大。dis(i,j)dis(i,j)iijj的距离。
    思路:题解还是好看啊 先从1开始搜,预处理出当1为根的时候的答案记为resres,递归的过程中假设当前节点为ii,那么sum[i]sum[i]数组的意义就是:从以当前顶点为根的所有子树的所有节点的权值和记为sum[i]sum[i]
    预处理完成之后就是题解中神奇的re-rooting(换根)。 还是从1开始递归,假设当前根为vv,他的一个子节点为toto,那么v>tov->to就是一个换根过程,需要做一下转变,类似于莫队的转移 ,首先由于根的变化,之前v到nownow的某个子节点的距离是x+1x+1的话,那么nownow为根的时候这个距离就是xx了。resres就要减去sum[k],sum[v]sum[k],sum[v]也要减去sum[k]sum[k],相应当,tonowto经过now才能到的节点的到根的距离就要加1,ressum[v],sum[k]sum[v]res就要加上sum[v],sum[k]也要加上sum[v],然后记得回溯就行了。

    #include<bits/stdc++.h>
    
    #define LL long long
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    
    using namespace std;
    
    LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}
    LL lcm(LL a,LL b){return a/gcd(a,b)*b;}
    LL powmod(LL a,LL b,LL MOD){LL ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
    
    const int N =2e5+232;
    int n,a[N];
    vector<int>v[N];
    LL sum[N],res,ans;
    void dfs1(int now,int pre=-1,int h=0){
    	LL ans=0;
    	res+=1ll*h*a[now];
    	sum[now]=a[now];
    	for(auto k:v[now]){
    		if(k==pre)continue;
    		dfs1(k,now,h+1);
    		sum[now]+=sum[k];
    	}
    }
    void dfs2(int now,int p=-1){
    	ans=max(ans,res);
    	for(auto k:v[now]){
    		if(k==p)continue;
    		res-=sum[k];
    		sum[now]-=sum[k];
    		res+=sum[now];
    		sum[k]+=sum[now];
    		dfs2(k,now);
    		sum[k]-=sum[now];
    		res-=sum[now];
    		sum[now]+=sum[k];
    		res+=sum[k];
    	}
    }
    int main(){
    	ios::sync_with_stdio(false);
    	cin>>n;
    	for(int i=1;i<=n;i++)cin>>a[i];
    	for(int i=1;i<n;i++){
    		int s,t;
    		cin>>s>>t;
    		v[s].pb(t);
    		v[t].pb(s);
    	}
    	dfs1(1);
    	dfs2(1);
    	cout<<ans;
    	return 0;
    }
    
  • 相关阅读:
    crash reporting system for Windows applications
    1
    qt 试用 (3)配置编译源代码及调试
    kd tree & ray tracing
    new
    KMP算法中关于next数组的探究
    teamviewer vs echovnc
    NAT之stun确定nat类型
    Wireshark
    GNU httptunnel,当SSH被block时的选择
  • 原文地址:https://www.cnblogs.com/pubgoso/p/10759707.html
Copyright © 2020-2023  润新知