Luogu P10842 Piggy and Trees 题解 [ 绿 ] [ 拆边 ] [ 贡献思维 ] [ 组合数学 ]
Piggy and Trees:把路径拆成边的思维题。
思路
一看到这题的路径,就想到了 Luogu P3177 树上染色 这题化路径为边的贡献,分别计算的思维。
那么对于此题,先来观察题目里式子的意思:对于树上的每个无序点对,求出树上每个点 到这些点对之间的最短路径的 距离之和。枚举点对对应的就是前两个 \(\sum\) ,枚举每个点到最短路径的最短距离就是最后一个 \(\sum\) 。
那么对于一条无向边 \((u,v)\) ,我们可以画出如下图:

假设当前计算贡献的边是 \((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\) 下面的路径的贡献便是:
\]
对 \(u\) 上面的路径同理,贡献是:
\]
这个过程可以通过遍历一遍树来实现。
注意是 \(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;
}
Luogu P10842 Piggy and Trees 题解 [ 绿 ] [ 拆边 ] [ 贡献思维 ] [ 组合数学 ]的更多相关文章
- luogu P1126 机器人搬重物 题解
luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运 ...
- 【luogu P2491 [SDOI2011]消防】 题解
题目链接:https://www.luogu.org/problemnew/show/P2491 题外话: OI一共只有三种题--会的题,不会的题,二分题. 题解: step 1 求树的直径,把树的直 ...
- 【luogu P1040 加分二叉树】 题解
题目链接:https://www.luogu.org/problemnew/show/P1040 今天考试考了一个区间DP...没错就是这个... 太蒟了真是连区间DP都不会...看了看题解也看不懂, ...
- Hdoj 1392.Surround the Trees 题解
Problem Description There are a lot of trees in an area. A peasant wants to buy a rope to surround a ...
- Luogu P1351 联合权值 题解
这是一个不错的树形结构的题,由于本蒟蒻不会推什么神奇的公式其实是懒得推...,所以很愉快的发现其实只需要两个点之间的关系为祖父和儿子.或者是兄弟即可. 然后问题就变得很简单了,只需要做一个正常的DFS ...
- 【luogu P1850 换教室】 题解
题目链接:https://www.luogu.org/problemnew/show/P1850 难的不在状态上,难在转移方程. (话说方程写错居然还有84分= =) #include <cst ...
- 【luogu P1558 色板游戏】 题解
题目链接:https://www.luogu.org/problemnew/show/P1558 我知道三十棵线段树很暴力,可是我们可以状压啊. 颜色最多30,不会爆int 另外 吐槽评测机 #inc ...
- 【luogu P3953 逛公园】 题解
题目链接:https://www.luogu.org/problemnew/show/P3953 题外话:感觉2017年神题好多..这还不是最神的一道,真在考场上我也就写个最短路计数暴力了.现在在大佬 ...
- 【luogu P1608 路径统计】 题解
题目链接:https://www.luogu.org/problemnew/show/P1608 补上一发最短路计数! 感谢王强qwqqqq @Lance1ot #include <queue& ...
- 【luogu P1156 垃圾陷阱】 题解
题目链接:https://www.luogu.org/problemnew/show/P1156 设\(dp[i][j]\)表示前i堆到达高度j时的所活最长时间 那么一旦到当前状态能到达满足的时间和高 ...
随机推荐
- 开发工具之DevToys
DevToys 号称开发人员的瑞士军刀,可以帮助完成一些日常任务,比如格式化 JSON.比较文本.测试正则等,无需使用许多不真实的网站来处理的数据. 借助智能检测,DevToys 能够检测出可以处理在 ...
- 开源 - Ideal库 - Excel帮助类,设计思路(一)
今天开始和大家分享关于Excel最长常用操作封装. 01.起因 市面上有很多Excel操作库,这些库设计之初的目标是提供对Excel的各种操作功能,包括数据.样式.公式.图表等等.而对于我们平时开发来 ...
- Git使用备忘录
定义 分布式版本控制工具 Git四个工作区域 工作区(Working Directory):就是你平时存放项目代码的地方 暂存区(Stage/Index):用于临时存放你的改动,事实上它只是一个文件, ...
- 深入聊聊async&Promise
正文 最近在学习JavaScript里的async.await异步,对于其中的Promise状态以及背后的Js引擎实际运行状态不大理解且很感兴趣,因此花了一点时间仔细研究了一下. 从Example说起 ...
- Dapr-4: 交通管制示例应用
第 4 章 交通管制示例应用 Introduction to the Traffic Control sample application | Microsoft Docs 在前面的章节种,你已经学习 ...
- 金Gien乐道 | 8月热点回顾
中电金信2023年中工作会议:加快推进以"源启"为基石的业务模式转型 8月12日,中电金信2023年中工作会议在上海召开.会议贯彻落实中国电子2023年中工作会议精神,总结上半 ...
- MySQL的 安装、配置、卸载
Mysql的安装配置(基于Centos7) 安装mysql数据库 [root@master ~]# wget https://dev.mysql.com/get/mysql57-community-r ...
- 微信小程序无法抓包
1.问题 1.1. 问题描述 夜神模拟器中,微信小程序请求超时(是因为开了抓包程序) 1.2. 问题截图 2.解决问题 2.1. 步骤 开启调试模式,之后重启小程序 2.2. 结果
- Qt编写地图综合应用18-地图模式
一.前言 除了传统的街道图地图外,默认的一般都是街道图,还有卫星图.三维图等,其中又有叠加层,比如叠加路况图层和路网图层等,最近去了多家的地图官网看对应的api接口,总体上感觉现在都往2.5D或者3D ...
- 基于开源IM即时通讯框架MobileIMSDK:RainbowChat v8.4版已发布
关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架,超轻量级.高度提炼,一套API优雅支持UDP .TCP .WebSocket 三种协议,支持iOS.A ...