题意: 给你一棵无根树,每个节点有个权值$a_i$,指定一个点u,定义$\displaystyle value = \sum^v a_i*dist(u,v)$,求value的最大值 n,ai<=2e5 思路: 其实就是找一个节点作为根满足上述最大的value 直接枚举是$O(n^2)$的,肯定不行,我们要用到换根法 换根适用于这种无根树找根,两个跟直接产生的结果又有联系,可以相互转换的情况 对于这一题,我们让sum[u] = 以u为根的子树的$\sum a_i$ 这样,从父亲节点u向儿子节点v转…
传送门:http://codeforces.com/contest/1092/problem/F F. Tree with Maximum Cost time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given a tree consisting exactly of nn vertices. Tree is a…
题目链接 题意:给你一棵树,让你找一个顶点iii,使得这个点的∑dis(i,j)∗a[j]\sum dis(i,j)*a[j]∑dis(i,j)∗a[j]最大.dis(i,j)dis(i,j)dis(i,j)为iii到jjj的距离. 思路:题解还是好看啊 先从1开始搜,预处理出当1为根的时候的答案记为resresres,递归的过程中假设当前节点为iii,那么sum[i]sum[i]sum[i]数组的意义就是:从以当前顶点为根的所有子树的所有节点的权值和记为sum[i]sum[i]sum[i].…
题目大意: 给定一棵树 每个点都有点权 每条边的长度都为1 树上一点到另一点的距离为最短路经过的边的长度总和 树上一点到另一点的花费为距离乘另一点的点权 选定一点出发 使得其他点到该点的花费总和是最大的 先dfs一遍 获得 s[u] 为u点往下的点权总和(包括u点) 由其子节点v及其本身权值可得 s[u]=s[v]+w[u] 获得 dp[u] 为u点出发往下的花费总和(u点出发的花费不需要包括u点) 由其子节点v的dp[v]及s[v]可得 dp[u]=dp[v]+s[v] 再深搜一遍树形dp 获…
题目意思: 给出你一颗带点权的树,dist(i, j)的值为节点i到j的距离乘上节点j的权值,让你任意找一个节点v,使得dist(v, i) (1 < i < n)的和最大.输出最大的值. 题目分析: 首先如果你可以熟悉的使用树形dp的话 , 可以很快的意识的先从1号点开始dfs一遍,然后通过一些奇怪的方式,再dfs一遍得到其他点的贡献.无所以我们需要找到一个递推式是满足我选择其他号码为根时候,可以很快的得到答案 . 现在假设有两个节点v , fa ; v 是 fa 的儿子节点 , 根据dp的…
题目链接:Tree with Maximum Cost 题意:给定一棵树,树上每个顶点都有属性值ai,树的边权为1,求$\sum\limits_{i = 1}^{n} dist(i, v) \cdot a_i$,$dist(i, v) $为顶点i到顶点v的距离.该顶点v可以任意选择. 题解:O(n^2)的做法:从每个顶点跑一遍DFS,计算贡献值,并更新答案.(超时) 我们可以先计算出从顶点1跑的答案,发现顶点之间贡献的转移为$ans[u]=ans[fa]+(all-sum[u])-sum[u]$…
CF1324 --- Maximum White Subtree 题干 You are given a tree consisting exactly of \(n\) vertices. Tree is a connected undirected graph with \(n−1\) edges. Each vertex \(v\) of this tree has a value \(a_v\) assigned to it. Let \(dist(x,y)\) be the distan…
http://codeforces.com/contest/1187/problem/E 分析:问得分最高,实际上就是问以哪个节点出发得到的分数最多,而呈现成代码形式就变成了换根,max其得分!!!而要利用之前算过的得分来求. #include<bits/stdc++.h> using namespace std; typedef long long ll; ; vector<int>e[M]; int son[M]; ll ans; int n; void dfs(int u,i…
传送门 sbsbsb树形dpdpdp题. 题意简述:给出一棵边权为1的树,允许选任意一个点vvv为根,求∑i=1ndist(i,v)∗ai\sum_{i=1}^ndist(i,v)*a_i∑i=1n​dist(i,v)∗ai​的最大值. 直接统计出子树的权值和转移就行了. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; inline int read(){ int ans=0; char ch=g…
题目链接: http://codeforces.com/contest/1187/problem/E 题意: 给出一颗树,找到一个根节点,使所有节点的子节点数之和最大 数据范围: $2 \le n \le 2 \cdot 10^5$ 分析: 最暴力的方法是枚举所有的根节点,计算他们子节点之和,复杂度是$O(n^2)$ 但是可以发现,$a$作为根节点和$b$作为根节点,只有$a,b$节点的子节点数有变化 根的子节点数肯定是$n$,与他交换的点节点数是$x$的话,那么根的子节点数就变成$n-x$,交…