洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?)

标签:题解

阅读体验:https://zybuluo.com/Junlier/note/1327573

原题链接:洛谷P3412 仓鼠找sugar II

好像只有洛谷有诶。。。

日常吐槽

这个期望题开发新思维方式还是比较好的。。。

毕竟还是很难想的。。。鸣谢\(fdfDarkfire\)教我做这个题!

题解来了

很容易发现答案就是\(\dfrac{\sum_{i=1}^{n}\sum_{i=1}^{n}dis[i][j]}{n^2}\% MOD\)是吧

但是不会在短时间内算分子部分啊。。。

但是我们可以发现:如果可以固定住终点,那么会很容易算

所以我们先钦定终点在\(1\),然后考虑某种方法来启发计算所有点为终点的情况

终点在\(1\)

不妨把\(1\)作为根

本来一个\(DFS\)可以搞定,但是对正解毫无启发,所以再想一下

我们设\(f[now]\)表示从\(now\)跳到\(fa[now]\)的期望步数

那么有(这个自己思考一下就行了)(\(qw\)是儿子,\(d\)是度数)$$f[now]=1+\frac{1}{d[now]}×\sum(f[qw]+f[now])$$草稿纸上化简一下会得到\(f[now]=d[now]+\sum f[qw]\)

哇,这不是很美丽!得到\(f[now]=\sum d[x]\)(\(x\)在\(now\)的子树内)

突然发现\(f\)数组只和子树度数和有关,嘿嘿、、、

这样也可以很方便地统计答案是吧:\(Ans=siz[now]×f[now]\)

说一下为什么,\(now\)往\(fa[now]\)的边只会被\(now\)的子树中节点去用\(f[x]\)走是吧,而\(f[now]\)全统计到了\(f[x]\),所以直接乘

那么我们发现,固定一个点为终点时答案只和当前点为根时的$\sum $子树大小×子树度数和 有关

拓展到终点随机

上面那个结论很重要

我们现在对每个点进行考虑,是不是它有很多个方向出去,那些方向都有可能有终点

我们分别计算那些终点是在哪一个方向

  1. 肯定还是先以\(1\)为根把上面所需的所有东西处理出来
  2. 枚举每个点枚举边考虑根的方向
  3. 如果根在树中的\(1\)的方向,就是\(fa[now]\)方向,肯定有\(Ans+=siz[now]*f[now]*(n-siz[now])%MOD\)

    意思是对于根在\(fa[now]\)方向有\((n-siz[now])\)种位置,而每种位置此时贡献都是\(siz[now]*f[now]\)(上面说了的)
  4. 如果根在树中的某个儿子方向,就是\(qw\)方向,肯定有\((n-siz[qw])*(tot-f[qw])*siz[qw])\),含义的话根据\(fa[now]\)方向的情况自己想一下吧

PS:上面这一段有不理解可以根据代码看

这样我们就统计完了总表达式的分子部分,乘个逆元就解决了。。。

#include<bits/stdc++.h>
#define il inline
#define rg register
#define ldb double
#define lst long long
#define rgt register int
#define N 100050
#define qw ljl[i].to
#define MOD 998244353
using namespace std;
const int Inf=1e9;
il int MAX(rgt x,rgt y){return x>y?x:y;}
il int MIN(rgt x,rgt y){return x<y?x:y;}
il int read()
{
int s=0,m=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')m=1;ch=getchar();}
while( isdigit(ch))s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return m?-s:s;
} int n;lst Ans;
int hd[N],cnt,tot;
int f[N],siz[N],fa[N],d[N];
//f: the step's expectation of now jumps to fa[now] (as the root of 1)
//f[now]=Σf[qw]+d[now]=totd[](in son_tree) 写题的时候写的傻逼英语。。。
struct EDGE{int to,nxt;}ljl[N<<1];
il void Add(rgt p,rgt q){ljl[++cnt]=(EDGE){q,hd[p]},hd[p]=cnt;}
il void ADD(rg lst &x,rg lst y){x+=y;if(x>MOD)x-=MOD;}
il int qpow(rg lst x,rgt y)
{
rg lst ret=1;
while(y)
{
if(y&1)ret=(ret*x)%MOD;
x=(x*x)%MOD,y>>=1;
}return ret;
} void Dfs(rgt now,rgt fm)
{
fa[now]=fm,siz[now]=1,f[now]=d[now];
for(rgt i=hd[now];i;i=ljl[i].nxt)
{
if(qw==fm)continue;Dfs(qw,now);
siz[now]+=siz[qw],f[now]+=f[qw];
}
} int main()
{
n=read();
for(rgt i=1,p,q;i<n;++i)
{
p=read(),q=read();
++d[p],++d[q],Add(p,q),Add(q,p);
}Dfs(1,0);
for(rgt i=1;i<=n;++i)tot+=d[i];
for(rgt now=1;now<=n;++now)
for(rgt i=hd[now];i;i=ljl[i].nxt)
{
if(qw==fa[now])ADD(Ans,1LL*siz[now]*f[now]%MOD*(n-siz[now])%MOD);
else ADD(Ans,1LL*(n-siz[qw])*(tot-f[qw])%MOD*siz[qw]%MOD);
}
return printf("%lld\n",Ans*qpow(1LL*n*n%MOD,MOD-2)%MOD),0;
}

洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)的更多相关文章

  1. Luogu P3412 仓鼠找$sugar$ $II$

    Luogu P3412 仓鼠找\(sugar\) \(II\) 题目大意: 给定一棵\(n\)个点的树, 仓鼠每次移动都会等概率选择一个与当前点相邻的点,并移动到此点. 现在随机生成一个起点.一个终点 ...

  2. 洛谷P3398 仓鼠找sugar [LCA]

    题目传送门 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  3. 洛谷 P3398 仓鼠找sugar 解题报告

    P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  4. 洛谷 P3398 仓鼠找sugar 题解

    每日一题 day44 打卡 Analysis 首先有一个结论:先找 p1=(a,b),p2=(c,d) 的LCA的深度,在与(a,c),(a,d),(b,c),(b,d)中最深的LCA n的深度比较, ...

  5. 洛谷P3398 仓鼠找sugar

    题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...

  6. 洛谷——P3398 仓鼠找sugar

    https://www.luogu.org/problem/show?pid=3398#sub 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴 ...

  7. 洛谷 3398 仓鼠找sugar 【模板】判断树上两链有交

    [题解] 题意就是判断树上两条链是否有交.口诀是“判有交,此链有彼祖”.即其中一条链的端点的Lca在另一条链上. 我们设两条链的端点的Lca中深度较大的为L2,对L2与另一条链的两个端点分别求Lca, ...

  8. 洛谷 [P3398] 仓鼠找sugar

    树剖求LCA 我们可以发现,两条路径ab,cd相交,当且仅当 dep[lca(a,b)]>=dep[lca(c,d)]&(lca(lca(a,b),c)==lca(a,b)||lca(l ...

  9. P3412 仓鼠找sugar II

    思路 挺神的概率期望.. 好吧是我太弱了,完全没有往那里想 注意期望是具有线性性的,一条路径的期望可以变成每条边的期望求和 概率是某件事发生的可能性,期望是某件事确定发生的代价 首先没有终点的条件并不 ...

随机推荐

  1. 30. ClustrixDB 分布式架构/Rebalancer

    Rebalancer是一个自动化系统,用于维护集群中数据的健康分布.通过修改数据的分布和位置来响应“不健康”集群是Rebalancer的工作.Rebalancer是一个在线进程,它影响对集群的更改,对 ...

  2. 用户输入和while 循环

    input 工作原理 函数input()让程序暂停运行,等待用户输入一些文本.获取用户输入后,Python将其存储在一个变量中. message = input("need to input ...

  3. AJAX - 向服务器发送请求请求

    AJAX - 向服务器发送请求请求 XMLHttpRequest 对象用于和服务器交换数据.直线电机生产厂家 向服务器发送请求 如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 ...

  4. XML 文档包含 XML 元素。

    XML 文档包含 XML 元素. 什么是 XML 元素? XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分. 元素可包含其他元素.文本或者两者的混合物.元素也可以拥有属性. < ...

  5. Ansible跳板机自动部署

    首先,安装ansible,略过此步骤. 一.控制机(jenkens.ansible所在机器与跳板机之间互信,跳板机与目的机之间互信) 1.在客户端生成公钥私钥对 命令:ssh-keygen -t rs ...

  6. (转)openssl 命令: openssl req 命令详解

                                      openssl req命令主要的功能有,生成证书请求文件, 查看验证证书请求文件,还有就是生成自签名证书.本文就主要记录一下open ...

  7. JSON.stringify方法报错:Converting circular structure to JSON

    别以为JSON.parse(JSON.stringify(data))做深拷贝无敌,对于以下这种情况,当你需要保留父级对象,即 对象存在循环引用,就会报错. var a = [ { "id& ...

  8. ppapi,npapi

    PPAPI也就是Pepper Plugin API,是在原有网景NPAPI(Netscape Plugin API)基础上发展而来的.NPAPI是当今最流行的插件架构,几乎所有浏览器都支持,不过存在很 ...

  9. SpringMvc中@ModelAttribute的运用

    /** * 1. 有 @ModelAttribute 标记的方法, 会在每个目标方法执行之前被 SpringMVC 调用! * 2. @ModelAttribute 注解也可以来修饰目标方法 POJO ...

  10. SpEL 实例

    SpEl 实例 基于 Spring 解析 @RestController @RequestMapping("/spel") @Slf4j public class SpELCont ...