许久未打比赛,果然一打就炸,体验极差。只改出了一道所谓的签到题。

题目大意

有一棵n个点的树,其中有m个关键点。在这m个关键点中随机选择k个点,从任意一点开始到任意一点结束的经过所有的k个点的最短路程期望是多少。1≤n≤1e5,k≤m≤5001 ≤ n ≤ 1e5, k ≤ m ≤ 5001≤n≤1e5,k≤m≤500

分析

这道题需要用到虚数的思路,但并不需要真的将虚树建出来。运用到虚树的思路就是先将所有关键点提出来建一棵虚树,那么答案就是2Sum−L2Sum -L2Sum−L,即虚树的边权和的两倍减去直径,此处钦定若有多条直径,取编号最小的直径。那么我们不妨拆成两个部分分辨算期望:

  • 第一部分:对于任意一条边出现的概率一定是
    ((mk)−(xk)−(yk))/(mk)(\tbinom{m}{k} - \tbinom{x}{k} - \tbinom{y}{k})/\tbinom{m}{k}((km​)−(kx​)−(ky​))/(km​)其中x,yx,yx,y分别是这条边以上和这条边一下的餐厅的个数,那么这个概率很显然,因为只有该边的两边有餐厅出现该边就一定会出现。
  • 第二部分:对于任意两个点u,vu,vu,v,考虑有多少个点能出现,枚举每个点xxx判断dis(u,x)dis(u, x)dis(u,x)和dis(v,x)dis(v, x)dis(v,x)与dis(u,v)dis(u, v)dis(u,v)的关系以及相等时判断标号大小即可。
    那么这道题就不是很难了,只用先预处理出任意两点间的距离,以及任意边两侧的餐厅的个数。

Code

#include <cstdio>
#include <algorithm>
#define ll long long
#define C(a,b) (G[a][b])
using namespace std;const int N = 1e5 + 10;
const int M = 1e3 + 10;
const ll mo = 998244353;
struct Edge{int to,next;ll val;
} f[N << 1];
int n,m,k,a[N],cnt,head[N],fa[N][25],dep[N],num[N];
bool tag[N];
ll ans,dis[N],G[M][M],dist[M][M];
double an;int read()
{int x = 0;char ch = getchar();while (ch < '0' || ch > '9') ch = getchar();while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}return x;
}void add(int u,int v,int w)
{f[++ cnt].to = v;f[cnt].next = head[u];f[cnt].val = (ll)w;head[u] = cnt;
}ll ksm(ll a,int b)
{ll res = 1ll;while (b){if (b & 1)  res = res * a % mo;b >>= 1;a = a * a % mo;}return res;
}void dfs(int u)
{if (tag[u] == 1) num[u] = 1;for (int i = head[u]; i; i = f[i].next){if (f[i].to == fa[u][0]) continue;fa[f[i].to][0] = u;dep[f[i].to] = dep[u] + 1;dis[f[i].to] = dis[u] + f[i].val;dfs(f[i].to);num[u] += num[f[i].to];ll tmp = (C(num[f[i].to],k) + C(m - num[f[i].to],k)) % mo;tmp = (C(m,k) - tmp) % mo;ll p = ans;ans = (ans + (ll)(f[i].val % mo * tmp % mo)) % mo;}
}int lca(int u,int v)
{if (dep[u] < dep[v]) swap(u,v);for (int i = 20; i >= 0; i --) if (dep[fa[u][i]] >= dep[v]) u = fa[u][i];if (u == v) return u;for (int i = 20; i >= 0; i --)if (fa[u][i] != fa[v][i]) u = fa[u][i],v = fa[v][i];return fa[v][0];
}ll get(int u,int v) {return dis[u] + dis[v] - 2 * dis[lca(u,v)];}int main()
{freopen("meal.in","r",stdin);freopen("meal.out","w",stdout);n = read(),m = read(),k = read();for (int i = 1; i <= m; i ++) tag[a[i] = read()] = 1;for (int i = 1,u,v,w; i < n; i ++) u = read(),v = read(),w = read(),add(u,v,w),add(v,u,w);dep[1] = 1;for (int i = 0; i <= m; i ++){G[i][0] = 1ll;for (int j = 1; j <= i; j ++) G[i][j] = (G[i - 1][j] + G[i - 1][j - 1]) % mo;}ans = 0;dfs(1);for (int i = 1; i <= 20; i ++) for (int u = 1; u <= n; u ++) fa[u][i] = fa[fa[u][i - 1]][i - 1];ans = ans * 2ll % mo;for (int i = 1; i <= m; i ++)for (int j = 1; j <= m; j ++) dist[i][j] = get(a[i],a[j]);for (int i = 1; i < m; i ++)for (int j = i + 1,g; j <= m; j ++){     g = 0;ll l1 = dist[i][j];for (int l = 1; l <= m; l ++){ll l2 = dist[i][l],l3 = dist[j][l];if ((l1 > l2 || (l1 == l2 && l > j)) && (l1 > l3 || (l1 == l3 && l > i)))g ++;}ans = (ans - l1 % mo * C(g,k - 2) % mo) % mo;}ans = ans * ksm(C(m,k),mo - 2) % mo;printf("%lld\n",(ans + mo) % mo);return 0;
}

一道签到题都打死我了。。

JZOJ6436. 【GDOI2020模拟01.16】zsy家今天的饭相关推荐

  1. 【JZOJ6441】【GDOI2020模拟01.17】小 ω 维护序列

    Description Input Output 输出到标准输出流中. 若干行,对于每个操作 1 和操作 5,输出一个数表示答案. Sample Input Sample Input1 5 8 1 2 ...

  2. 6445. 【GDOI2020模拟01.19】String

    题目 正解 一听到正解是NTT,我心态崩了. 我特么知道是NTT都不知道该怎么做!哪里像个卷积了? 好吧,是我孤陋寡闻-- 设两个字符串分别为AAA和BBB 可以考虑试着计算出AAA每个子串和BBB的 ...

  3. jzoj zsy家今天的饭_有它拌饭,碗我都能舔干净!老干妈竟然被轻松超越了?

    作为一个标准的肥宅,做饭是不可能的,这辈子都不可能的.有泡面.榨菜和拌饭酱,小编觉得自己就可以完美地度过独居生活了,经济宽裕的时候再叫上几顿外卖,小日子幸福而又美满!今天,小编就来给大家盘点几个超级好 ...

  4. jzoj zsy家今天的饭_jzoj zsy家今天的饭_有它拌饭,碗我都能舔干净!老干妈竟然被轻松超越了?...

    作为一个标准的肥宅,做饭是不可能的,这辈子都不可能的.有泡面.榨菜和拌饭酱,小编觉得自己就可以完美地度过独居生活了,经济宽裕的时候再叫上几顿外卖,小日子幸福而又美满!今天,小编就来给大家盘点几个超级好 ...

  5. 纪中集训2020.01.16【NOIP普及组】模拟赛C组总结+【0.Matrix】分析

    纪中集训2020.01.16[NOIP普及组]模拟赛C组总结+[0.Matrix]分析 题目: 0.matrix 1.product 2.binary 3.value 巨佬估分:100+100+40+ ...

  6. 《安富莱嵌入式周报》第248期:2022.01.10--2022.01.16

    往期周报汇总地址:链接 目录 本周发布了两期视频教程: 视频版 图文版 1.ARM第一款采用新安全分区架构的Morello评估板现已交付给研究人员 2.三星实现基于MRAM的内存计算设备 3.Qt6. ...

  7. CF3B Lorry (手动模拟01背包,贪心)难度⭐⭐⭐

    这道题洛谷上的翻译是错的,最后输出格式那里应该是输出一行所选物品的编号,中间用空格隔开 手动模拟01背包 这道题看上去很像是01背包的模板题,但是很明显,v=1e9,正常的01背包是肯定会爆掉62MB ...

  8. 【GDOI2016模拟3.16】幂(容斥 + 模型复杂转化)

    [GDOI2016模拟3.16]幂 \(X\in[1,A],Y\in[1,B]\),问:\(x^y\)的不用取值个数. \(A,B\)都是\(10^9\)级别. 然后我们开搞. 首先,假设一个合法的\ ...

  9. Cisco PT模拟实验(16) 路由器重分发配置

    Cisco PT模拟实验(16) 路由器重分发配置 实验目的: 掌握路由器重分发的配置方法 掌握査看通过路由重分发学习产生的路由 实验背景: 随着公司网络规模不断扩大,公司内安装了多个路由器并运行多种 ...

最新文章

  1. 牛客练习赛64 - B Dis2(树,基础图论)
  2. JavaScript工作原理(二):V8引擎和5招高效代码
  3. tidevice安装(MacOS)
  4. C# new()约束简单介绍
  5. 多核cpu应用场景_操作系统基础11-关于多核编程
  6. PAT (Advanced Level) 1017. Queueing at Bank (25)
  7. 如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包
  8. 开放对静态资源的访问
  9. “非常有用”的JavaScript 和 CSS 库插件推荐
  10. bloom-generate 打包 ros 版本 noetic 的包及报 /usr/bin/ld: 找不到 -lpthreads与undefined reference pthread_create
  11. 陪集编码(Coset coding)
  12. 好玩好用软件推荐,让你大开眼界
  13. last reboot
  14. SpringCloud接入Nacos作为「注册中心」和「配置中心」
  15. 数据库查询 - 选课系统
  16. ML - 线性回归(Linear Regression)
  17. 使用Microsoft SQL Server Management Studio连接远程阿里云SQL Server数据库
  18. 如何在一只股票坐庄散户敢死队点评
  19. python数据处理7: matplotlib绘图保存图片深入
  20. php网盘代码,php网盘源码

热门文章

  1. java欧元货币输出符号位置_java怎么输出货币符号
  2. pytorch-实现运动鞋品牌识别
  3. 创造与魔法怎么去最新服务器,2018创造与魔法服务器进不去怎么办 | 手游网游页游攻略大全...
  4. 语义相关app搜索(三)——qjzcy的博客
  5. 计算机快速排序举例,3. 快速排序
  6. Unity递归遍历给定物体的所有子物体
  7. Unity 基础 之 实现枚举(enum/Enum)遍历的三种简单方法(foreach/for)
  8. nginx配置二级目录
  9. 【前端Web】Jquery实现的四款牛B的时间轴
  10. 商场里两个不起眼的赚钱项目,月收入竟高达六七万