ARC 板贺
AtCoder [ARC099B] Snuke Numbers
一种题目:要求 列出 前 \(k\) 小 的所有满足条件的数。
这时候有个 Trick:可以考虑求一个 \(f(n)\) 表示 \(\ge n\) 的最小的满足条件的数。这样就可以从 \(f(1)\) 出发跳 \(k-1\) 次 \(f(n+1)\) 求出前 \(k\) 小的 \(n\)。
此题中,\(f(n)\) 即为 \(\ge n\) 的数中最小化 \(\dfrac{n}{S(n)}\) 的整数 \(n\),其中 \(S\) 为十进制下数位和。而 \(f\) 容易贪心求出,依次将 \(n\) 的最后若干位改为 \(9\) 即可。
AtCoder [ARC099C] Independence
将一给定无向图 按点集 分成两个 完全子图,判断是否可行;若可行,最小化 被任一子图完全包含的边 的数目。\(n\le700,m\le \dfrac{n(n-1)}{2}\)
众所周知 团 即为 补图 中的 独立集。观察 \(n,m\) 的范围可以想到建立补图。
这是因为考虑套路:把 划分问题转化为染色问题。任一对同色节点相邻 变为补图中 任一对同色节点不相邻,后者即相当于:要求划分为一张二分图。这可以用染色法轻易解决。
断言:对于一个连通二分图,将其 二染色 的方案是 唯一 的(除交换左右部外)。
引理:对于一个非连通二分图,其每个连通块均为二分图(允许有一部为空)。
因此可以对所有连通块判断是否为二分图。若有不是者,则整个划分不可行。否则可以求出每个连通块的两部分点数 \(x,y\)。即转化为适当决定每组 \(x,y\) 分别 加入整个划分的左部还是右部。
回到此题,相当于考虑两个点集大小为 \(a,b\),最小化 \(\dfrac{a(a-1)+b(b-1)}{2}\)。由于 \(n=a+b\) 及基本不等式,简单推式子可知相当于最小化 \(|a-b|\)。
这时候已经是 集合二划分最小化大小差 的板子题,直接用一个 可行性背包 就可以解决。
AtCoder [ARC099D] Eating Symbols Hard
对于这种状态内维护一个序列的逆题,直接对于进行序列哈希。发现传统哈希即可支持按位左移 / 右移 / 单点加减 / 差分,即得到 区间 哈希值,但是还需要考虑预处理 前缀 的位移和 \(p_i\) 用来计算,设基数为 \(x\),即:
设 \(k=h_{[1,n]}=h_n\),即统计使上式等于 \(k\) 的 \((l,r)\) 数目。为了做到 \(O(n)\),考虑:
扫描线加上 map 随便统计即可。注意 Hash 强度,考虑双模数 / 双基底。
AtCoder [ARC100D] Colorful Sequences
不会。
AtCoder [ARC101C] Ribbons on Tree
带容斥系数 DP 板题。可以理解为每个方案有一个 权值 \(\pm 1\),就是套路求 所有方案权值和。
就本题而言,有一个显然的 枚举断开的边集 的 \(O(2^nn)\) 容斥做法。考虑用 带容斥系数 的树形 DP 快速计算。设 \(f_{i,j}\) 表示 \(i\) 子树内,以 \(i\) 为根的连通块大小为 \(j\) 的方案权值和。遍历每条边是否断开,决定是否取反贡献的符号即可转移。
目标:\(f_{1,n}\)。
AtCoder [ARC101D] Robots and Exits
最多可能有 \(2^n\) 种方案,也就是各个 bot 可以任意选择左出还是右出。
考虑两边(有一个方向上没有出口)的 bot 毫无贡献(选择固定),在每个方案的最后一定能让这部分中剩下的出去即可。
只考虑其余每个 bot,它选择左还是右取决于 首先移动到哪个出口。形式化地,考虑第 \(i\) 次操作的位置前 最远向左移动 \(x_i\),最远向右移动 \(y_i\) 步(前缀最值),第 \(j\) 个 bot 到左出口距离 \(a_j\),到右出口距离 \(b_j\),那么 \(j\) 的选择取决于 \(x\) 达到 \(a_j\) 和 \(y\) 达到 \(b_j\) 哪个更早发生。
考虑 几何意义(神仙!),则 \((x_i,y_i)\) 构成一条 非严格单调增折线,顶点 \((a_j\mathbf{-0.5},b_j\mathbf{-0.5})\) 在折线 上方还是下方 即可表示其 先满足 \(x\ge a_j\) 还是 \(y\ge b_j\)。然后就变成了 CSP2022J D,即枚举最后一个拐点 \(i\) 来表示一堆方案 \(f_i\),二维偏序从左下方点转移。
CAUTION:没有拐点,即全部先满足 \(x\ge a_j\) 也是合法方案。
目标:\(1+\sum f_i\)。
AtCoder [ARC102C] Stop. Otherwise...
考虑对于每个 \(x\),那么就是有若干限制形如:\((i,x-i)\) 表示两种数只能同时出现其一;\(\dfrac{x}{2}\) 最多出现一次;其余任意情况下从 \(1,2,\cdots,n\) 中 可重 选出 \(m\) 个数的方案数。把所有对子 \((i,x-i)\) (假设有 \(t\) 个)统一考虑,相当于有 \(t\) 个物品的方案数背包,DP 即可。结合对 \(x\) 的枚举,可以做到 \(O(nk^2)\)。
为了做到 \(O(nk)\),需要一个观察:限制数对之间 以及 数之间 没有本质区别。换言之,实际上只关心 限制数对的数目 以及 限制数的个数(\(0/1\)) 即可唯一确定方案数。因此,可以设 \(f_{i,j,0/1}\) 表示当前处理的数对(物品)数,背包大小(\(0\le j\le m\)),是否用过限制(只能出现一次的)数,即可完成预处理。最后根据每个 \(x\) 对应的前述两个数目调取即可。
AtCoder [ARC103C] Tr/ee
简单题,首先判一下存在解的充要条件:\(s_1=1,s_n=0,\forall 1<i<n,s_i=s_{n-i}\)。
构造:从大到小枚举每个存在的 \(siz\),每次新建一个点作为上次的点的儿子,然后给上次的点接上 \(lst-siz\) 个叶子补齐上次的点的子树大小。
AtCoder [ARC103D] Distance Sums
考虑给 数值不重复 数组 \(D_i\) 表示第 \(i\) 个点到树上其余点距离之和,如何构造。直接做无从下手,考虑 关键点。
也就是:
- \(D_i\) 最大的点是叶子。
- \(D_i\) 最小的点是重心。(注:其实 城市建造 就是一个以重心为中心递归做下去的题目,这里和此题类似)然后考虑从重心出发,运用 cmd 的 按重心移动 套路,考察重心旁点的 \(d\) 值的性质。也就是(任取一个根后)
不妨以重心为根,考察之前所说的 \(D_i\) 最大的叶子节点,可以直接 推出它的 父亲的 \(D_i\),即可知 \(fa_i\) 的值(没有相同 \(D_i\) 故取法唯一)。进而再找 \(D_i\) 次大节点,以此类推,可以推出所有 \(fa_i\),也就推出了树结构。这中途若出现找不到所需 \(D\) 值的节点的情形,即无解。
总结:在 重心 和 叶子 两类特殊节点的基础上逐步外推。
但这样得到的树,仅仅保证了 \(D_i\) 的相对数量关系。因此还需要对得到的树真实求一遍 \(D_i\),只要有一个对应得上,整棵树就一定均合法。
AtCoder [ARC103D] Distance Sums
全部减去平均数然后多重背包处理。注意到值域达到 \(k^3\) 所以需要 \(O(1)\) 转移,但是此题物品数目 \(k\) 固定 相当于每次转移的 split 完全相同,直接对模 \(k\) 各同余类内的 \(siz\) 前缀和优化即可。
AtCoder [ARC105B] MAX-=min
考虑这个操作实际上就是 \(n\) 个数做更相减损……所以答案为 \(\gcd_{i=1}^n a_i\)。
AtCoder [ARC105C] Camels and Bridge
考虑 \(n\) 很小,可以直接枚举全排列再枚举区间,进行 \(O(n!n^2)\) 次计算一个区间内的骆驼至少要隔多少距离,即:
之后问题即:求出满足所有 \(n^2\) 个 \((i,j)\) 距离限制的最小总距离。DP 即可,即设 \(f_i\) 为前 \(i\) 个的最小总距离即可。
发现这个东西只和集合 \(S\) 有关而 只有 \(2^n\) 种本质不同的 \(S\) 所以可以直接 \(O(m2^n)\) 按上式预处理。总复杂度 \(O(m2^n+n!n^2)\)。
AtCoder [ABC290F] Maximum Diameter
Vandermonde 卷积
\[\sum\limits_{i=0}^k{n\choose i}{m\choose k-i}={n+m\choose k} \]组合意义易证,亦可用二项式定理:\((x+1)^n(x+1)^m=(x+1)^{n+m}\),后者两边分别化开比较系数可证上式。
考虑合法序列仅有有限种,具体来说即 \(\sum_{i=1}^n d_i=2n-2, \forall 1\le i\le n,1\le d_i<n\)。
接下来考虑每个序列的贡献,即给定度数数组 \(d\) 求最长可能直径。遇事不决,考虑上下界。显然答案的上界即将所有 \(d_i>1\) 的点都放在直径上,若有剩余 \(d_i=1\) 可以接在两边得到的结果。
考虑证明可取到此上界。考虑从任意状态归纳,可以发现:若有不在直径上 \(d_i>1\) 的点,则其不可能只与 \(d_i=1\) 的节点相邻(因为这些点也不能接直径,则图不连通)。由此可知,一定有 \(d_i>1\) 的点恰好接在直径旁边。直接将其 单旋(?)到直径上,容易发现不改变度数。
即答案为:
回到计数。发现贡献仅和 \(d_i=1\) 的点数有关,枚举之,记为 \(i\),剩下的就是一个 \(n-2\) (每个数都减去 \(i\),调整值域从 \(1\) 开始)的 \(n-i\) 有序拆分的求,直接插板即可。
观察到卷积形式,直接拆开:
倒数第二步使用吸收恒等式,目的为吸收 \(i\) 为组合数的一部分;因此还需提出 \(n\),即得到 \(i\binom{n}{i}=n\binom{n-1}{i-1}\)。
最后一步使用 Vandermonde 卷积。后半部分将 \(i-1\) 看做一个整体。
AtCoder [ARC108D] AB
原范围 \(n\le1000\),直接对终序列做区间 DP 即可。但是可以发现这题最多只有 \(2^4\) 种变换规则,考虑分讨找规律做到 \(O(\log n)\)。
先考虑 \(c_{\mathtt{AB}}=\mathtt{B}\),则第一步一定变为 \(\mathtt{ABB}\)。注意:直接考虑什么样的终序列可行,以避免对中间过程的模拟。
- \(c_{\mathtt{BB}}=\mathtt{B}\)。此时只有 \(\mathtt{AB\cdots B}\) 共 \(1\) 种方案。
- \(c_{\mathtt{BB}}=\mathtt{A}, c_{\mathtt{BA}}=\mathtt{A}\),则考虑从 \(\mathtt{ABB}\) 出发,在 \(\mathtt{AB}\) 与 \(\mathtt{B}\) 之间,可以任意在一个 \(\mathtt{B}\) 之后加入 \(\mathtt{A}\),在一个 \(\mathtt{B}\) 后面(与最后的 \(\mathtt{B}\) 加入 \(\mathtt{B}\),形成 所有以 \(\mathtt{AB}\) 起始、\(\mathtt{BB}\) 结尾的串。故答案为 \(2^{n-3}\)。
- \(c_{\mathtt{BB}}=\mathtt{A}, c_{\mathtt{BA}}=\mathtt{B}\),则考虑从 \(\mathtt{ABB}\) 出发,在 \(\mathtt{AB}\) 与 \(\mathtt{B}\) 之间,可以任意在一个 \(\mathtt{A}\) 之前加入 \(\mathtt{B}\),在一个 \(\mathtt{B}\) 之前加入最多一个 \(\mathtt{A}\),形成 所有以 \(\mathtt{AB}\) 起始、\(\mathtt{BB}\) 结尾、\(\mathtt{A}\) 不连续的串。故答案为 \(\mathbf{Fib_{n-2}}\)。
对于 \(c_{\mathtt{AB}}=\mathtt{A}\),同理可得类似结果。
所有结果均可以用(矩阵)快速幂求出。\(O(n^2)\to O(\log n)\)。
AtCoder [ARC110D] Binomial Coefficient
非常好问题。
给定序列 \(a_1,a_2,\cdots,a_N\),对于所有长度为 \(N\) 且和不超过 \(m\) 的非负整数序列 \(b\),求 \(\prod_{i=1}^N\binom{b_i}{a_i}\) 之和,对 \(10^9+7\) 取模。\(N\le10^3,1\le m\le10^9,0\le a_i\le2\times10^3\)。
首先尝试将 和不超过 \(m\) 转化为 恰好等于 \(m\):添加一个 \(a_{N+1}=0\) 即可。下设 \(n=N+1\),然后考虑两类做法:
组合意义
组合意义化简的原理即:对同一问题的解给出不同表达式以构造恒等式。
考虑处理这个连乘,即 乘法原理:考虑构造多个互不影响的组合数形成的问题。
注意到 \(\binom{b_i}{a_i}\) 即为将 \(b_i-a_i\) 个球插入 \(a_i+1\) 个空(空看作盒子,即允许空盒插板)的方案数。考虑将 \(n\) 段 \(b_i-a_i\) 个球插入 \(a_i+1\) 个空的序列连成一列,可以发现每段之间互不影响,可以用乘法原理计算方案。同时也可看作一个整体序列内的插板问题,即 \(\sum(b_i-a_i)\) 个球插入 \(\sum(a_i+1)\) 个空。故:
暴力计算组合数做到 \(O(\sum a_i)=O(nV)\) 复杂度。
代数推导
背包型的计数合并考虑用 OGF 解决。即求 \([x^m]\prod_{i=1}^n F_{a_i}\),其中
由 \(F_0=\sum_{i\ge0}x^i=\dfrac{1}{1-x}\) 得
求上式中 \(x^m\) 的系数,相当于求
中 \(x^{m-\sum A_i}\) 的系数。而对后者求系数是一个典中典广义二项式定理。即
可得最终答案:
[ARC111C] Too Heavy
首先若初始时存在 \(i\) 使得 \(a_i\le b_{p_i}\) 且 \(p_i\neq i\) 则无论如何不可能改变 \(p_i\),因此无解。
对于排列 \(S\) 通过 交换 变换为 \(T\) 的问题,考虑拆置换环(轮换),后者容易通过交换完成,且显然次数最少。
但是环上相邻两个位置若直接交换,可能会有很大的 \(b_i\) 尚未到达 \(a_i\) 就在一个较小的 \(a_j\) 处卡住。
考虑引入交换的 中转,定义为置换环上 \(a_p\) 最大的节点 \(p\)。不是直接依次交换 \((a_{i},a_{i+1}),\cdots\) 而是依次交换 \((a_p,a_i),(a_p,a_{i+1}),\cdots\),则除非环上有 \(b_i>a_p\ge a_i\) 否则一定不会卡住,后者已经被判掉无解了。
不會「填数游戏」,我該怎麽辦?
RT
[ARC112C]
树形 DP 题。
[ARC112D]
二分图题。
[ARC113D]
[ARC114D] Moving Pieces on Line
做过,但差点还是不会。
考虑这个操作就是选 \(n\) 个区间(分别已经固定一个端点)异或 \(1\),要求达成目标序列。
直接差分。然后已经固定的端点位置异或上 \(1\),连同目标序列的 \(k\) 个分界点也要异或上 \(1\)。
就是要把前者和后者两两匹配起来,形成 \(k\) 个区间异或操作,以得到目标序列。
但是在 \(n>k\) 时,序列上会多出 \(n-k\) 个 \(1\),需要前者和前者匹配。
带权匹配问题,因为在序列上,直接二维 DP 即可 \(O(1)\) 转移。
[ARC115A] Two Choices
不会做 A,莼菜。
条件即
[ARC115B] Odd Degree
观察题。
首先要注意到(无脑选手表示真想不到吧)
若 图为一棵树,可以从叶子出发,自底向上归纳得到:选出度数为奇数的 奇点集方案 与 合法边集方案 一一对应。因此方案为 \(\binom{n}{k}\)、
进而推广到有环情形。随便取一棵生成树,可以发现任意 非树边 是否取,都会改变两个点的 树边度数奇偶性,而对应树边的所需取法也会改变。因此。当剩下 \(n-1\) 条树边未决定时,整个图的方案就唯一了。故方案数为 \(2^{m-n+1}\binom{n}{k}\)。
进而推广到多个连通块。要求奇点总和 \(k\),直接 背包 DP,求 \(f_{i,j}\) 表示前 \(i\) 个连通块选 \(j\) 个奇点的方案数。因为 \(\sum siz=n\)(相当于树形背包的 \(siz\) 优化)所以复杂度是 \(O(n^2)\) 的。
[ARC149B] Two LIS Sum
遇事不決考慮貪心。注意任意次邻项交换等价于任意两项交换。对 \(A\) 做后者,显然每次都可以使得 \(\operatorname{LIS}(A)\) 增加 \(1\),直到 \(A\) 有序。而对应于 \(B\) 上相当于任意两项交换,显然 \(\operatorname{LIS}(B)\) 减少不超过 \(1\)。
这就证明了 \(A\) 无序的任意状态 不优于 \(A\) 有序的状态。所以直接排序 \(A\),对应映射交换 \(B\),答案为
DP 求出 \(\operatorname{LIS}(B')\) 即可。
[ARC149D] Simultaneous Sugoroku
整體法大車創飛不可做題 /oh
部分题目中多组询问相对独立,但每次回答无法优化到 \(O(n)\) 等以下;这时可以手动 整体考虑,例如整体二分等,以便充分利用信息。
离散的点移动起来是 \(O(n)\) 的,考虑值域是比较小的,不如直接预处理所有出发点 \(x\in[-10^6,10^6]\) 的答案。这样点集就可以表为 区间,单个整体加减是 \(O(1)\) 的。
考虑一次平移,区间会变成 \(3\) 个部分,即留在原点的和左右平移形成的 \(2\) 个区间。但是这样区间数目指数增长,无法快速维护。考虑利用如下显然的事实:
Trick:对于 \(x\) 和 \(-x\),其经过相同 \(D\) 序列的变换后得到的结果 \(x',-x'\) 仍互为相反数。
- 我们每次只维护一段符号相同的区间 \([l,r]\) 的情况。
- 若在执行当前操作后符号不完全相同了,则利用上面的对称性将符号不同的两边中元素数量较少的一边扔了——反正后面可以通过对称性得出(实现时可以建边处理);并对恰好可以取到 \(0\) 的位置打上标记。
- 最后 dfs 一遍推出被扔掉的点的信息。
发现这样每次只需要维护 \(1\) 个区间即可。可以做到 \(O(n+m+V)\)。
[ARC150B] Make Divisible
根號分治題如果標個「Tag:根號分治」往往簡單得多,但這是需要自己想到的。所以什麽題都嘗試一下就好了。
- 其實也可能可以看數據範圍決定。例如此題:\(100\times\sqrt{10^9}\)
-
\(A\le\sqrt{B}\)
显然在最优方案中,\(X<A\)。若 \(A\) 很小就可以暴力枚举 \(X\),然后易 \(O(1)\) 求 \(Y\)。
-
\(A>\sqrt{B}\)
我是唐诗。

浙公网安备 33010602011771号