Solution -「GLR-R2」教材运送
\(\mathcal{Description}\)
Link.
给定一棵包含 \(n\) 个点,有点权和边权的树。设当前位置 \(s\)(初始时 \(s=1\)),每次在 \(n\) 个结点内随机选择目标结点 \(t\),付出「\(s\) 到 \(t\) 的简单路径上的边权之和」\(\times\)「\(t\) 的点权」的代价,标记(可以重复标记)点 \(t\) 并把 \(s\) 置为 \(t\)。求每个点至少被标记一次时(其中 \(1\) 号结点一开始就被标记)代价之和的期望。答案对 \(998244353\) 取模。
\(n\le10^6\)。
\(\mathcal{Solution}\)
首先,有期望意义下的 Min-Max 容斥的公式:
\]
对于本题,\(S=\{2,3,\cdots,n\}\),要求的答案等价于标记最后一个未标记点时代价的期望,那么枚举上式中的 \(T\),并设 \(|T|=m\),我们只需要对于每个 \(T\),求出从结点 \(1\) 出发,标记 \(T\) 集合内任意一个点的期望代价就行。
考虑一个朴素的 DP:令 \(f_T(u)\) 表示现在在 \(u\) 点(\(u\) 点已标记)时,标记 \(T\) 内任意一点的期望代价。显然:
\frac{1}n\left( \sum_{v=1}^nf_T(v)+\operatorname{dist}(u,v) \right)&u\not\in T
\end{cases}
\]
其中 \(\operatorname{dist}(u,v)\) 即表示题意中把 \(u\) 置为 \(v\) 的代价。到此,你就可以获得 \(10\) 分的好成绩啦!
接下来,取出一个 \(u\not\in T\) 的 \(f_T(u)\) 来研究:
\Rightarrow nf_T(u)-\sum_{v=1}^nf_T(v)=\sum_{v=1}^n\operatorname{dist}(u,v)
\]
令 \(s=\sum_{v\not\in T}f(v)\),\(w(u)=\sum_{v=1}^n\operatorname{dist}(u,v)\),\(C=S-T=\{c_1,c_2,\cdots,c_{n-m}\}\)(其中恒有 \(c_1=1\))列出共 \(|C|\) 个等式:
\begin{matrix}
nf_T(c_1)-s=w(c_1)\\
nf_T(c_2)-s=w(c_2)\\
\cdots\\
nf_T(c_{n-m})-s=w(c_{n-m})
\end{matrix}
\right\}n-m\text{ equations in total.}
\]
左右分别相加得到:
\Rightarrow s=\frac{\sum_{v\not\in T}w(v)}{m}
\]
于是乎,要求的 \(f_T(1)\) 就有:
\]
此后,把 \(f_T(1)\) 带入答案的式子里:
&\sum_{T\subseteq S\land T\not=\varnothing}(-1)^{|T|-1}f_T(1)\\
=&\sum_{T\subseteq S\land T\not=\varnothing}(-1)^{|T|-1}\left( \frac{w(1)}{n}+\frac{\sum_{u\not\in T}w(u)}{n|T|} \right)\\
=&\frac{1}n\sum_{m=1}^{n-1}(-1)^{m-1}\left[ \binom{n-1}mw(1)+\frac{1}m\sum_{T\subseteq S\land|T|=m}\sum_{u\not\in T}w(u) \right]
\end{aligned}
\]
令 \(g(m)=\sum_{T\subseteq S\land|T|=m}\sum_{v\not\in T}w(v)\),单独考虑结点 \(1\),它必然不属于 \(T\);再考虑其他结点的贡献次数,可以得出:
\]
最后,只需要求出 \(\sum_{u=1}^nw(u)\)。分别考虑每条边 \((u,v,b)\in E\) 的贡献。将这条边删去,记此时 \(u\) 所在联通块的结点个数为 \(p_u\),结点点权之和为 \(q_u\),\(v\) 同理。则:
\]
综上,求出这一系列式子,问题就以 \(\mathcal O(n)\) 的复杂度解决啦!
\(\mathcal{Code}\)
/* Clearink */
#include <cstdio>
inline char fgc () {
static char buf[1 << 17], *p = buf, *q = buf;
return p == q && ( q = buf + fread ( p = buf, 1, 1 << 17, stdin ), p == q ) ? EOF : *p++;
}
inline int rint () {
int x = 0; char s = fgc ();
for ( ; s < '0' || '9' < s; s = fgc () );
for ( ; '0' <= s && s <= '9'; s = fgc () ) x = x * 10 + ( s ^ '0' );
return x;
}
const int MAXN = 1e6, MOD = 998244353;
int n, ecnt, head[MAXN + 5], val[MAXN + 5], fac[MAXN + 5], ifac[MAXN + 5];
int fa[MAXN + 5], siz[MAXN + 5], sum[MAXN + 5], dist[MAXN + 5]; // dist[i]==dist(1,i).
int g[MAXN + 5];
inline int mul ( const long long a, const int b ) { return a * b % MOD; }
inline int sub ( int a, const int b ) { return ( a -= b ) < 0 ? a + MOD : a; }
inline int add ( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline void addeq ( int& a, const int b ) { ( a += b ) >= MOD && ( a -= MOD, 0 ); }
struct Edge { int to, cst, nxt; } graph[MAXN * 2 + 5];
inline void link ( const int s, const int t, const int c ) {
graph[++ecnt] = { t, c, head[s] };
head[s] = ecnt;
}
inline int qkpow ( int a, int b ) {
int ret = 1;
for ( ; b; a = mul ( a, a ), b >>= 1 ) ret = mul ( ret, b & 1 ? a : 1 );
return ret;
}
inline void init () {
fac[0] = 1;
for ( int i = 1; i <= n; ++i ) fac[i] = mul ( i, fac[i - 1] );
ifac[n] = qkpow ( fac[n], MOD - 2 );
for ( int i = n - 1; ~i; -- i ) ifac[i] = mul ( i + 1ll, ifac[i + 1] );
}
inline int inv ( const int x ) { return mul ( fac[x - 1], ifac[x] ); }
inline int comb ( const int n, const int m ) {
return n < m ? 0 : mul ( fac[n], mul ( ifac[m], ifac[n - m] ) );
}
inline void dfs ( const int u ) {
siz[u] = 1, sum[u] = val[u];
for ( int i = head[u], v; i; i = graph[i].nxt ) {
if ( ( v = graph[i].to ) ^ fa[u] ) {
dist[v] = add ( dist[fa[v] = u], graph[i].cst );
dfs ( v ), siz[u] += siz[v], addeq ( sum[u], sum[v] );
}
}
}
int main () {
n = rint ();
int vs = 0;
for ( int i = 1; i <= n; ++i ) vs = add ( vs, val[i] = rint () );
for ( int i = 1, u, v, w; i < n; ++i ) {
u = rint (), v = rint (), w = rint ();
link ( u, v, w ), link ( v, u, w );
}
init (), dfs ( 1 );
int S = 0;
for ( int u = 1; u <= n; ++u ) {
for ( int i = head[u], v; i; i = graph[i].nxt ) {
if ( ( v = graph[i].to ) ^ fa[u] ) {
addeq ( S, mul ( graph[i].cst,
add ( mul ( siz[v], sub ( vs, sum[v] ) ),
mul ( n - siz[v], sum[v] ) ) ) );
}
}
}
for ( int i = 2; i <= n; ++i ) addeq ( g[n - 1], mul ( val[i], dist[i] ) );
for ( int i = n - 2; i; --i ) {
g[i] = add ( mul ( comb ( n - 1, i ), g[n - 1] ),
mul ( comb ( n - 2, i ), sub ( S, g[n - 1] ) ) );
}
int ans = 0;
for ( int i = 1; i < n; ++i ) {
ans = ( i & 1 ? add : sub )( ans,
add ( mul ( comb ( n - 1, i ), g[n - 1] ), mul ( inv ( i ), g[i] ) ) );
}
printf ( "%d\n", mul ( ans, inv ( n ) ) );
return 0;
}
Solution -「GLR-R2」教材运送的更多相关文章
- Solution -「ARC 104E」Random LIS
\(\mathcal{Description}\) Link. 给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...
- Solution -「BZOJ 3812」主旋律
\(\mathcal{Description}\) Link. 给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
- Solution -「CERC 2016」「洛谷 P3684」机棚障碍
\(\mathcal{Description}\) Link. 给一个 \(n\times n\) 的网格图,每个点是空格或障碍.\(q\) 次询问,每次给定两个坐标 \((r_1,c_1), ...
- Solution -「CF 793G」Oleg and Chess
\(\mathcal{Description}\) Link. 给一个 \(n\times n\) 的棋盘,其中 \(q\) 个互不重叠的子矩阵被禁止放棋.问最多能放多少个互不能攻击的车. ...
- Solution -「简单 DP」zxy 讲课记实
魔法题位面级乱杀. 「JOISC 2020 Day4」治疗计划 因为是不太聪明的 Joker,我就从头开始理思路了.中途也会说一些和 DP 算法本身有关的杂谈,给自己的冗长题解找借口. 首先,治疗方案 ...
- Solution -「基环树」做题记录
写的大多只是思路,比较简单的细节和证明过程就不放了,有需者自取. 基环树简介 简单说一说基环树吧.由名字扩展可得这是一类以环为基础的树(当然显然它不是树. 通常的表现形式是一棵树再加一条非树边,把图画 ...
- Solution -「WC 2022」秃子酋长
\(\mathscr{Description}\) Link. (It's empty temporarily.) 给定排列 \(\{a_n\}\),\(q\) 次询问,每次给出 \([l,r ...
随机推荐
- 深入谈谈 Java IOC 和 DI
1.前言 不得不说, IOC和DI 在写代码时经常用到.还有个就是在面试时 ,面试官老喜欢问 IOC 和DI是什么的问题,都快被问吐了, 可是,仍然会让许多人说的支支吾吾. 为什么? 第一,因为这个知 ...
- Go语言系列之标准库log
Go语言内置的log包实现了简单的日志服务.本文介绍了标准库log的基本使用. 使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法.本包也提供了一个预定义的" ...
- vue中使用window.resize并去抖动优化
this.clientWidth = document.documentElement.clientWidth window.onresize = () => { this.clientWidt ...
- vue特效网站集锦
1.17素材网 http://www.17sucai.com/pins/tag/7012.html
- 面试必问之 CopyOnWriteArrayList,你了解多少?
一.摘要 在介绍 CopyOnWriteArrayList 之前,我们一起先来看看如下方法执行结果,代码内容如下: public static void main(String[] args) { L ...
- 使用.NET 6开发TodoList应用(29)——实现静态字符串本地化功能
系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在开发一些需要支持多种语言的应用程序时,我们需要根据切换的语言来对应展示一些静态的字符串字段,在本文中我们暂时不去讨论如何结合 ...
- Win7升级Win11升级记录及教程 【错误码(0×8004242d)】
hellow,大家好,我是公众号棱镜Prism K的[K君].家中电脑因为一些原因不得不进行升级,下面是我对这次电脑升级所进行的记录. step 1.打开微软官网,找到对应的WIN11下载模块,这里注 ...
- 【记录一个问题】铁威马NAS,升级系统后,所有安装的配置项都丢失了
因为铁威马的系统功能真的是弱,所以写了一些家庭照片处理的系统. 上上周升级了系统后,丢失了以下内容: anaconda 2.及其conda下python3环境的各种库 3.nginx的转发配置 铁威马 ...
- .NET 云原生架构师训练营(权限系统 RGCA 架构设计)--学习笔记
目录 项目核心内容 实战目标 RGCA 四步架构法 项目核心内容 无代码埋点实现对所有 API Action 访问控制管理 对 EF Core 实体新增.删除.字段级读写控制管理 与 Identity ...
- Go 变量及基本数据类型3
#### Go 变量及基本数据类型(三)今天学习一下剩下的两个基本数据类型(布尔类型,字符串类型)以及基本数据类型的相互转换##### 布尔类型布尔类型也称为bool 类型, bool 类型只允许取值 ...