ARC-124 部分题解
E
直接统计原式不好做,注意到首先我们应该知道怎样的 \(x\) 序列是合法的,那么不妨首先来统计一下合法的 \(x\) 序列数量。
令 \(b_i\) 为 \(i\) 向右给的球数,那么有(\(i = 1\) 特殊考虑):
\]
那么考虑令 \(b\) 的差分数组 \(d, d_i = b_i - b_{i - 1}(i > 1), d_1 = d_1 - d_n\),根据上式 \(x\) 和 \(d\) 构成双射。
但注意到 \(d\) 不与 \(b\) 构成双射,\(d\) 不方便限制大小但 \(b\) 好统计,那么不妨观察一下哪些 \(b\) 会对应同一个 \(d\)。
不难发现若将 \(b\) 整体 \(+x\) 会对应一个相同的 \(d\),反之也成立。
于是我们考虑钦定 \(\min b_i = 0\) 的序列合法,那么此时合法的 \(b\) 序列就可以与 \(x\) 构成双射且容易得到 \(x\) 序列。
那么考虑一下合法的 \(x\) 序列的数量,等价于要求:
\min b_i = 0 \\
b_i \le a_i (1 \le i \le n)
\end{cases}\]
容易使用容斥解决,答案为:
\]
那么现在回到原题,注意到所求答案式子比较奇怪,那么基本上就要考虑组合意义了。
容易发现 \(\prod x_i\) 的组合意义:有 \(n\) 个盒子,第 \(i\) 个盒子有 \(x_i\) 个球,问从每个盒子拿出 \(1\) 个球的方案,球有标号。
考虑 \(\rm dp\),因为值域很大,所以不能将值域记录在状态内。
但注意到每个盒子剩下的球必定是自己拿出去剩下的和之前的盒子给过来的,确定每个盒子取自己的球还是取之前盒子的球后方案数就是独立的。
因此可以令 \(f_{i, 0 / 1, 0 / 1}\) 表示当前考虑完前 \(i\) 个盒子,当前盒子取出的球是自己剩下的还是之前盒子传过来的,当前是否选过一个 \(b_j = 0\)。
转移考虑下一个位置选球状态和当前传过去多少个球,容易优化到 \(\mathcal{O}(1)\),复杂度 \(\mathcal{O}(n)\)。
需要注意的是:因为人构成环,所以第一个人的选球状态需要一开始钦定,因此需要做两边上述 \(\rm dp\)。
F
首先我们将 \(n, m\) 都减小一,将矩阵平移到以左下角为原点。
首先考虑一个暴力,由于两个人只会恰好相遇一次,因此考虑枚举两个人的相遇点 \((p, q)\)。
那么就只要算出 \(f_{p, q}, g_{p, q}\) 分别为两个人从起点 / 终点同时走到 \((p, q)\) 的方案,两者显然等价,于是我们一下仅考虑算 \(f\)。
令第一个人在纵、横方向上分别走了 \(x_1, y_1\) 步,第二个人类似地走 \(x_2, y_2\) 步。
那么两个人在 \((p, q)\) 相遇当且仅当:
p + x_1 = n \\
x_2 = p\\
y_1 = y_2 = q
\end{cases}
\]
接着我们有如下观察:
- 两个人相遇位置一定是同一行连续的一段区间。
于是我们可以考虑枚举这一行第一个相遇的位置 \((p, i)\),之后为了强制钦定两者在 \((p, q)\) 再次相遇一次,那么他们两者在横方向上一定要恰好走了 \(q - i\) 步。
容易发现两者在横方向上都走 \(q - i\) 步的方案为:\(\binom{2(q - i)}{q - i}\),那么就有转移:
\]
复杂度 \(\mathcal{O}(n ^ 3)\),考虑优化。
容易发现后面的和式部分转移系数与 \(p\) 无关,那么不妨考虑将所有 \(f\) 合起来一起转移:
令 \(g_q = \sum\limits_p f_{p, q}\),那么应该有转移:
\]
但此时存在一个问题,这样无法计算得到每个点确切的值因而无法与终点到该点的方案进行合并。
问题在于上面的做法是在我们确定相遇点基础上进行的,那么我们是不是可以先不确定相遇点呢?
根据上述判定相交的方法可以发现,无论两者怎么走,若一起在纵方向上走 \(n\) 步之后在同一列就一定会相遇。
因此本质上横纵方向上的移动是独立的,纵方向上在哪个位置相遇与横方向上哪个位置相遇是无关的。
换句话说,对于纵方向上相遇的每种方案都可以与横方向上相组合。
容易发现纵方向上相遇的每种方案就是任意一种纵方向方案在第 \(n\) 个操作位置后划开,前半部分放在起点到 \((p, q)\) 的路径上,后半部分放在 \((p, q)\) 到终点的路径上。
因此我们在计算所有方案的时候可以考虑先在计算横方向操作的时候将纵方向操作位置预留,最后再将任意一种方案插入进去就可以了。
那么最终的答案就是:\(\sum\limits_i ^ m \binom{2n}{n} \times g_i \times g_{m - i}\),下面考虑如何求 \(g\)。
根据上述对 \(g\),重新的定义,我们不难发现转移:
\]
此时用半在线卷积转移 \(g\) 可以做到 \(\mathcal{O}(n \log ^ 2 n)\),还不够优秀,考虑继续优化。
我们此时发现:对于在同一行仅有横方向在走的情况下保证两个人不相遇是很容易的。
将第一个人看作左括号,第二个人看作右括号(也可以换过来),这个问题等价于问有多少个完美匹配括号序列使得其不能划分成两个完美匹配括号序列。
根据之前的经验,容易得知这就是前一项的卡特兰数。
考虑强制首尾括号匹配,那么只需要先在首尾填好括号让中间放入一个长为 \(n - 1\) 的完美匹配括号就可以与上述括号序列构成双射。
因此我们可以考虑枚举最后一个相遇的位置,那么前面的方案就可以使用钦定的方法算了:
令 \(h_i = \binom{n + 2i}{n}\binom{2i}{i}\),那么就有转移:
\]
这就是一个卷积,直接使用 \(\rm NTT\) 优化即可,复杂度 \(\mathcal{O}(n \log n)\)。
ARC-124 部分题解的更多相关文章
- ARC 122 简要题解
ARC 122 简要题解 传送门 A - Many Formulae 考虑对于每个数分别算其贡献. 通过枚举该数前面的符号,借助一个非常简单的 \(\mathrm{DP}\)(\(f_{i,0/1}\ ...
- RMAN异机恢复遭遇ORA-01547、ORA-01152、ORA-01110错误案例
测试环境: 操作系统 : Red Hat Enterprise Linux ES release 4 (Nahant Update 4) VMWARE 数据库 : O ...
- JustOj 1032: 习题6.7 完数
题目描述 一个数如果恰好等于它的因子之和,这个数就称为"完数". 例如,6的因子为1.2.3,而6=1+2+3,因此6是"完数". 编程序找出N之内的所有完数, ...
- JDOJ 1140: 完数
JDOJ 1140: 完数 题目传送门 Description 一个数如果恰好等于它的因子之和,这个数就称为"完数". 例如,6的因子为1.2.3,而6=1+2+3,因此6是&qu ...
- 【题解】Atcoder ARC#96 F-Sweet Alchemy
首先,我们发现每一个节点所选择的次数不好直接算,因为要求一个节点被选择的次数大于等于父亲被选择的次数,且又要小于等于父亲被选择的次数 \(+D\).既然如此,考虑一棵差分的树,规定每一个节点被选择的次 ...
- 【题解】Atcoder ARC#94 F-Normalization
再次膜拜此强题!神级性质之不可能发现系列收藏++:首先,对于长度<=3的情况,我们采取爆搜答案(代码当中是打表).对于长度>=4的情况,则有如下几条玄妙的性质: 首先我们将 a, b, c ...
- [题解] Atcoder Regular Contest ARC 148 A B C E 题解
点我看题 题目质量一言难尽(至少对我来说 所以我不写D的题解了 A - mod M 发现如果把M选成2,就可以把答案压到至多2.所以答案只能是1或2,只要判断答案能不能是1即可.如果答案是1,那么M必 ...
- [题解] Atcoder Regular Contest ARC 147 A B C D E 题解
点我看题 A - Max Mod Min 非常诈骗.一开始以为要观察什么神奇的性质,后来发现直接模拟就行了.可以证明总操作次数是\(O(nlog a_i)\)的.具体就是,每次操作都会有一个数a被b取 ...
- [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP
题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...
- [题解] Atcoder Regular Contest ARC 151 A B C D E 题解
点我看题 昨天刚打的ARC,题目质量还是不错的. A - Equal Hamming Distances 对于一个位置i,如果\(S_i=T_i\),那么不管\(U\)的这个位置填什么,对到\(S\) ...
随机推荐
- 【错误】NetBeans2007:Cannot find nbproject/build-impl.xml
从中国考试教育网下载的NetBeans中国考试教育版2007报错 E:\æ¡é¢\javaèè¯\JavaApplication4\build.xml:7: Cannot find nbpr ...
- MySQL启用SSL连接
1.手动创建自认证证书 1.1 创建CA证书 openssl genrsa 2048 > ca-key.pem openssl req -new -x509 -nodes -days 3600 ...
- Linux 安装并启用 PHP-FPM
首先,在编译时带上 --enable-fpm 参数: [root@localhost local]# yum -y install libxml2 libxml2-devel gd gd-devel ...
- Selenium_使用execute_script执行JavaScript(11)
selenium的包含的方法已能完全满足UI自动化,但是有些时候又不得不用到执行JS的情况,比如在一个富文本框中输入1W个字,使用send_keys方法将经历漫长的输入过程,如果换成使用JS的inne ...
- i++ 和 ++i 区别
i++:是先把i拿出来使用,然后再+1: ++i :是先把i+1,然后再拿出来使用:
- 缓存一致性性协议MESI笔记
概述 今天的笔记只是讲解一下MESI的概念和使用场景的介绍,MESI(Modified Exclusive Shared Or Invalid)也称为伊利诺斯协议,是一种广泛使用的支持协会策略的缓存一 ...
- GNU C字节对齐__attribute__((aligned(n))) #pragma pack(n)
在阅读gnu软件c源代码时,经常会遇到字节对齐相关操作,比如uboot命令相关的代码中,会遇到__attribute__((aligned(n)))扩展关键字,#pragma pack(n)预处理指令 ...
- day 13 函数指针类型
(1).有以下程序: 则正确的选项是[B] (A).7 4 (B).4 10 (C).8 8 (D)10 10 分析:主要考求字符串的长度,strlen是专门求字符串长度的函数,但不包含'\0'在内. ...
- 自从学会了VBA字典,VLOOKUP都不那么香了
上篇博文中,小爬曾多次为VBA字典带货.鼓励多用字典,可以让我们的VBA脚本工具执行更快.今天小爬来细聊一下VBA字典的具体应用!如果你有一定VBA基础,那么看完你一定会对VBA字典有全新的认识:如果 ...
- [C语言基础] 数组与指针之间的引用
通过指针引用数组,通过数组引用指针,你搞明白了么?通过下面3种情形来了解一下数组和指针 Case 1. unsigned char arry[10]; unsigned char *ptr; unsi ...