2609 近期练习

时隔 17 个月,我再次来刷题。

AT_arc200_a [ARC200A] Dot Product

我在想,如果只有 \(X_1,X_2\),那么这就是一个典型的高中线性规划问题。也就是解方程 \(A_1X_1+A_2X_2>0\) and \(B_1X_1+B_2X_2<0\)。把 \(A_1X_1+A_2X_2=0\) 和 \(B_1X_1+B_2X_2=0\) 两条直线画在平面直角坐标系上,二者都过原点。且不难看出,如果两条直线不重合的话就一定有解。且解一定在第二象限和第四象限中的一个象限里。

那么现在我们就找两直线不重合。即:\(A_i/A_j\neq B_i/B_j\)。剩下的全部令 \(X=0\),转化为二元问题。这非常好找。我们可以强制选 \(X_1\neq 0\),再找一个 \(p\) 使得 \(A_1/A_p\neq B_1/B_p\) 即可。如果找不到这样的 \(p\),就意味着向量 \((A_1,A_2,\dots,A_n)//(B_1,B_2,\dots,B_n)\),那么也找不到两直线不重合。

找到两直线不重合之后,移项,分讨正负,解方程,最后化为这种形式:\(a/b<x_1/x_2<c/d\),这种,\(x_1,x_2\) 要整数解,此时灵光一现,有 \(\dfrac ab<\dfrac{a+c}{b+d}<\dfrac c d\),那么另 \(x_1=a+c,b_2=b+d\) 即可。

CF2255B A Ribbon for Tomorrow

题意:给一个 01 串,每次可以选 \(l\le r\) 且 \(s_l=s_r\),反转 \(s[l..r]\),问能得到多少种不同的串,模 998244353。

看到"端点同色",第一反应是按颜色分段(run)看。反转一段串就是把段内的 run 序列倒序,长度原封不动;两端因为 \(s_l=s_r\),跟段外的拼接断点不增不减,所以 run 数 \(k\) 不变,\(s_1,s_n\) 也不变。等价地说,相邻不同的"断点"个数守恒——反转只是把区间内的断点镜像。

但光有 \(k\) 不够。拿 \(00110\) 跑暴力:\(k=3\),可达串却只有 \(00110,01100\) 两个,而不是 \(C(4,2)=6\) 个。说明还有第二个不变量。

把状态压成 run 长度向量 \((a_1,\dots,a_k)\),精确写一次操作的效果:选 \(i<j\) 且 \(j\equiv i\pmod 2\),把 \((a_i,a_j)\) 换成任意和不变的正数对,中间段 \(a_{i+1..j-1}\) 倒序。倒序后 run 的新位置 \(i+j-p\equiv p\pmod 2\),所以 run 只在同奇偶类内流动,于是奇数位长度和 \(S_{odd}\)、偶数位长度和 \(S_{even}\) 都守恒。

反过来也成立:奇数位 run 构成一条链,链上相邻对之间可以搬运任意单位长度(\(l\) 取前一个 run 开头、\(r\) 取后一个 run 里即可),复合起来能达到所有满足两个和的正整数向量。

答案就是隔板法:\(k_{odd}=\lceil k/2\rceil,\ k_{even}=\lfloor k/2\rfloor\),\(ans=\binom{S_{odd}-1}{k_{odd}-1}\cdot\binom{S_{even}-1}{k_{even}-1}\),\(O(n)\)。

AT_arc200_c [ARC200C] Movie Theater

先拆贡献吧,不如直接每对人考虑。如果两个人时间区间相离,则无任何影响。如果两个人时间区间相交,则无论如何都会有 \(1\) 的贡献。如果两个人时间区间呈包含关系,则时间区间大的那个人尽量坐里面(\(p_i\) 大),产生 \(0\) 贡献。

不难发现所有这样的“两个人时间区间呈包含关系”都可以满足产生 \(0\) 贡献。所以最小答案就是所有 \(0\) 贡献取到。

可以建一张 DAG 图,然后相当于最小化拓扑序序列的字典序。考虑建反图出来用大根堆跑拓扑排序即可。

抄一下证明:从后往前想:「排最后」= 位置 n,是给每个点的最大惩罚。在必须选一个出度为 0 的点放末尾时,应把惩罚给编号最大的那个(它受的影响最小——因为字典序先比较小号点)。

交换论证:设最优解最后一位是 \(y\),而 \(x\) 是当前出度为 0 的最大编号点(\(x>y\))。\(x\) 无后继,把它移到末尾仍合法;此时 \(y\) 和中间所有点位置各前移 1。受影响的点中最小标号者必是 \(y\) 或某个中间点(都小于 \(x\)),它的位置严格变小,且更小的标号位置都不变 → \(p\) 字典序严格变小,矛盾。所以最后一位必取最大出度 0 点;放定后剩下的是同构子问题,归纳即证。

AT_arc200_d [ARC200D] |A + A|

挺有意思。先随便构造几个,比如 \(0,1,2..,p\) 可构造出 \([0,2p]\) 的所有值,这样所有奇数就构造完了。

考虑偶数,不如这样 \(0,2,3,4...,p\) 这样所有 \(\ge 6\) 的偶数也构造完了(特判 \(m=k\))。

考虑 \(k=2,4\)。可以随机化玩一下。\(k=2\) 的时候必须满足 \(m\) 为偶数。构造 \(0,m/2\)。

\(k=4\) 的时候必须满足 \(m\) 为 \(4\) 的倍数。构造 \(0,m/4,2m/4,3m/4\)。

补记(沉淀一下这题的思考方式):

① 平移不变性:\(A\) 整体加 \(t\) 后每个两两和都 \(+2t\),\(|A+A|\) 不变,故可设 \(0\in A\)。更一般地:任取 \(a_0\in A\),\(a_0+A\subseteq A+A\) 无条件成立(\(a_0+a_i\) 本身就是合法的两两和)。人话:\(A\) 自己加自己,必然装得下自己的一份平移拷贝。

本题里它只出现在必要性证明:设 \(0\in A\) 后,\(k=4\) 才能由 \(A\subseteq S\)、\(|A|=|S|\) 推出 \(A+A=A\)(封闭),六个和 \(0,a,b,2a,2b,a+b\) 才有锚点列等式。构造方向用不到它。

② 背后的大框架(加性组合):模 \(M\) 加法群里的和集大小问题。经典结论 \(|A+A|\ge 2|A|-1\)(取等是等差数列);和集更小时,\(A\) 只有两大类原型:

  • 等差数列及其扰动——奇数 \([0,p]\)、偶数的"区间换端点"都是;
  • 子群/陪集——\(k=2\) 的 \(\{0,m/2\}\) 是二阶子群,\(k=4\) 的四元素 \(\{0,m/4,2m/4,3m/4\}\) 是四阶子群。

子群存在 ⇔ \(m\) 被阶整除,这正是 \(k=2,4\) 要求 \(m\) 偶、\(4\mid m\) 的深层原因(题解的三元素 \(\{0,m/4,m/2\}\) 也长在这个骨架上)。

AT_arc201_a [ARC201A] CatCoder Double Contest

老了,这个题都卡。根据贪心,\(b_i\) 肯定是用完的。所以我们可以先确定出最后 div1 与 div2 总共多少场(总和是定值,可称为特征量)。
然后我们可以算出 div1 的场数的范围(是一个区间)。然后看这个区间过不过中点即可。

AT_arc201_c [ARC201C] Prefix Covering

翻译该条件:“对于任意长度为 \(10^{100}\) 的 AB 字符串,X 中有至少一个串是它的前缀”,只需要建出字典树很容易发现一个自底向上的 dp 形式。

AT_arc201_d [ARC201D] Match, Mod, Minimize

这个题我本来直觉就是对的,边军训边想,我就是对的。但是好像过程有点坎坷,被自己和 v4-flash 误导了。

首先可以二分 mid,然后自然的联想到二分图完美匹配,然后可以用 Hall 定理判定。注意 Hall 定理显然不是枚举所有子集,而是只需要管“最可能不满足条件”的集合能否满足条件(称“危险集合”)。

把 \(b\) 序列排序然后首位相接成环。有个关键发现:对于某 \(a_i\) 来说,满足 \((a_i+b_i)\bmod m\le mid\) 的 \(b_i\) 的范围一定是环上的连续段。

什么叫管“危险”的集合能否满足条件呢?我们只需要判定这样的集合是否满足 \(|N(S)|\ge |S|\),即:\(a_i\) 连续,\(a_i\) 对应的 \(b_i\) 区间也连续。

注意把环翻 \(2\) 倍拆成链。设 \([L_i,R_i]\) 表示 \(a_i\) 所对应的区间,那么考虑取 \(S=\{a_i,a_{i+1},...a_j\}\),那么 \(N(S)=[L_i,R_j]\),则只需要判断是否有 \(j-i> R_j-L_i\),移项得 \(j-R_j>i-L_i\)。如果有就相当于不合法了。

这个只需要记一下 \(i-L_i\) 的前缀最小值即可。

同时,如果没有完全匹配,就注定存在一个上述危险集合。而如果有完全匹配,则注定不存在。可以自行理解一下。

AT_arc201_e [ARC201E] Total Area of Bounding Boxes

第一步神之一手,拆贡献,考虑每个 \(1\times1\) 方格的贡献。这个就简单了,容斥即可。

答案 \(=(n−1)^2(2^n−1) − 4·\sum(半平面) + 4·\sum(象限)\)。然后可以转化为简单扫描线。也就是对所有方格 \((x,y)\),设 \(c\) 表示 \([1,x][1,y]\) 中的点的数量,求 \(2^{c}-1\) 之和。线段树只需要区间 \(\times 2\) 全局求和。

或者还有一种做法,乘法分配律展开,大概求 \(\sum_{S} \max_{p\in S}x_p \times \max_{p\in S}y_p\) 的,有时间再看看。

AT_arc202_a [ARC202A] Merge and Increment

好题。思路算是简单的,但是如何实现还是需要琢磨。需要在已有的思路上再观察一些性质。

原有思路:类似洪水上涨。每次把最小值往上推进。如果有相同的相邻就合并。从某侧开始合并,如果有就直接合并。但是这样的话不太好写。

所以观察一个性质:每个元素都至少要变到与之相邻的两个元素一样大才可能进行操作。

那么用一个堆,每次取出最小的元素(如果有相同取靠后的),把这个元素变得和某相邻元素一样大。然后先别急着合并。等到这个元素再次被取出的时候,如果与前驱相同就合并。

gpt5.6sol 认为可以从中学到 ”RLE“,也许跟所谓 "Run" 相关。

AT_arc202_b [ARC202B] Japanese "Knight's Tour"

这题神了。(一开始看错题目了以为是正常的马)。

首先可以发现 \(H\) 为偶数时答案为 \(0\),那么 \(H\) 只需要考虑奇数。那么每次跳两行其实没有用看成是跳一行就行。

考虑手玩样例。我是这样玩的:把步分为 \(W\) 轮,每轮从第一行跳到最后一行,把每行的每个位置是第几轮经过的记下来,这样可以得到 \(H\) 个 \(1\sim W\) 的排列,那么只需要对这群排列计数即可。

相邻的排列需要满足相同的数的位置差为 \(1\)。如果 \(W\) 为奇数,那么相邻的排列只可以循环移位。如果 \(W\) 为偶数,那么相邻的排列可以邻项交换或者循环移位。

第一个排列和最后一个排列也要满足某条件。最后一个排列再移位或交换一次后每个元素 \(+1\) 要得到第一个排列。

\(W\) 为奇数很简单。先考虑 \(W\) 为奇数怎么做。因为每行的每个元素操作都一样嘛,要么右移要么左移。考虑一轮一轮来,每轮经过 \(H\) 次操作会平移 \(g\) 个单位,只需要满足 \(\gcd(g,W)=1\) 即可。这样可以在 \(W\) 轮后覆盖所有位置。怎么计数呢,设每轮左移 \(k\) 次,那么右移就是 \(H-k\) 次。\(g=H-2k\)。枚举 \(k\),算 \(g\) 是否满足条件,对应的方案数是 \(C_{H}^k\)。

\(W\) 为偶数的话有四种操作,左移右移两种,邻项交换也有两种。然后这里可以分奇偶列讨论。其实每个操作可以写成 \((\pm 1,\pm 1)\) 中的一个,代表奇数位(左移/右移),偶数位(左移/右移)。奇偶位置是独立的非常重要。因为 \(H\) 为奇数所以每过一轮之后位置的奇偶性会改变。

于是我们一次看两轮操作。两轮操作,每个元素都经历的奇数位操作与偶数位操作数相同,一共经历了 \(2H\) 次操作。设平移了 \(2g\) 个单位,只需要满足 \(\gcd(2g,W)=2\) 即可。枚举 \(g\),设每两轮左移 \(k\) 次,那么右移 \(2H-k\) 次,\(2g=2H-2k\),对应的方案数是 \(C_{2H}^k=C_{2H}^{H+g}\)。

AT_arc202_c [ARC202C] Repunits

牛逼。好题。学到了。

首先打表发现 \(\gcd(R_i,R_j)=R_{\gcd(i,j)}\)。那么求 \(lcm\) 的话就理所应当使用 min-max 容斥的 gcd-lcm 形式。设第 \(k\) 个答案为 \(L_k\),那么有 \(L_k=\prod_{T\subseteq R_{1\sim k}} (\gcd_{x\in T}R_x)\times(-1)^{|T|+1}\)。

常见套路枚举 \(\gcd\),\(L_k=\prod_g R_g^{e_k(g)}\)。其中 $e_k(g)=\sum_{\gcd(R_T)=g} (-1)^{|T|+1} $。

钦定 \(\gcd\) 等于 \(g\) 不好计数,但钦定 \(g\) 为公因子便很好计数(\(\gcd\) 为 \(g\) 的倍数)。设 \(F_k(g)=\sum_{g|\gcd(R_T)}(-1)^{|T|+1}\)。

令 \(S\) 表示 \(R_{1\sim T}\) 中整除 \(g\) 的集合。那么 \(F_{k}(g)=\sum _{T\subseteq S} (-1)^{|T|+1}\)。

只有两种取值。若 \(|S|\ge 1\),\(F_k(g)=1\)。若 \(|S|=0\),\(F_{k}(g)=0\)。

求出 \(F\) 后莫比乌斯反演回去,也可以理解为容斥。\(F_k(g)=\sum_{g|m} e_k(m)\),那么 \(e_k(g)=\sum_{g|m} F_k(m)\mu(\frac{m}{g})\)。

带回 \(L_k\),\(L_k=\prod_g R_g^{\sum_{g|m} F_k(m)\mu(\frac{m}{g})}\)。

交换求积顺序,枚举 \(m\)。\(L_k=\prod_m(\prod_{g|m}R_g^{\mu(\frac{m}{g})})^{F_k(m)}\)。

令 \(W(m)=\prod_{g|m}R_g^{\mu(\frac{m}{g})})\),这个可以简单求出。于是 \(L_k=\sum_m W(m)^{F_k(m)}\)。

又 \(F_k(m)\) 表示 \(1\sim k\) 中是否存在有 \(m\) 的倍数。所以 \(F_k(m)\) 随时间变化是 000...01...111 这样的。那么求出从 \(0\) 变到 \(1\) 的时间即可。

AT_arc203_c [ARC203C] Destruction of Walls

我卡在最后一步,非常难受啊。

只考虑 \(K=H+W\) 的情况。发现有两种方案,一种是一条长 \(H+W-2\) 的路径再随便砸两堵墙,另一种是长 \(H+W\) 的路径。

第一种非常好计数,只需要考虑有算重的情况,也就是存在“口”字形的路径。考虑构造映射。我们直接把这个口删了,然后把左上右下拼起来,映射一条新的路径。每条映射的路径有 \(H+W-3\) 个点,把每个点变成一个“口”就是一条原有的路径,所以算重复的方案数是 \(C_{H+W-4}^{H-2}\times (H+W-3)\)。

第二种怎么计数?和上面找“口”一样,考虑找代表这种路径的特征。我们发现这种路径的特征是存在下左下或者右上右。猜想直接把这个特征删掉,然后把剩余的拼起来映射出新的路径。但是每条映射的路径对应原有的路径条数不相同,无法用一个乘法搞定,只能再推式子。不如考虑换一下映射。

我们考虑把“下左下”删掉的同时加一个“右”进去,这样每条映射的路径映射回来的时候可以以“右”为锚点。每条映射的路径向右走有 \(H+1\) 个,首尾不能映射回去,总共有 \(C_{H+W-2}^{H+1}\) 个映射后的路径,方案数是 \(C_{H+W-2}^{H+1}\times (H-1)\)。

AT_arc204_a [ARC204A] Use Udon Coupon

感觉这个题也是挺牛逼。把 C 表示出来,那么就做完了。设路径集合为 \(T\),有 \(C=\max_{(i,j)\in T}sumB_{j+1\sim n}-sumA_{i+1\sim n}\)。

把所求差分,即求 \(C\le R\) 的减去 \(C\le L-1\) 的答案。分别跑一遍 dp 就行。

C 的那个式子称为 C 的闭式,因为这个式子不依靠原始的递推求出 C 的值。本质原因是映射 \(x\to \max(x+p,q)\) 在复合下封闭,背后是 max-plus 线性代数。但是我还没怎么学。

从方法论视角来看,我们分析这个题的时候可以用到折线图分析。我们不妨先将所有 -A_i +B_i 画成一条折线图,先不考虑与 \(0\) 取 \(\max\)。最后我们可以发现,\(C\) 就是谷底到末端的距离。所以我们把 \(C\) 写成 \(\max\) 每个点到末端的距离。也是很牛逼了。这个 \(\max\)。

posted @ 2026-10-08 19:48  s1monG  阅读(4)  评论(0)    收藏  举报