【JZOJ5911】Travel
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相关推荐
- 【UVA 10816】 Travel in Desert (最小瓶颈树+最短路)
[题意] 有n个绿洲, m条道路,每条路上有一个温度,和一个路程长度,从绿洲s到绿洲t,求一条道路的最高温度尽量小, 如果有多条, 选一条总路程最短的. Input Input consists of ...
- hihoCoder 1578 Visiting Peking University 【贪心】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)...
#1578 : Visiting Peking University 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Ming is going to travel for ...
- 【python】关于python的链表结构实现
[参考] [https://blog.csdn.net/weixin_37728031/article/details/81145258][注意链表结构,节点包括数值和next.链表中的head] [ ...
- 【HDOJ图论题集】【转】
1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...
- 【干货】Duang!看好产品是如何增加情感化设计的?
原研哉在他的<设计中的设计>中有介绍过这样一个案例:日本机场原来是用一个圆圈和一个方块表示出入的区别,形式简单并且好用,但设计师佐藤雅彦却用一个更"温暖"的方式来重新设 ...
- 【产品】腾讯内部的顶级产品课:灵动在细节
原研哉在他的<设计中的设计>中有介绍过这样一个案例:日本机场原来是用一个圆圈和一个方块表示出入的区别,形式简单并且好用,但设计师佐藤雅彦却用一个更"温暖"的方式来重新设 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- JavaWeb黑马旅游网-学习笔记01【准备工作】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...
- 阿里巴巴对Java编程【控制语句】的规约
转载自 阿里巴巴对Java编程[控制语句]的规约 控制语句 1. [强制]在一个 switch 块内,每个 case 要么通过 break / return 等来终止,要么注释说明程序将继续执行到哪一 ...
最新文章
- UOJ#460. 新年的拯救计划 构造
- ABAP table buffer test
- [SpecialJudge]构造“神秘“字符串(洛谷P3742题题解,Java语言描述)
- python黑马视频全套-2018年6月北京黑马python24期全套视频课程
- el-table 样式自定义
- JavaCC实现语法分析
- 2022-2028全球与中国电动气动转换器市场现状及未来发展趋势
- 版本控制软件 perforce 与 git
- XSS labs 闯关大合集
- matplotlib 柱状图画误差棒
- nodejs服务器与服务器之间通讯问题(nodejs服务器端创建客户端)
- 计算机平均数函数试题,计算机期末Excel表格题及二级考试常用函数
- markdown插入本地图片小技巧
- 十家高质量学习网站推荐给所有人
- 【POJ No. 2431】 丛林探险 Expedition
- 【新示例】这家崇尚酷、黑科技的SaaS公司,怎么让数据打通不再是扯淡?
- ES聚合之Bucket聚合语法讲解
- Python学习之路(一)
- 安卓盒子刷rec linux启动,ADB命令刷入recovery刷机
- 2-单选题精选_2009博客-精选专辑