永琳的竹林迷径(path)

题目描述

竹林可以看作是一个n 个点的树,每个边有一个边长wi,其中有k 个关键点,永琳需要破坏这些关键点才能走出竹林迷径。

然而永琳打算将这k 个点编号记录下来,然后随机排列,按这个随机的顺序走过k 个点,但是两点之间她只走最短路线。初始时永琳会施展一次魔法,将自己传送到选定的k 个点中随机后的第一个点。

现在永琳想知道,她走过路程的期望是多少,答案对998244353 取模。

注意,如果对期望不理解,题目最后有详细解释,请自行阅读。

输入

第一行一个数Case,表示测试点编号。(样例的编号表示其满足第Case 个测试点的性质)

下一行一个n,表示树的点数。

下面 n-1 行,每行三个数ui,vi,wi,表示一条边连接ui和vi,长度为wi。

下面一行一个数k,表示关键点数。

下面一行k 个数,表示k 个关键点的编号。

输出

一行一个数,表示答案(对998244353 取模)。

数据范围

对于 100%的数据,保证1≤wi≤1041≤wi≤104。

测试点编号

n

k

特殊性质

1

≤10≤10

=1=1

2

3

≤5≤5

4

5

≤1000≤1000

≤7≤7

6

7

≤105≤105

≤8≤8

8

9

10

≤16≤16

11

12

13

≤105≤105

14

15

16

17

18

≤106≤106

≤106≤106

是一条链

19

20

21

22

23

24

25

【可能会用到的知识】

关于期望:

期望的定义:离散随机变量的一切可能值与其对应的概率P 的乘积之和称为数学期望。

即: E(x)=∑P(x=k)×val(k)E(x)=∑P(x=k)×val(k)

其中E(x)是期望,P(x=k)是 x=k 发生的概率。

提示:答案必定可以表示成pqpq的形式,在模意义下,pq=p×q−1pq=p×q−1,其中q−1q−1是qq的逆元。

【提示】

读入数据较大,请使用快速的读入方式。


solution

本题求有序走完一个排列的期望长度。

考虑一个点i之前是j的贡献:dist[i]+dist[j]-2*dist[lca]

算出所有点的dist的贡献,lca的贡献则做一次类似树形dp的东西

一个点不同子树互相走的数量就是它作lca的贡献

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 1000006
#define mod 998244353
#define ll long long
using namespace std;
int n,num,head[maxn],s[maxn],flag[maxn],t1,t2,t3,tot;
int Te,size[maxn];
ll ans,Sum,ny2,ny,d[maxn];
struct node{int v,nex,w;
}e[maxn*2];
int read(){int v=0,ch;while(!isdigit(ch=getchar()));v=ch-48;while(isdigit(ch=getchar()))v=(v<<1)+(v<<3)+ch-48;return v;
}
void lj(int t1,int t2,int t3){e[++tot].v=t2;e[tot].w=t3;e[tot].nex=head[t1];head[t1]=tot;
}
void dfs(int k,int fa,ll dist){d[k]=dist;for(int i=head[k];i;i=e[i].nex){if(e[i].v==fa)continue;dfs(e[i].v,k,dist+e[i].w);size[k]+=size[e[i].v];}size[k]+=flag[k];
}
void dp(int k,int fa){ll sum=0;for(int i=head[k];i;i=e[i].nex){if(e[i].v==fa)continue;dp(e[i].v,k);sum+=size[e[i].v];}ll cnt=0;for(int i=head[k];i;i=e[i].nex){if(e[i].v==fa)continue;cnt=cnt+size[e[i].v]*(sum-size[e[i].v])%mod;cnt=cnt%mod;}ans=(ans-2*d[k]%mod*cnt%mod)%mod;if(flag[k]){ans=(ans-4*d[k]%mod*sum%mod)%mod;}
}
ll work(ll a,int Num){ll Ans=1,p=a;while(Num){if(Num&1)Ans=Ans*p;p=p*p;p%=mod;Ans%=mod;Num>>=1;}return Ans;
}
int main()
{Te=read();n=read();for(int i=1;i<n;i++){t1=read();t2=read();t3=read();lj(t1,t2,t3);lj(t2,t1,t3);}num=read();for(int i=1;i<=num;i++){s[i]=read();flag[s[i]]++;}   dfs(1,0,(ll)0);ny2=work(2,mod-2);for(int i=1;i<=num;i++)Sum+=d[s[i]];for(int i=1;i<=num;i++){ans=(ans+d[s[i]]*(num-1))%mod+(Sum-d[s[i]])%mod;ans=ans%mod;}dp(1,0);ans%=mod;ans=ans*work(num,mod-2);ans=(ans%mod+mod)%mod;printf("%lld\n",ans);return 0;
}

永琳的竹林迷径(path)相关推荐

  1. DTOJ 4015: 永琳的竹林迷径

    401540154015: 永琳的竹林迷径 题目描述 竹林可以看作是一个nnn 个点的树,每个边有一个边长wiw_{i}wi​,其中有kkk 个关键点,永琳需要破坏这些关键点才能走出竹林迷径. 然而永 ...

  2. ssoj4015: 永琳的竹林迷径(path)

    时间限制: 2 Sec 内存限制: 512 MB O2 提交: 61 解决: 31 [提交][状态][博客][加入收藏] 题目描述 竹林可以看作是一个n 个点的树,每个边有一个边长wi,其中有k 个关 ...

  3. 2018.10.31-dtoj-4015-永琳的竹林迷径(path)

    题目描述: 竹林可以看作是一个n 个点的树,每个边有一个边长i w ,其中有k 个关键点,永琳需 要破坏这些关键点才能走出竹林迷径. 然而永琳打算将这k 个点编号记录下来,然后随机排列,按这个随机的顺 ...

  4. Noip 模拟 13 2018/10/31

    T1:铃仙的红色之瞳(eyes) 为了方便你的预测,铃仙对该符卡进行了改造. 敌方非常强大,可以看作有无限的体力.通过该符卡,铃仙可以释放出子弹,敌方触碰到子弹就会损失一格体力.注意,每次敌方损失体力 ...

  5. Attention Points

    Attention Points 数组范围 无向图.树,边表的范围是边数的两倍. 因为最近树的题目做的比较多,一定要注意分清是树还是图,不能冲上去就去开struct Edge{int to,ne,w; ...

  6. Linux 学习目录

    方次易改究今率太值府层次六写半间且同开气资党油么红八己科联回形张江全九造断才再高列总基法容直达她县增西我什体器况原物收小流联动断关事安铁全例今律六任四压难任至应发何包事少就都北说话打中清半声与化科规条 ...

  7. 【Android -- 技术周刊】第 006 期

    技术文章 1. PathMeasure之迷径追踪 Path动画能满足很多时候单独的属性动画做不到的需求,那么如何让Path动画更美观,PathMeasure这个工具类将解答这个问题 2. 深度理解An ...

  8. 你能不能做老大,关键就看这8关!突破了,人人死心塌地追随你

    2019-02-19 20:37:42 经常有人问,如何才能做好一个领导者.领导者是什么?是带领团队实现梦想的人!而要实现心中的梦想,必须有异于常人的素质.这样,你才具有让别人仰视的领导力.总结一下, ...

  9. JZOJ 幽幽子与森林

    题目大意: 迷途竹林可以看成是一个n个点的森林,幽幽子定义dis(u,v)为u到v路径上的边的数量,若u和v不连通则为m.她定义整个森林的危险度为 为了去拜访永琳师匠,幽幽子需要提前知道迷途竹林的危险 ...

最新文章

  1. [转载]WebForm下使用 jQuery.loadUserControl异步load用户控件
  2. 【Log4j日志输出】控制台输出、输出到文件:简单使用示例
  3. linux 文件夹换所属用户,linux普通用户su root切换提示没有文件或目录的解决方法...
  4. python安装django模块_python中安装django模块的方法
  5. LeetCode 695. 岛屿的最大面积(图的BFS/DFS)
  6. C++由(int)a引发的思考及浮点数在内存中的表示
  7. [转载].怎样制作一个简单ip,以方便在Quartus II和Nios II中使用?
  8. ECharts(Enterprise Charts 商业产品图表库)初识
  9. 【python工具】获取linux和windows系统指定接口的IP地址
  10. 新代系统PLC编程软件 新代PLC编程软件中文版梯形图
  11. smtp邮件服务器配置,配置SMTP服务器
  12. 对方qq空间权限需要申请访问怎么破解
  13. java生成图表_java实现将数据生成图表至excel导出
  14. python 英文 词频分析软件_有哪些软件可以进行中文词频分析?
  15. html如何将图片截成圆形图片,CSS如何显示圆形图片?如何将图片变为圆形
  16. 数据分析实战(二) 基于美国人口adult数据集R语言分析实战
  17. 基于微服务的个人博客系统
  18. 监控Kafka(kafka_exporter)
  19. FMDB-FMDatabaseQueue
  20. html select不允许选择,设置select下拉框不能选择

热门文章

  1. 多重积分的理解以及转动惯量的求解
  2. Linux快捷键大全
  3. 分享Silverlight/Windows8/WPF/WP7/HTML5周学习导读(5月27日-6月3日)
  4. 【HCIA持续更新】VLAN间通信之路由器
  5. 工业物联网解决方案:该如何打造智能工厂
  6. Nginx 实现文件夹上传(保留目录结构)
  7. 东华大学2020考研计算机复试准备上机题解析答案_基础篇(1-29)
  8. HTML5面试题及答案
  9. Sublime 安装与中文配置
  10. Linux spi驱动框架之执行流程-nuc970-att7022