ARC 板贺

AtCoder [ARC099B] Snuke Numbers

一种题目:要求 列出 k 的所有满足条件的数。

这时候有个 Trick:可以考虑求一个 f(n) 表示 n 的最小的满足条件的数。这样就可以从 f(1) 出发跳 k1f(n+1) 求出前 k 小的 n

此题中,f(n) 即为 n 的数中最小化 nS(n) 的整数 n,其中 S 为十进制下数位和。而 f 容易贪心求出,依次将 n 的最后若干位改为 9 即可。

AtCoder [ARC099C] Independence

将一给定无向图 按点集 分成两个 完全子图,判断是否可行;若可行,最小化 被任一子图完全包含的边 的数目。n700,mn(n1)2

众所周知 团 即为 补图 中的 独立集。观察 n,m 的范围可以想到建立补图。

这是因为考虑套路:把 划分问题转化为染色问题任一对同色节点相邻 变为补图中 任一对同色节点不相邻,后者即相当于:要求划分为一张二分图。这可以用染色法轻易解决。

断言:对于一个连通二分图,将其 二染色 的方案是 唯一 的(除交换左右部外)。
引理:对于一个非连通二分图,其每个连通块均为二分图(允许有一部为空)。

因此可以对所有连通块判断是否为二分图。若有不是者,则整个划分不可行。否则可以求出每个连通块的两部分点数 x,y。即转化为适当决定每组 x,y 分别 加入整个划分的左部还是右部

回到此题,相当于考虑两个点集大小为 a,b,最小化 a(a1)+b(b1)2。由于 n=a+b 及基本不等式,简单推式子可知相当于最小化 |ab|

这时候已经是 集合二划分最小化大小差 的板子题,直接用一个 可行性背包 就可以解决。

AtCoder [ARC099D] Eating Symbols Hard

对于这种状态内维护一个序列的逆题,直接对于进行序列哈希。发现传统哈希即可支持按位左移 / 右移 / 单点加减 / 差分,即得到 区间 哈希值,但是还需要考虑预处理 前缀 的位移和 pi 用来计算,设基数为 x,即:

h[l,r]=hrhl1xpl1

k=h[1,n]=hn,即统计使上式等于 k(l,r) 数目。为了做到 O(n),考虑:

k=hrhl1xpl1

hr=kxpl1+hl1

扫描线加上 map 随便统计即可。注意 Hash 强度,考虑双模数 / 双基底。

AtCoder [ARC100D] Colorful Sequences

不会。

AtCoder [ARC101C] Ribbons on Tree

带容斥系数 DP 板题。可以理解为每个方案有一个 权值 ±1,就是套路求 所有方案权值和。

就本题而言,有一个显然的 枚举断开的边集 的 O(2nn) 容斥做法。考虑用 带容斥系数 的树形 DP 快速计算。设 fi,j 表示 i 子树内,以 i 为根的连通块大小为 j 的方案权值和。遍历每条边是否断开,决定是否取反贡献的符号即可转移。

目标:f1,n

AtCoder [ARC101D] Robots and Exits

最多可能有 2n 种方案,也就是各个 bot 可以任意选择左出还是右出。

考虑两边(有一个方向上没有出口)的 bot 毫无贡献(选择固定),在每个方案的最后一定能让这部分中剩下的出去即可。

只考虑其余每个 bot,它选择左还是右取决于 首先移动到哪个出口。形式化地,考虑第 i 次操作的位置前 最远向左移动 xi,最远向右移动 yi(前缀最值),第 j 个 bot 到左出口距离 aj,到右出口距离 bj,那么 j 的选择取决于 x 达到 ajy 达到 bj 哪个更早发生。

考虑 几何意义(神仙!),则 (xi,yi) 构成一条 非严格单调增折线,顶点 (aj0.5,bj0.5) 在折线 上方还是下方 即可表示其 先满足 xaj 还是 ybj。然后就变成了 CSP2022J D,即枚举最后一个拐点 i 来表示一堆方案 fi二维偏序从左下方点转移

CAUTION:没有拐点,即全部先满足 xaj 也是合法方案。

目标:1+fi

AtCoder [ARC102C] Stop. Otherwise...

考虑对于每个 x,那么就是有若干限制形如:(i,xi) 表示两种数只能同时出现其一;x2 最多出现一次;其余任意情况下从 1,2,,n 中 可重 选出 m 个数的方案数。把所有对子 (i,xi) (假设有 t 个)统一考虑,相当于有 t 个物品的方案数背包,DP 即可。结合对 x 的枚举,可以做到 O(nk2)

为了做到 O(nk),需要一个观察:限制数对之间 以及 数之间 没有本质区别。换言之,实际上只关心 限制数对的数目 以及 限制数的个数(0/1 即可唯一确定方案数。因此,可以设 fi,j,0/1 表示当前处理的数对(物品)数,背包大小(0jm),是否用过限制(只能出现一次的)数,即可完成预处理。最后根据每个 x 对应的前述两个数目调取即可。

AtCoder [ARC103C] Tr/ee

简单题,首先判一下存在解的充要条件:s1=1,sn=0,1<i<n,si=sni

构造:从大到小枚举每个存在的 siz,每次新建一个点作为上次的点的儿子,然后给上次的点接上 lstsiz 个叶子补齐上次的点的子树大小。

AtCoder [ARC103D] Distance Sums

考虑给 数值不重复 数组 Di 表示第 i 个点到树上其余点距离之和,如何构造。直接做无从下手,考虑 关键点。

也就是:

  1. Di 最大的点是叶子
  2. Di 最小的点是重心。(注:其实 城市建造 就是一个以重心为中心递归做下去的题目,这里和此题类似)然后考虑从重心出发,运用 cmd 的 按重心移动 套路,考察重心旁点的 d 值的性质。也就是(任取一个根后)

Du=Dvszu+(nszu)

不妨以重心为根,考察之前所说的 Di 最大的叶子节点,可以直接 推出它的 父亲的 Di,即可知 fai 的值(没有相同 Di 故取法唯一)。进而再找 Di 次大节点,以此类推,可以推出所有 fai,也就推出了树结构。这中途若出现找不到所需 D 值的节点的情形,即无解。

总结:在 重心叶子 两类特殊节点的基础上逐步外推。

但这样得到的树,仅仅保证了 Di相对数量关系。因此还需要对得到的树真实求一遍 Di,只要有一个对应得上,整棵树就一定均合法。

AtCoder [ARC103D] Distance Sums

全部减去平均数然后多重背包处理。注意到值域达到 k3 所以需要 O(1) 转移,但是此题物品数目 k 固定 相当于每次转移的 split 完全相同,直接对模 k 各同余类内的 siz 前缀和优化即可。

AtCoder [ARC105B] MAX-=min

考虑这个操作实际上就是 n 个数做更相减损……所以答案为 gcdi=1nai

AtCoder [ARC105C] Camels and Bridge

考虑 n 很小,可以直接枚举全排列再枚举区间,进行 O(n!n2) 次计算一个区间内的骆驼至少要隔多少距离,即:

maxivi<jSajli

之后问题即:求出满足所有 n2(i,j) 距离限制的最小总距离。DP 即可,即设 fi 为前 i 个的最小总距离即可。

发现这个东西只和集合 S 有关而 只有 2n 种本质不同的 S 所以可以直接 O(m2n) 按上式预处理。总复杂度 O(m2n+n!n2)

AtCoder [ABC290F] Maximum Diameter

Vandermonde 卷积

i=0k(ni)(mki)=(n+mk)

组合意义易证,亦可用二项式定理:(x+1)n(x+1)m=(x+1)n+m,后者两边分别化开比较系数可证上式。

考虑合法序列仅有有限种,具体来说即 i=1ndi=2n2,1in,1di<n

接下来考虑每个序列的贡献,即给定度数数组 d 求最长可能直径。遇事不决,考虑上下界。显然答案的上界即将所有 di>1 的点都放在直径上,若有剩余 di=1 可以接在两边得到的结果。

考虑证明可取到此上界。考虑从任意状态归纳,可以发现:若有不在直径上 di>1 的点,则其不可能只与 di=1 的节点相邻(因为这些点也不能接直径,则图不连通)。由此可知,一定有 di>1 的点恰好接在直径旁边。直接将其 单旋(?)到直径上,容易发现不改变度数。

即答案为:

ni=1n[di=1]

回到计数。发现贡献仅和 di=1 的点数有关,枚举之,记为 i,剩下的就是一个 n2 (每个数都减去 i,调整值域从 1 开始)的 ni 有序拆分的求,直接插板即可。

i=2n1(n+1i)(ni)(n3ni1)

观察到卷积形式,直接拆开:

i=0n(n+1i)(ni)(n3ni1)=(n+1)i=0n(ni)(n3ni1)i=0n(n+1i)n!(ni)!i!(n3ni1)=(n+1)i=0n(ni)(n3ni1)ni=0n(n1)!(ni)!(i1)!(n3ni1)=(n+1)(2n3n1)n(2n4n2)

倒数第二步使用吸收恒等式,目的为吸收 i 为组合数的一部分;因此还需提出 n,即得到 i(ni)=n(n1i1)

最后一步使用 Vandermonde 卷积。后半部分将 i1 看做一个整体。

AtCoder [ARC108D] AB

原范围 n1000,直接对终序列做区间 DP 即可。但是可以发现这题最多只有 24 种变换规则,考虑分讨找规律做到 O(logn)

先考虑 cAB=B,则第一步一定变为 ABB。注意:直接考虑什么样的终序列可行,以避免对中间过程的模拟。

  1. cBB=B。此时只有 ABB1 种方案。
  2. cBB=A,cBA=A,则考虑从 ABB 出发,在 ABB 之间,可以任意在一个 B 之后加入 A,在一个 B 后面(与最后的 B 加入 B,形成 所有以 AB 起始、BB 结尾的串。故答案为 2n3
  3. cBB=A,cBA=B,则考虑从 ABB 出发,在 ABB 之间,可以任意在一个 A 之前加入 B,在一个 B 之前加入最多一个 A,形成 所有以 AB 起始、BB 结尾、A 不连续的串。故答案为 Fibn2

对于 cAB=A,同理可得类似结果。

所有结果均可以用(矩阵)快速幂求出。O(n2)O(logn)

AtCoder [ARC110D] Binomial Coefficient

非常好问题。

给定序列 a1,a2,,aN,对于所有长度为 N 且和不超过 m 的非负整数序列 b,求 i=1N(biai) 之和,对 109+7 取模。N103,1m109,0ai2×103

首先尝试将 和不超过 m 转化为 恰好等于 m:添加一个 aN+1=0 即可。下设 n=N+1,然后考虑两类做法:

组合意义

组合意义化简的原理即:对同一问题的解给出不同表达式以构造恒等式。

考虑处理这个连乘,即 乘法原理:考虑构造多个互不影响的组合数形成的问题。

注意到 (biai) 即为将 biai 个球插入 ai+1 个空(空看作盒子,即允许空盒插板)的方案数。考虑将 nbiai 个球插入 ai+1 个空的序列连成一列,可以发现每段之间互不影响,可以用乘法原理计算方案。同时也可看作一个整体序列内的插板问题,即 (biai) 个球插入 (ai+1) 个空。故:

i=1n(biai)=(mai+ai+n1n+ai1)=(m+n1n+ai1)=(N+mN+ai)

暴力计算组合数做到 O(ai)=O(nV) 复杂度。

代数推导

背包型的计数合并考虑用 OGF 解决。即求 [xm]i=1nFai,其中

Fj(x)=i0(ij)xi=i0((i1j1)+(i1j))xi=i0(i1j1)xi+i0(i1j)xi=xFj1(x)+xFj(x)=x1xFj1(x)

F0=i0xi=11x

Fj(x)=xj(1x)j+1i=1nFAi=xai(1x)n+ai

求上式中 xm 的系数,相当于求

(11x)n+ai

xmAi 的系数。而对后者求系数是一个典中典广义二项式定理。即

(11x)j=[xi](11x)j=(i+j1i)

可得最终答案:

(mai+n+ai1mai)=(m+n1mai)=(m+n1n+ai1)=(N+mN+ai)

[ARC111C] Too Heavy

首先若初始时存在 i 使得 aibpipii 则无论如何不可能改变 pi,因此无解。

对于排列 S 通过 交换 变换为 T 的问题,考虑拆置换环(轮换),后者容易通过交换完成,且显然次数最少

但是环上相邻两个位置若直接交换,可能会有很大的 bi 尚未到达 ai 就在一个较小的 aj 处卡住。

考虑引入交换的 中转,定义为置换环上 ap 最大的节点 p。不是直接依次交换 (ai,ai+1), 而是依次交换 (ap,ai),(ap,ai+1),,则除非环上有 bi>apai 否则一定不会卡住,后者已经被判掉无解了。

不會「填数游戏」,我該怎麽辦?

RT

[ARC112C]

树形 DP 题。

[ARC112D]

二分图题。

[ARC113D]

i,j, minj=1mGi,jGi,jmaxi=1nGi,ji,j, AiBj

[ARC114D] Moving Pieces on Line

做过,但差点还是不会。

考虑这个操作就是选 n 个区间(分别已经固定一个端点)异或 1,要求达成目标序列。

直接差分。然后已经固定的端点位置异或上 1,连同目标序列的 k 个分界点也要异或上 1

就是要把前者和后者两两匹配起来,形成 k 个区间异或操作,以得到目标序列。

但是在 n>k 时,序列上会多出 nk1,需要前者和前者匹配。

带权匹配问题,因为在序列上,直接二维 DP 即可 O(1) 转移。

[ARC115A] Two Choices

不会做 A,莼菜。

条件即

2popc(axorb)[2popc(a)][2popc(b)]

[ARC115B] Odd Degree

观察题。

首先要注意到(无脑选手表示真想不到吧)

图为一棵树,可以从叶子出发,自底向上归纳得到:选出度数为奇数的 奇点集方案 与 合法边集方案 一一对应。因此方案为 (nk)

进而推广到有环情形。随便取一棵生成树,可以发现任意 非树边 是否取,都会改变两个点的 树边度数奇偶性,而对应树边的所需取法也会改变。因此。当剩下 n1 条树边未决定时,整个图的方案就唯一了。故方案数为 2mn+1(nk)

进而推广到多个连通块。要求奇点总和 k,直接 背包 DP,求 fi,j 表示前 i 个连通块选 j 个奇点的方案数。因为 siz=n(相当于树形背包的 siz 优化)所以复杂度是 O(n2) 的。

[ARC149B] Two LIS Sum

遇事不決考慮貪心。注意任意次邻项交换等价于任意两项交换。对 A 做后者,显然每次都可以使得 LIS(A) 增加 1,直到 A 有序。而对应于 B 上相当于任意两项交换,显然 LIS(B) 减少不超过 1

这就证明了 A 无序的任意状态 不优于 A 有序的状态。所以直接排序 A,对应映射交换 B,答案为

LIS(A)+LIS(B)=n+LIS(B)

DP 求出 LIS(B) 即可。

[ARC149D] Simultaneous Sugoroku

整體法大車創飛不可做題 /oh

部分题目中多组询问相对独立,但每次回答无法优化到 O(n) 等以下;这时可以手动 整体考虑,例如整体二分等,以便充分利用信息。

离散的点移动起来是 O(n) 的,考虑值域是比较小的,不如直接预处理所有出发点 x[106,106] 的答案。这样点集就可以表为 区间,单个整体加减是 O(1) 的。

考虑一次平移,区间会变成 3 个部分,即留在原点的和左右平移形成的 2 个区间。但是这样区间数目指数增长,无法快速维护。考虑利用如下显然的事实:

Trick:对于 xx,其经过相同 D 序列的变换后得到的结果 x,x 仍互为相反数。

  • 我们每次只维护一段符号相同的区间 [l,r] 的情况。
  • 若在执行当前操作后符号不完全相同了,则利用上面的对称性将符号不同的两边中元素数量较少的一边扔了——反正后面可以通过对称性得出(实现时可以建边处理);并对恰好可以取到 0 的位置打上标记。
  • 最后 dfs 一遍推出被扔掉的点的信息。

发现这样每次只需要维护 1 个区间即可。可以做到 O(n+m+V)

[ARC150B] Make Divisible

根號分治題如果標個「Tag:根號分治」往往簡單得多,但這是需要自己想到的。所以什麽題都嘗試一下就好了。

  • 其實也可能可以看數據範圍決定。例如此題:100×109
  1. AB

    显然在最优方案中,X<A。若 A 很小就可以暴力枚举 X,然后易 O(1)Y

  2. A>B

    我是唐诗。

posted @   音街ウナ  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示