首页 > 其他分享 >Luogu P10842 Piggy and Trees 题解 [ 绿 ] [ 拆边 ] [ 贡献思维 ]

Luogu P10842 Piggy and Trees 题解 [ 绿 ] [ 拆边 ] [ 贡献思维 ]

时间:2024-08-04 19:38:55浏览次数:11  
标签:sz int 题解 路径 Trees fa ans 拆边 mod

Piggy and Trees:把路径拆成边的思维题。

思路

一看到这题的路径,就想到了 Luogu P3177 树上染色 这题化路径为边的贡献,分别计算的思维。

那么对于此题,先来观察题目里式子的意思:对于树上的每个无序点对,求出树上每个点 到这些点对之间的最短路径的 距离之和。枚举点对对应的就是前两个 \(\sum\) ,枚举每个点到最短路径的最短距离就是最后一个 \(\sum\) 。

那么对于一条无向边 \((u,v)\) ,我们可以画出如下图:

image

假设当前计算贡献的边是 \((1,2)\) ,先来计算 \(v\) ,也就是 \(2\) 下面的路径:

显然,以 \(2\) 为根的子树下面有 \(3\) 个节点,我们从中选出两个点组成路径,就有 \(C_{3}^{2}\) 种选法。因此,假设 \(sz[u]\) 表示以 \(u\) 为根的子树的大小,那么 \(v\) 下面我们就可以选出 \(C_{sz[v]}^{2}\) 条路径。

对于这些路径,我们要让其他点到这些路径的最短路径经过边 \((u,v)\) ,就得枚举 \(u\) 上面的节点。显然,\(1\) 上面的节点有 \(1,3,4,7\) 这 \(4\) 个,对应到全部情况上,便是有 \(sz[root]-sz[v]\) 个节点。

那么这条边对 \(v\) 下面的路径的贡献便是:

\[(sz[root]-sz[v])\times C_{sz[v]}^{2} \]

对 \(u\) 上面的路径同理,贡献是:

\[sz[v]\times C_{(sz[root]-sz[v])}^{2} \]

这个过程可以通过遍历一遍树来实现。

注意是 \(sz[root]-sz[v]\) 而不是 \(sz[u]-sz[v]\) ,调了我 20min,到赛后 5min 才调出来 。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
const ll mod=1e9+7;
ll sz[200005],ans=0;
int n;
vector<int>g[200005];
void dfs(int u,int fa)
{
	sz[u]=1;
	for(auto v:g[u])
	{
		if(v==fa)continue;
		dfs(v,u);
		sz[u]+=sz[v];
	}
}
void dfs2(int u,int fa)
{
	for(auto v:g[u])
	{
		if(v==fa)continue;
		dfs2(v,u);
		ans=(ans+((1ll*sz[v]*(sz[v]-1)/2)%mod*(sz[1]-sz[v])%mod))%mod;
		ans=(ans+((1ll*(sz[1]-sz[v])*(sz[1]-sz[v]-1)/2)%mod*sz[v]%mod))%mod;
	}
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n-1;i++)
	{
		int u,v;
		cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dfs(1,0);
	dfs2(1,0);
	cout<<ans;
	return 0;
}

标签:sz,int,题解,路径,Trees,fa,ans,拆边,mod
From: https://www.cnblogs.com/zhr0102/p/18342124

相关文章

  • 【面试题解答】一个有序数组 nums ,原地删除重复出现的元素
    面试题解答仅供学习文章目录面试题解答题目一、python代码1.1代码1.2示例用法1.2.1示例11.2.2示例2二、讲解2.1初始化2.2遍历2.3返回题目要解决这个问题,可以使用双指针方法进行原地修改,以确保每个元素最多出现两次。一、python代码1.1代码defr......
  • 2024梦熊BeiJing集训题目题解目录
    Day1基础动态规划luoguP1896[SCOI2005]互不侵犯codeforces1209ERotateColumns(easy)codeforces1209ERotateColumns(hard)杂题luoguP2371[国家集训队]墨墨的等式AtCoderabc219_fCleaningRobotP3043[USACO12JAN]BovineAllianceG[ARC105C]CamelsandB......
  • Leetcode 第 135 场双周赛题解
    Leetcode第135场双周赛题解Leetcode第135场双周赛题解题目1:3222.求出硬币游戏的赢家思路代码复杂度分析题目2:3223.操作后字符串的最短长度思路代码复杂度分析题目3:3224.使差值相等的最少数组改动次数思路代码复杂度分析题目4:思路代码复杂度分析Leetcode......
  • CodeForces-808#D 题解
    思路分析分析样例1:3132原数组被分成1和32两部分,将2移到左边即可。我们设左边部分的和为\(s1\),右边为\(s2\),可以发现对于任何分割方式,只有满足\(s1\pmx=s2\mpx\)才可以继续讨论答案是否成立。推论1:由于\(x\ina\)(\(a\)为题目所给数列),因此\(|\s1-s2......
  • 洛谷 统计天数 + 语句解析 题解
    题目:P1567统计天数P1597语句解析第一道:P1567统计天数题目描述炎热的夏日,KC非常的不爽。他宁可忍受北极的寒冷,也不愿忍受厦门的夏天。最近,他开始研究天气的变化。他希望用研究的结果预测未来的天气。经历千辛万苦,他收集了连续 N(1≤N≤10^6)天的最高气温数据。现在......
  • AGC064B 题解
    设红色的点值为0,蓝色为1。注意到,如果有一条边的颜色和两端点同色,一定可以选。例子:选择和两端点同色的边。又发现,如果存在一个\(sz>1\)的合法连通块,无论和其他点怎么连,原来的这个连通块内的点一定合法。有注意到形如\(0\xleftrightarrow10,1\xleftrightarrow01\)类......
  • P9351 题解
    P9351思路观察到一次覆盖操作相当于\((u,v)\)向\((u,v)\)为中心的一个矩形挖去四个角中每个点连代价为\(1\)的边。因为\(r\lec\),\(r\le\sqrt{rc}\)。暴力是01bfs,到每个点处理覆盖操作时枚举行一边,用\(n\)个并查集维护每行没有被删去的后继。对于每个点需要枚举\(......
  • 20240803题解
    话说T3都把式子推出来了结果忘记差分约束怎么写了。光线(light)题面:有\(n\)个玻璃板,第\(i\)个玻璃板的透光率为\(a_i\%\),反射率为\(b_i\%\),有大小为\(1\)个单位的一束光从第\(1\)个玻璃板开始,有多少光能穿透\(n\)层玻璃板。题解:考虑\(n=2\)时,可以简单算出两个玻璃板组合后的反......
  • 第三次测试题解
    问题F:求多个数的最大公约数multigcd[1*]:`#includeincludeincludeincludeusingnamespacestd;intfun(inta,intb){returnb==0?a:fun(b,a%b);}intmain(){intn;cin>>n;vectora(n+1,0);for(inti=1;i<=n;i++)scanf("%d",&a[i]);intans......
  • 镜面质数 题解
    题目id:20313题目描述如果一个质数镜像反转(即将该数各个位上数字反转)后仍然是质数,那么就称这个质数为镜像质数。例如质数\(13\)反转后为\(31\),则\(13\)为一个镜像质数。现在给定一个整数\(N\),请求出整数\(1\simN\)范围内有几个镜像质数。注意:求范围内的镜像质数时,质数和镜像反......