NOI Online #2 提高组 游戏
没用二项式反演的菜比。
Solution
非平局代表的树上祖先关系是比较好统计,(可以在处理一个点时,考虑用他去匹配他的子树中的东西)而平局的关系比较难统计。我们不妨求出至少 \(k\) 个祖先关系的方案数,接着用容斥原理得到恰好 \(k\) 个祖先关系的方案数。
求出至少 k 个祖先关系的方案数
状态设计
设 \(f_{u, i}\) 为以 \(u\) 为根的子树中,已经有了 \(i\) 对相互配对的祖先点的方案数。
状态转移
这个状态是由 \(u\) 的每个儿子与 \(u\) 的影响共同作用的,不妨先把 \(u\) 的每个儿子都合并起来,最后考虑 \(u\) 对状态的影响。
设之前已经合并过子树的数组是 \(f_u\),当前的儿子是 \(v\),我们只需合并 \(f_u\) 和 \(f_v\) 即可,即 \(f_{u, i + j} \gets \sum f_{u, i} \times f_{v, j}\),可以理解为一个树上背包,体积是相互配对的祖先点对数,价值的方案数。
考虑 \(u\) 的作用,让 \(u\) 和子树中的一个没有被匹配的点匹配,设 \(u\) 的颜色是 \(C_u \in {0, 1}\)。设 \(u\) 的子树中 \(0 / 1\) 颜色的点数量是 \(Size_{u, 0/1}\),\(!C_u\) 表示和 \(C_u\) 的颜色相反。那么 \(f_{u, i} \gets f_{u, i - 1} \times (Size_{u, !C_u} - (i - 1))\)(这一步很妙,无需记录别的信息就可以直接让 \(u\) 做到匹配,原因是通过已经匹配对数以及我们处理的树上信息可以计算出能匹配的点数)
答案
设 \(g_i\) 为整棵树中,至少有 \(k\) 对祖先关系(钦定了 \(k\) 对,剩下的不知道是不是祖先)的方案数,有 \(g_i = C_m^i \times f_{1, i}\),即先选出 \(i\) 对,然后剩下的自由匹配。
注意这里的至少和我们常接触的那个“至少”可能不太一样,具体看后面容斥的解释。
DP 的时间复杂度
第一个合并乍一看是 \(O(n^3)\) 的,但其实如果卡 \(i\) 的上限,发现 \(i\) 这一维不会超过 \(Size_u\)(以 \(u\) 为根的子树大小),那么一次合并的时间是 \(Size_{之前子树的和} \times Size_v\),相当于两块间两两的有序点对,那么两个点只会在 \(LCA\) 带来一次合并的贡献,所以是 \(O(n^2)\) 的。
用容斥原理得到恰好 k 个祖先
设 \(Ans_i\) 为整棵树中,恰好有 \(k\) 对祖先关系的方案数,即我们的答案。
发现这个 \(g\) 有点奇怪,就比如说我恰好有三组匹配 \(Ans_3 = 1\) 为 \(1、2、3\) (三个祖先匹配关系的编号没有实际意义),但 \(g_2\) 可以有 \(1、2\) 被钦定,\(3\) 随机对成祖先、可以有 \(1、3\) 被钦定,\(2\) 随机对成祖先、可以有 \(2、3\) 被钦定,\(1\) 随机对成祖先三种。换句话说,\(Ans_3\) 对 \(g_2\) 的贡献是 \(C_3^2 \times Ans_3\),总结一下:
可以把 \(g_i\) 的所有方案数划分成这样的类别:恰好有 \(i, i + 1, i + 2, ...m\),而对于一个恰好为 \(j \ge i\) 组的一个方案,他对 \(g_i\) 的贡献有 \(C_j^i\),可以理解为从 \(j\) 个里面选出 \(i\) 个,作为 \(g_i\) 中实际选定的那 \(i\) 个,即:
\(g_i = \sum_{j=i}^{m} (m-i)! \times Ans_j\)
由于 \(C_i^i = 1\),将如上式子进行变换,可以得到一个关于 \(Ans_i\) 的表达式:
\(Ans_i = g_i - \sum_{j=i+1}^m C_j^i \times Ans_j\)
即我们只需要知道 \(g_i\) 和 \(m \ge j > i\) 的 \(Ans_j\),就能算出 \(Ans_i\)。
那么从大到小推一遍,\(Ans\) 就出来了。
总时间复杂度
\(O(n^2)\)
Code
代码中实现没有再新建 \(g\) 与 \(Ans\) 数组,而是直接在 \(f_{1}\) 数组上操作。
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 5005, P = 998244353;
typedef long long LL;
// sz[i] 表示以 i 为根子树的大小,cnt[i][0 / 1] 与文中的 size[i][0 / 1] 意义相同
int n, m, f[N][N], sz[N], cnt[N][2], tmp[N];
int fact[N], infact[N];
char s[N];
int head[N], numE = 0;
struct E{
int next, v;
} e[N << 1];
void inline add(int u, int v) {
e[++numE] = (E) { head[u], v };
head[u] = numE;
}
int inline power(int a, int b) {
int res = 1;
while (b) {
if (b & 1) res = (LL)res * a % P;
a = (LL)a * a % P;
b >>= 1;
}
return res;
}
void dfs(int u, int fa) {
f[u][0] = 1;
for (int i = head[u]; i; i = e[i].next) {
int v = e[i].v;
if (v == fa) continue;
dfs(v, u);
for (int j = 0; j <= sz[u] + sz[v]; j++) tmp[j] = 0;
for (int j = 0; j <= sz[u]; j++)
for (int k = 0; k <= sz[v]; k++)
tmp[j + k] = (tmp[j + k] + (LL)f[u][j] * f[v][k]) % P;
for (int j = 0; j <= sz[u] + sz[v]; j++) f[u][j] = tmp[j];
sz[u] += sz[v], cnt[u][0] += cnt[v][0], cnt[u][1] += cnt[v][1];
}
sz[u]++;
if (s[u] == '0') cnt[u][0]++;
else cnt[u][1]++;
for (int i = sz[u]; i; i--)
f[u][i] = (f[u][i] + (LL)f[u][i - 1] * (cnt[u][s[u] == '0' ? 1 : 0] - (i - 1))) % P;
}
int inline C(int a, int b) {
return (LL)fact[a] * infact[b] % P * infact[a - b] % P;
}
int main() {
scanf("%d%s", &n, s + 1);
m = n / 2;
fact[0] = infact[0] = 1;
for (int i = 1; i <= m; i++) fact[i] = (LL)fact[i - 1] * i % P;
infact[m] = power(fact[m], P - 2);
for (int i = m - 1; i; i--) infact[i] = (LL)infact[i + 1] * (i + 1) % P;
for (int i = 1, u, v; i < n; i++)
scanf("%d%d", &u, &v), add(u, v), add(v, u);
dfs(1, 0);
for (int i = 0; i <= m; i++) f[1][i] = (LL)f[1][i] * fact[m - i] % P;
for (int i = m; ~i; i--)
for (int j = i + 1; j <= m; j++)
f[1][i] = ((f[1][i] - (LL)f[1][j] * C(j, i)) % P + P) % P;
for (int i = 0; i <= m; i++) printf("%d\n", f[1][i]);
return 0;
}
NOI Online #2 提高组 游戏的更多相关文章
- 洛谷 P6478 - [NOI Online #2 提高组] 游戏(二项式反演+树形 dp)
题面传送门 没错这就是我 boom0 的那场 NOIOL 的 T3 一年前,我在 NOIOL #2 的赛场上折戟沉沙,一年后,我从倒下的地方爬起. 我成功了,我不再是从前那个我了 我们首先假设 A 拥 ...
- luogu P6570 [NOI Online #3 提高组]优秀子序列 二进制 dp
LINK:P6570 [NOI Online #3 提高组]优秀子序列 Online 2的T3 容易很多 不过出于某种原因(时间不太够 浪了 导致我连暴力的正解都没写. 容易想到 f[i][j]表示前 ...
- [NOI Online 2021 提高组] 积木小赛
思路不说了. 想起来自己打比赛的时候,没睡好.随便写了个\(HASH\),模数开小一半分都没有. 然后学了\(SAM\),发现这个判重不就是个水题. \(SAM\)是字串tire的集合体. 随便\(d ...
- [NOI Online #2 提高组]涂色游戏 题解
题目描述 你有 1020 个格子,它们从 0 开始编号,初始时所有格子都还未染色,现在你按如下规则对它们染色: 编号是 p1 倍数的格子(包括 0号格子,下同)染成红色. 编号是 p2 倍数的格子染成 ...
- NOI Online #2 提高组 游记
没 NOI Online 1 挂的惨就来写游记吧,不知道为啥 NOI Online 1 民间数据测得 60 分的 T1 最后爆零了... 昏昏沉沉的醒来,吃了早饭,等到 \(8:30\) 进入比赛网页 ...
- CCF NOI Online 2021 提高组 T2 积木小赛 (子序列自动机+后缀自动机,O(n^2))
题面 Alice 和 Bob 最近热衷于玩一个游戏--积木小赛. Alice 和 Bob 初始时各有 n 块积木从左至右排成一排,每块积木都被标上了一个英文小写字母. Alice 可以从自己的积木中丢 ...
- NOI Online #3 提高组 T1水壶 题解
题目描述 有 n 个容量无穷大的水壶,它们从 1∼n 编号,初始时 i 号水壶中装有 Ai 单位的水. 你可以进行不超过 k 次操作,每次操作需要选择一个满足 1≤x≤n−1 的编号 x,然后把 x ...
- NOI On Line 提高组题解
(话说其实我想填的是去年CSP的坑...但是貌似有一道题我还不会写咕咕咕... 先写一下这一次的题解吧. T1:序列.题意省略. 两种操作.这种题要先分析部分分 给出了全部都是2操作的子任务. 发现A ...
- NOI Online #3 提高组 游记
考的好就来写游记吧 2020.5.24 星期日 上一天晚上为了班里事物做 PPT 肝到 11:30,这比赛就打打玩玩.第二天醒来有点昏昏沉沉的感觉. 打开题面,一看 T1,好像是个性质极其简单的前缀和 ...
随机推荐
- git命令学习之clone指定分支代码
今天要拉取一个项目,但是是一个指定分支,本来我以为直接git clone就行,但是发现好像不能,报错: Cloning into 'lecture'...fatal: unable to update ...
- go-zero之web框架
go-zero 是一个集成了各种工程实践的 web 和 rpc 框架,其中rest是web框架模块,基于Go语言原生的http包进行构建,是一个轻量的,高性能的,功能完整的,简单易用的web框架 服务 ...
- Ceph编译加速的小技巧
总结了几个小技巧,用于在ceph编译过程中,能够更快一点 修改clone的地址 git clone https://github.com/ceph/ceph.git 可以修改成 git clone g ...
- 【Redis】利用 Redis 实现分布式锁
技术背景 首先我们需要先来了解下什么是分布式锁,以及为什么需要分布式锁. 对于这个问题,我们可以简单将锁分为两种--内存级锁以及分布式锁,内存级锁即我们在 Java 中的 synchronized 关 ...
- jsonp和普通的ajax区别
1.请求类型.返回类型不一样 2.返回数据类型
- MySQL如何实现万亿级数据存储?
前言 业界对系统的高可用有着基本的要求,简单的说,这些要求可以总结为如下所示. 系统架构中不存在单点问题. 可以最大限度的保障服务的可用性. 一般情况下系统的高可用可以用几个9来评估.所谓的几个9就是 ...
- 什么是NTFS文件格式
说到磁盘格式,想必大家对于NTFS格式并不陌生.我们使用的u盘等硬盘设备很多都应用了此格式.NTFS文件格式究竟是什么?它都有哪些特点?今天,小编将利用这篇文章为大家进行介绍. 一.什么是NTFS文件 ...
- 解决Maven项目中pom.xml文件报错(Failure to transfer....)的问题
打开pom.xml文件,查看错误,如果错误类型为:Failure to transfer.........之类的,则表明你的pom中依赖的jar包没有完全下载. 解决方法:找到你本地的maven仓库, ...
- iOS程序内实现版本更新
最近这段时间刚把手头里面的两个项目交付出去,很想写点东西但又不想随随便便的写些抒情的文字,其实生活中的很多事情.成长的路上遇到的很多问题,并非简简单单的抱怨.埋怨,用一种激情悲昂的情绪去逃避.去发泄所 ...
- 【模版】【P3806】点分治
(7.17)早就想学点分治了--今天状态不太在线,眯一会写篇笔记来理理思路. ------------------------------------------------------------- ...