E

直接统计原式不好做,注意到首先我们应该知道怎样的 \(x\) 序列是合法的,那么不妨首先来统计一下合法的 \(x\) 序列数量。

令 \(b_i\) 为 \(i\) 向右给的球数,那么有(\(i = 1\) 特殊考虑):

\[x_i = a_i + b_{i - 1} - b_i = a_i - (b_i - b_{i - 1})(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\) 序列的数量,等价于要求:

\[\begin{cases}
\min b_i = 0 \\
b_i \le a_i (1 \le i \le n)
\end{cases}\]

容易使用容斥解决,答案为:

\[\prod (a_i + 1) - \prod a_i
\]

那么现在回到原题,注意到所求答案式子比较奇怪,那么基本上就要考虑组合意义了。

容易发现 \(\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)\) 相遇当且仅当:

\[\begin{cases}
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}\),那么就有转移:

\[f_{p, q} = \dbinom{n + 2q}{n} \times \dbinom{n}{p} \times \dbinom{2q}{q} - \sum\limits_{i < q} \dbinom{2(q - i)}{q - i} f_{p, i}
\]

复杂度 \(\mathcal{O}(n ^ 3)\),考虑优化。

容易发现后面的和式部分转移系数与 \(p\) 无关,那么不妨考虑将所有 \(f\) 合起来一起转移:

令 \(g_q = \sum\limits_p f_{p, q}\),那么应该有转移:

\[g_q = \dbinom{n + 2q}{n} \dbinom{2q}{q}2 ^ q - \sum\limits_{i < q} \dbinom{2(q - i)}{q - i} \times g_i
\]

但此时存在一个问题,这样无法计算得到每个点确切的值因而无法与终点到该点的方案进行合并。

问题在于上面的做法是在我们确定相遇点基础上进行的,那么我们是不是可以先不确定相遇点呢?

根据上述判定相交的方法可以发现,无论两者怎么走,若一起在纵方向上走 \(n\) 步之后在同一列就一定会相遇。

因此本质上横纵方向上的移动是独立的,纵方向上在哪个位置相遇与横方向上哪个位置相遇是无关的。

换句话说,对于纵方向上相遇的每种方案都可以与横方向上相组合。

容易发现纵方向上相遇的每种方案就是任意一种纵方向方案在第 \(n\) 个操作位置后划开,前半部分放在起点到 \((p, q)\) 的路径上,后半部分放在 \((p, q)\) 到终点的路径上。

因此我们在计算所有方案的时候可以考虑先在计算横方向操作的时候将纵方向操作位置预留,最后再将任意一种方案插入进去就可以了。

那么最终的答案就是:\(\sum\limits_i ^ m \binom{2n}{n} \times g_i \times g_{m - i}\),下面考虑如何求 \(g\)。

根据上述对 \(g\),重新的定义,我们不难发现转移:

\[g_i = \dbinom{n + 2i}{n}\dbinom{2i}{i} - \sum\limits_{j < i} \dbinom{2(i - j)}{i - j}g_j
\]

此时用半在线卷积转移 \(g\) 可以做到 \(\mathcal{O}(n \log ^ 2 n)\),还不够优秀,考虑继续优化。

我们此时发现:对于在同一行仅有横方向在走的情况下保证两个人不相遇是很容易的。

将第一个人看作左括号,第二个人看作右括号(也可以换过来),这个问题等价于问有多少个完美匹配括号序列使得其不能划分成两个完美匹配括号序列。

根据之前的经验,容易得知这就是前一项的卡特兰数。

考虑强制首尾括号匹配,那么只需要先在首尾填好括号让中间放入一个长为 \(n - 1\) 的完美匹配括号就可以与上述括号序列构成双射。

因此我们可以考虑枚举最后一个相遇的位置,那么前面的方案就可以使用钦定的方法算了:

令 \(h_i = \binom{n + 2i}{n}\binom{2i}{i}\),那么就有转移:

\[g_i = h_i - 2\sum\limits_{j < i} c_{i - j - 1} \times h_j
\]

这就是一个卷积,直接使用 \(\rm NTT\) 优化即可,复杂度 \(\mathcal{O}(n \log n)\)。

ARC-124 部分题解的更多相关文章

  1. ARC 122 简要题解

    ARC 122 简要题解 传送门 A - Many Formulae 考虑对于每个数分别算其贡献. 通过枚举该数前面的符号,借助一个非常简单的 \(\mathrm{DP}\)(\(f_{i,0/1}\ ...

  2. RMAN异机恢复遭遇ORA-01547、ORA-01152、ORA-01110错误案例

    测试环境:     操作系统  :  Red Hat Enterprise Linux ES release 4 (Nahant Update 4)   VMWARE     数据库     :  O ...

  3. JustOj 1032: 习题6.7 完数

    题目描述 一个数如果恰好等于它的因子之和,这个数就称为"完数". 例如,6的因子为1.2.3,而6=1+2+3,因此6是"完数". 编程序找出N之内的所有完数, ...

  4. JDOJ 1140: 完数

    JDOJ 1140: 完数 题目传送门 Description 一个数如果恰好等于它的因子之和,这个数就称为"完数". 例如,6的因子为1.2.3,而6=1+2+3,因此6是&qu ...

  5. 【题解】Atcoder ARC#96 F-Sweet Alchemy

    首先,我们发现每一个节点所选择的次数不好直接算,因为要求一个节点被选择的次数大于等于父亲被选择的次数,且又要小于等于父亲被选择的次数 \(+D\).既然如此,考虑一棵差分的树,规定每一个节点被选择的次 ...

  6. 【题解】Atcoder ARC#94 F-Normalization

    再次膜拜此强题!神级性质之不可能发现系列收藏++:首先,对于长度<=3的情况,我们采取爆搜答案(代码当中是打表).对于长度>=4的情况,则有如下几条玄妙的性质: 首先我们将 a, b, c ...

  7. [题解] Atcoder Regular Contest ARC 148 A B C E 题解

    点我看题 题目质量一言难尽(至少对我来说 所以我不写D的题解了 A - mod M 发现如果把M选成2,就可以把答案压到至多2.所以答案只能是1或2,只要判断答案能不能是1即可.如果答案是1,那么M必 ...

  8. [题解] Atcoder Regular Contest ARC 147 A B C D E 题解

    点我看题 A - Max Mod Min 非常诈骗.一开始以为要观察什么神奇的性质,后来发现直接模拟就行了.可以证明总操作次数是\(O(nlog a_i)\)的.具体就是,每次操作都会有一个数a被b取 ...

  9. [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP

    题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...

  10. [题解] Atcoder Regular Contest ARC 151 A B C D E 题解

    点我看题 昨天刚打的ARC,题目质量还是不错的. A - Equal Hamming Distances 对于一个位置i,如果\(S_i=T_i\),那么不管\(U\)的这个位置填什么,对到\(S\) ...

随机推荐

  1. Explain执行计划详解

    一.id id: :表示查询中执行select子句或者操作表的顺序,id的值越大,代表优先级越高,越先执行. id大致会出现 3种情况 二.select_type select_type:表示 sel ...

  2. Log4自定义Appender介绍

    最初想要在执行一段业务逻辑的时候调用一个外部接口记录审计信息,一直找不到一个比较优雅的方式,经过讨论觉得log4j自定义的appender或许可以实现此功能.后来就了解了一下log4j的这部分. Ap ...

  3. Winform中使用HttpClient与后端api服务进行交互

    前端js可以使用ajax.axios发出http请求 在c#中winform.控制台等可以通过WebRequest.WebClient.HttpClient 有关三个类的性能对比大家可以自己搜一下,这 ...

  4. nginx -g "daemon off;" 你学废了吗?

    去年的时候写了一篇原创<前后端分离,如何在前端项目中动态插入后端API基地址?(in docker)>, 我自认为这篇生产实践是对大前端. 容器化.CI/CD的得意之作. 对于前后端分离的 ...

  5. <数据结构>hash进阶

    hash函数构建 采取26进制 对于字符串str,令**H[i] = H[i-1]*26 + index(str[i]) **,最后H[i-1]就是str的hash值 问题:hash值过大,无法表式 ...

  6. Java Web程序设计笔记 • 【目录】

    章节 内容 实践练习 Java Web程序设计作业目录(作业笔记) 第1章 Java Web程序设计笔记 • [第1章 Web应用程序] 第2章 Java Web程序设计笔记 • [第2章 JSP基础 ...

  7. Kubernetes-Kuboard

    前言 本篇是Kubernetes第十五篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战. Kubernetes系列文章: Kubernetes介绍 Kubernetes环境搭建 Kubern ...

  8. MySQL删除数据库或表(DROP DATABASE/table语句)

    DROP DATABASE [ IF EXISTS ] <数据库名> DROP table[ IF EXISTS ] <数据库表名> 语法说明如下: <数据库名>: ...

  9. Maven+ajax+SSM实现删除

    转载自:https://www.cnblogs.com/kebibuluan/p/9020381.html 3.尚硅谷_SSM高级整合_使用ajax操作实现删除的功能 点击删除的时候,要删除联系人,这 ...

  10. GIL全局解释器锁、死锁现象、python多线程的用处、进程池与线程池理论

    昨日内容回顾 僵尸进程与孤儿进程 # 僵尸进程: 所有的进程在运行结束之后并不会立刻销毁(父进程需要获取该进程的资源) # 孤儿进程: 子进程正常运行 但是产生该子进程的父进程意外死亡 # 守护进程: ...