Description

有一棵以1为根的树,每个点有\(a_i\),\(d_i\),定义\(F_i\)为所有的\(a_j\)的和,满足\(j\)往根走\(d_j\)步的路径上有\(i\)。每条边有一定概率出现(对\(F\)无影响),Q次询问,每次询问\(x\)点所在的联通块所有\(F_i\)和的平方的期望。

Solution

首先求\(F_i\),可以再树上查分,子树求和。
连通块很难处理,考虑一个点与它子树一部分组成连通块的期望,和很好处理,考虑和的平方,设当前块为\(a\),要加入的子树块为\(b\) ,则新的块\(c=p(a+b)^2+(1-p)a^2\)(\(p\)为连接两个块的边的出现概率)
于是拆式子:\(c=a^2+p(2ab+b^2)\),然后直接转移,根节点的答案即为询问该点的期望。
这题有多组询问,我们可以对\(1\)做完\(dp\)后,从上至下换根即可。

Code

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define fo(i,j,k) for(int i=j;i<=k;++i)
#define fd(i,j,k) for(int i=j;i>=k;--i)
#define rep(i,x) for(int i=ls[x];i;i=nx[i])
using namespace std;
typedef long long ll;
const int N=2e5+10,M=4e5+10,mo=998244353;
int a[N],d[N];
int to[M],nx[M],ls[N],vl[M],num=0;
ll F[N];
ll h[N],g[N];
void link(int u,int v,int w){to[++num]=v,nx[num]=ls[u],ls[u]=num;vl[num]=w;
}
int st[N],top=0;
void pre(int x,int fr){int fd=st[max(top-d[x],0)];st[++top]=x,F[x]+=a[x],F[fd]-=a[x];rep(i,x){int v=to[i];if(v==fr) continue;pre(v,x);F[x]+=F[v];}F[x]=(F[x]%mo+mo)%mo,st[top--]=0;
}
void dfs(int x,int fr){g[x]=F[x],h[x]=F[x]*F[x]%mo;rep(i,x){int v=to[i];ll p=vl[i];if(v==fr) continue;dfs(v,x);h[x]=(h[x]+(g[x]*g[v]*2+h[v])%mo*p%mo)%mo;g[x]=(g[x]+g[v]*p)%mo;}
}
ll G[N],H[N];
void calc(int x,int fr){rep(i,x){int v=to[i];ll p=vl[i];if(v==fr) continue;ll gv=(G[x]-g[v]*p%mo+mo)%mo,hv=(H[x]-(gv*g[v]%mo*2%mo+h[v])%mo*p%mo+mo)%mo;H[v]=(h[v]+(g[v]*gv%mo*2+hv)%mo*p%mo)%mo;G[v]=(g[v]+gv*p)%mo;calc(v,x);}
}
int main()
{freopen("travel.in","r",stdin);freopen("travel.out","w",stdout);int n;scanf("%d",&n);fo(i,1,n) scanf("%d %d",&a[i],&d[i]);fo(i,2,n){int u,v,w;scanf("%d %d %d",&u,&v,&w);link(u,v,w),link(v,u,w);}pre(1,0);dfs(1,0);G[1]=g[1],H[1]=h[1];calc(1,0);int q;scanf("%d",&q);while(q--){int x;scanf("%d",&x);printf("%lld\n",H[x]);}
}

转载于:https://www.cnblogs.com/sadstone/p/9827248.html

【JZOJ5911】Travel相关推荐

  1. 【UVA 10816】 Travel in Desert (最小瓶颈树+最短路)

    [题意] 有n个绿洲, m条道路,每条路上有一个温度,和一个路程长度,从绿洲s到绿洲t,求一条道路的最高温度尽量小, 如果有多条, 选一条总路程最短的. Input Input consists of ...

  2. hihoCoder 1578 Visiting Peking University 【贪心】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)...

    #1578 : Visiting Peking University 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Ming is going to travel for ...

  3. 【python】关于python的链表结构实现

    [参考] [https://blog.csdn.net/weixin_37728031/article/details/81145258][注意链表结构,节点包括数值和next.链表中的head] [ ...

  4. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

  5. 【干货】Duang!看好产品是如何增加情感化设计的?

    原研哉在他的<设计中的设计>中有介绍过这样一个案例:日本机场原来是用一个圆圈和一个方块表示出入的区别,形式简单并且好用,但设计师佐藤雅彦却用一个更"温暖"的方式来重新设 ...

  6. 【产品】腾讯内部的顶级产品课:灵动在细节

    原研哉在他的<设计中的设计>中有介绍过这样一个案例:日本机场原来是用一个圆圈和一个方块表示出入的区别,形式简单并且好用,但设计师佐藤雅彦却用一个更"温暖"的方式来重新设 ...

  7. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  8. JavaWeb黑马旅游网-学习笔记01【准备工作】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  9. 阿里巴巴对Java编程【控制语句】的规约

    转载自 阿里巴巴对Java编程[控制语句]的规约 控制语句 1. [强制]在一个 switch 块内,每个 case 要么通过 break / return 等来终止,要么注释说明程序将继续执行到哪一 ...

最新文章

  1. UOJ#460. 新年的拯救计划 构造
  2. ABAP table buffer test
  3. [SpecialJudge]构造“神秘“字符串(洛谷P3742题题解,Java语言描述)
  4. python黑马视频全套-2018年6月北京黑马python24期全套视频课程
  5. el-table 样式自定义
  6. JavaCC实现语法分析
  7. 2022-2028全球与中国电动气动转换器市场现状及未来发展趋势
  8. 版本控制软件 perforce 与 git
  9. XSS labs 闯关大合集
  10. matplotlib 柱状图画误差棒
  11. nodejs服务器与服务器之间通讯问题(nodejs服务器端创建客户端)
  12. 计算机平均数函数试题,计算机期末Excel表格题及二级考试常用函数
  13. markdown插入本地图片小技巧
  14. 十家高质量学习网站推荐给所有人
  15. 【POJ No. 2431】 丛林探险 Expedition
  16. 【新示例】这家崇尚酷、黑科技的SaaS公司,怎么让数据打通不再是扯淡?
  17. ES聚合之Bucket聚合语法讲解
  18. Python学习之路(一)
  19. 安卓盒子刷rec linux启动,ADB命令刷入recovery刷机
  20. 2-单选题精选_2009博客-精选专辑

热门文章

  1. IntelliJ IDEA设置maven
  2. 集合总结(全是代码)----------java基础学习
  3. jmeter 连接 sqlite 进行压力测试
  4. 字符串匹配算法——KMP算法学习
  5. 结对-贪吃蛇-开发过程
  6. Eclipse批量替换
  7. IOS Animation-KeyPath值
  8. intellij idea elixir 插件
  9. Hive MapJoin OOM
  10. 34muduo_net库源码分析(十)