\(\mathcal{Description}\)

  Link.

  在 NOIP 2020 A 的基础上,每条边赋权值 \(a_i\),随机恰好一条边断掉,第 \(i\) 条段的概率正比于 \(a_i\)。求每个汇集口收集到污水的期望吨数。答案模 \(998244353\)(我谢谢出题人。

\(\mathcal{Solution}\)

  方法一 这个题麻烦的地方在于 DAG 上断边,很难将每条断边的贡献一起计算(注意不是“叠加”,仅仅是一下子算出分别断开多条边的贡献之和)。我们得想个办法保持 DAG 的静态结构不变

  考虑若 \(\lang u,v\rang\) 断开,那么到达 \(u\) 的污水量期望 \(x\) 是已知的,且对于除了 \(v\) 之外 \(u\) 的所有后继 \(w\),流入量都会增加 \(\Delta_1=\frac{x}{d_u(d_u-1)}\);\(v\) 的流入量会减少 \(\Delta_2=\frac{x}{d_u}\)。当然“所有后继”所含要素过多,我们给它放到 \(u\) 身上,结合 \(\Delta_1,\Delta_2\),重新描述一下断边的影响:

  断掉 \(\lang u,v\rang\),\(u\) 会获得一条私人流入管道,流入量 \(I_u=\frac{x}{d_u-1}\);\(v\) 会获得一条私人流出管道,流出量 \(O_v=\frac{x}{d_u(d_u+1)}+\frac{x}{d_u}\)。注意 \(\lang u,v\rang\) 仍然存在且具有正常运输功能。

  嗯,DAG 不动了,随便算叭。


  方法二 \(\sf OneInDark\) 太厉害辣!

\(f(i,...)\),表示拓扑序前 \(i\) 个构成的 DAG 中,……

  不要被该死的树 DP 限制了,不要一直去想构造子树结构。

  两个方法复杂度都是 \(\mathcal O(n+m)\)。

\(\mathcal{Code}\)

  方法一。

/*+Rainybunny+*/

#include <bits/stdc++.h>

#define rep(i, l, r) for (int i = l, rep##i = r; i <= rep##i; ++i)
#define per(i, r, l) for (int i = r, per##i = l; i >= per##i; --i) 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, s = fgc();
for (; s < '0' || '9' < s; s = fgc());
for (; '0' <= s && s <= '9'; s = fgc()) x = x * 10 + (s ^ '0');
return x;
} inline void wint(const int x) {
if (9 < x) wint(x / 10);
putchar(x % 10 ^ '0');
} const int MAXN = 2e5, MAXM = 5e5, MOD = 998244353;
int n, A, B, m, sum, ecnt, head[MAXN + 5];
int ideg[MAXN + 5], odeg[MAXN + 5], osum[MAXN + 5];
int inv[MAXM + 5], que[MAXN + 5], hd, tl, f[MAXN + 5], g[MAXN + 5];
struct Edge { int to, old, nxt; } graph[MAXM + 5]; inline void link(const int s, const int t, const int o) {
graph[++ecnt] = { t, o, head[s] }, head[s] = ecnt;
} inline int mul(const int u, const int v) { return 1ll * u * v % MOD; }
inline void subeq(int& u, const int v) { (u -= v) < 0 && (u += MOD); }
inline void addeq(int& u, const int v) { (u += v) >= MOD && (u -= MOD); }
inline int sub(int u, const int v) { return (u -= v) < 0 ? u + MOD : u; }
inline int add(int u, const int v) { return (u += v) < MOD ? u : u - MOD; }
inline int mpow(int u, int v) {
int ret = 1;
for (; v; u = mul(u, u), v >>= 1) ret = mul(ret, v & 1 ? u : 1);
return ret;
} int main() {
freopen("water.in", "r", stdin);
freopen("water.out", "w", stdout); n = rint(), A = rint(), B = rint(), m = rint();
rep (i, 1, m) {
int s = rint(), t = rint(), a = rint();
link(s, t, a), ++ideg[t], ++odeg[s], addeq(osum[s], a), addeq(sum, a);
}
inv[1] = 1, sum = mpow(sum, MOD - 2);
rep (i, 2, m) inv[i] = mul(MOD - MOD / i, inv[MOD % i]); hd = 1;
rep (i, 1, A) que[++tl] = i, f[i] = g[i] = 1;
while (hd <= tl) {
int u = que[hd++], dlt = mul(f[u], mul(inv[odeg[u]],inv[odeg[u] - 1]));
addeq(g[u], mul(mul(osum[u], sum), mul(dlt, odeg[u])));
// extra input [cut(u,?)].
for (int i = head[u], v; i; i = graph[i].nxt) {
if (!--ideg[v = graph[i].to]) que[++tl] = v;
addeq(f[v], mul(f[u], inv[odeg[u]])); // normally flow.
addeq(g[v], mul(g[u], inv[odeg[u]])); // normally flow.
subeq(g[v], mul(mul(graph[i].old, sum), // extra output [cut(u,v)].
add(dlt, mul(f[u], inv[odeg[u]]))));
}
}
rep (i, n - B + 1, n) printf("%d%c", g[i], i < n ? ' ' : '\n');
return 0;
}

Solution -「多校联训」排水系统的更多相关文章

  1. Solution -「多校联训」I Love Random

    \(\mathcal{Description}\)   给定排列 \(\{p_n\}\),可以在其上进行若干次操作,每次选取 \([l,r]\),把其中所有元素变为原区间最小值,求能够得到的所有不同序 ...

  2. Solution -「多校联训」签到题

    \(\mathcal{Description}\)   Link.   给定二分图 \(G=(X\cup Y,E)\),求对于边的一个染色 \(f:E\rightarrow\{1,2,\dots,c\ ...

  3. Solution -「多校联训」朝鲜时蔬

    \(\mathcal{Description}\)   Link.   破案了,朝鲜时蔬 = 超现实树!(指写得像那什么一样的题面.   对于整数集 \(X\),定义其 好子集 为满足 \(Y\sub ...

  4. Solution -「多校联训」消失的运算符

    \(\mathcal{Description}\)   Link.   给定长度为 \(n\) 的合法表达式序列 \(s\),其中数字仅有一位正数,运算符仅有 - 作为占位.求将其中恰好 \(k\) ...

  5. Solution -「多校联训」假人

    \(\mathcal{Description}\)   Link.   一种物品有 长度 和 权值 两种属性,现给定 \(n\) 组物品,第 \(i\) 组有 \(k_i\) 个,分别为 \((1,a ...

  6. Solution -「多校联训」古老的序列问题

    \(\mathcal{Description}\)   Link.   给定序列 \(\{a_n\}\),和 \(q\) 次形如 \([L,R]\) 的询问,每次回答 \[\sum_{[l,r]\su ...

  7. Solution -「多校联训」Sample

    \(\mathcal{Description}\)   Link   (稍作简化:)对于变量 \(p_{1..n}\),满足 \(p_i\in[0,1],~\sum p_i=1\) 时,求 \(\ma ...

  8. Solution -「多校联训」光影交错

    \(\mathcal{Description}\)   Link.   一个游戏包含若干次卡牌抽取,每次以 \(p_l\) 的概率得到 \(+1\),\(p_d\) 的概率得到 \(-1\),否则得到 ...

  9. Solution -「多校联训」数学考试

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个函数,第 \(i\) 个有 \(f_i(x)=a_ix^3+b_ix^2+cx_i+d~(x\in[l_i, ...

随机推荐

  1. 基于CentOS7.x gitlab环境搭建,卸载,汉化 --汉化篇

    gitlab环境搭建,卸载,汉化--汉化篇 注意gitlab的版本需和汉化版本一致 安装git yum install -y git 下载最新的汉化包 cd git clone https://git ...

  2. spring cloud bus 消息总线 动态刷新配置文件 【actuator 与 RabbitMQ配合完成】

    1.前言 单机刷新配置文件,使用actuator就足够了 ,但是 分布式微服务 不可能是单机 ,将会有很多很多的工程 ,无法手动一个一个的发送刷新请求, 因此引入了消息中间件 ,常用的 消息中间件 是 ...

  3. 基于Spring实现策略模式

    背景: 看多很多策略模式,总结下来实现原理大体都差不多,在这里主要是讲解下自己基于Spring更优雅的实现方案:这个方案主要是看了一些开源rpc和Spring相关源码后的一些思路,所以在此进行总结 首 ...

  4. Docker的学习笔记(一)基础知识

    概述 本人最近在学习docker相关的知识,既是工作本身的需要也是自己对技术的追求的必要,以后我也会推出容器相关的随笔,既可以增长自己的知识,也可以和读者广泛交流,岂不乐乎?话不多说.第一篇先介绍do ...

  5. 《剑指offer》面试题48. 最长不含重复字符的子字符串

    问题描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度.   示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...

  6. Configmap-K8s容器的配置文件

    传递配置给容器化应用程序有几种方式: 嵌入应用本身: 通过命令行传递参数: 通过环境变量传递参数: 在k8s中无论你有没有使用configmap,以下方法均可以配置应用程序: 向容器传递命令行参数:c ...

  7. [CISCN2019 华东南赛区]Web11

    [CISCN2019 华东南赛区]Web11 写在前面 参考文章:Smarty SSTI 1.{php}{/php} Smarty已经废弃{php}标签,强烈建议不要使用.在Smarty 3.1,{p ...

  8. [C# 学习]窗体间调用控件

    一.方法1: 假如有两个窗体,Form_A和Form_B,每个窗体里都有一个按键,Button_A和Button_B,要实现单击Button_A显示窗体B,那么窗体A中Buttom_A的单击事件的程序 ...

  9. C#进阶——记一次USB HID的各种坑(x86,x64,win10,win7)

    一.简叙 写工控上位机的搬砖人,难免会遇到USB通讯,在一个项目中,我写的上位机使用USB HID协议和STM32通讯传输数据,从零大概花了几天找例程,找资料,最后是各种搬砖修补,终于出来了一个出版D ...

  10. 使用redis+lua实现SQL中的select intersect的效果

    公众号文章地址 1.需求 业务中需要实现在两个集合中搜索数据,并返回交集. 用SQL的伪代码可以描述如下: select key from set1 where sorted_key between ...