Exemplary Examples VIII

\[\Huge\mathrm{Exemplary\ Examples\ VIII} \]

导语见 Exemplary Examples I。

T-189 QOJ970 26-4-15 B+

二分答案 \(m\),转换为在线判定性问题,容易发现尽量让环长更长是不劣的,转换为在线求区间内相邻和小于等于 \(m\) 的子序列环最长长度。三个轴,值域轴 \(a_i,m\),答案值域轴 \(k\) 和位置轴 \(i\)。在 T-179 中我们介绍过类似问题,但 \(m\) 动态改变,又怎么处理呢?事实上 \(a+b\le m\) 的问题还有另一个套路,就是将所有元素分为 \(\le \frac{m}{2}\)\(>\frac{m}{2}\) 两个组别。本例中,第一组的数字可以任意选取,而第二组的数字不能连续选取,因此只能插在两个一组数中间,如果两个一组数的最大值,加上两数之间的最小二组数,仍小于等于 \(m\) 就会产生贡献。

在线问题,也可以先离线做然后用主席树伪装在线。离线的话,就是扫描值域轴,每次根据 set 中的前驱后继信息,得到形如“若扫描到 \(r\),且 \(x,y\) 仍然是相邻的一组数,则在 \(t\) 位置贡献加减一”的指令,直接 pushback 到第 \(r\) 个 vector 处。对于 vector,只需验证 \(x,y\) 的相邻性,然后给一个位置轴线段树上对 \(t\) 处做修改。询问就在线段树上区间查询是容易的。于是做到 \(O(n\log^2 n)\)

所以说,答案值域轴做最外层是常见的,往往二分/扫描线;在线问题也千万不要武断地放弃扫描其它的轴做外层,因为有主席树兜底。

T-190 一些小构造 26-4-16

广义上的构造是可以输出操作序列/元素方案的一切“存在性”问题。一般有对结构大小 \(x\)/结构某方面性质的要求。常见办法有:已知变现——已经能够解决的情况被从待考虑情况序列中剔除,就只剩下具备一定性质的问题。归纳构造——删叶子(或广义的广义串并联图方法),删极值,按照某个轴在原有解基础上依次添点。dp 构造。二级结构。数量关系。分组构造(被“对结构大小 \(x\) 的要求是某个变量乘以分数”所暗示)——将所有元素分为 \(k\) 组,保证至少有一组元素全选/成功(全部贡献给结构大小),如 T-135;或者将所有元素分成 \(k\) 组,每组至少让结构大小增加一,如 T-125-2(这种常常和归纳构造结合)。能操作就操作。先满足一个限制,再调整使之满足另一个限制。还有一点,以前没有介绍过:构造的第一步是判断无解性。这可视为一种变现手段。无解性一般和某个数量有关,一般是“某个数量的奇偶性合适”或者“某个数量处于一个上下界范围内”则问题有解,注意所述的条件可能并非必要(例如:若 \(n>5\) 则问题有解,但不代表 \(n\le 5\) 问题一定无解,可以小数据暴搜一下;\(s\) 是偶数一定有解,不代表 \(s\) 是奇数一定无解,有可能 \(s\) 模四余三反而有解。关键的是:通过数量关系确定出的那些包无解/有解的状态,从待考虑集合中删除,后续不用再考虑它们)。另外,如 T-170 所述:先把跟构造方案/决策方式有关的隐性限制去掉,只关心“构造方案/决策方式超级优秀”的前提下仍出现的一切限制。

T-190-1 C

给定长度为 \(n\le 2.5\times 10^5\) 的 01? 串。把 ? 换成 \(a\) 个 0 与 \(b\) 个 1 使得最长相等子串长度最小。

先二分答案,由最优化变成存在性/构造题目。对此做一个暴力 dp 然后答案与状态互换即可。该题目被选进 T-190 的核心在于:这个构造题的有解性,是根据 \(a\) 的上下界卡出来的(使问题有解的 \(a\) 必是一段区间)。

T-190-2 B

对于一个随机变量 \(x\le 10^9\)\(n\le 5\times 10^5\) 个人提出对 \(x\) 的预测:\(x\in [l_i,r_i]\)。给每个人评判对错使得无论 \(x\) 选取,总有至少 \(\lfloor\frac{n − 1}{2}\rfloor\) 个人被你评判正确。

关注一个 \(x\) 带来的单点限制,不包含它且被你判断为“错误”的区间,加上,包含它且被判断为“正确”的区间之和必须大于等于 \(\lfloor\frac{n − 1}{2}\rfloor\)。注意到结构大小限制是个分数,选用归纳构造,也就是第二种分组构造“两个区间为一组同时分配对错,\(n\) 减小二的同时也令限制均减小一”(可以做一个类似 T-185 的转化,也可以不做:将判断为“正确”的区间内部计数器都加上一,“错误”的区间外部计数器增加一,如果每个计数器都超过结构大小阈值 \(\lfloor\frac{n − 1}{2}\rfloor\) 那么构造正确)。讨论你所选择的两个区间的关系,如果相离,那么都判断为“错误”;如果包含,那么里面那个“错误”外面那个“正确”。于是区间只剩下相交关系了,手玩一下,也很容易。

本题所介绍的“归纳-第二种分组构造”和 T-143“不做白不做”构成了一定的对话关系。

T-190-3 QOJ14506 B+

法一,根据集训队论文(在 T-187 中提到),树上连通块点集的交,还是另一个树上连通块的点集。通过不断求交,把这些点集拆分成尽量多的“单位点集”(这些点集两两无交,求出方法下述),而且也能得到“单位点集”之间的相邻关系,而“单位点集”内部的关系则不重要。具体办法:归纳构造,每次在维护好的“单位点集”作为虚点的森林(边维护虚点的相邻关系)上,添加一个新点集 \(s\),考察 \(s\) 和一切已知的单位点集(例如 \(u\))的交,把这些交集分裂出来建立新点 \(p\),令 \(u=u-p,s=s-p\),并将 \((p,s)(p,u)\) 添加虚点之间的连边。复杂度 \(O(n^2)\)

关键在于什么,关键在于此处定义的“树上连通块”交和并是一个格(见 T-142)。我说过 gcd,lcm 也是格,所以有一个著名的 trick“伪质因数分解”:如果给定一组值域极大的数字(无法接受质因数分解),可以通过多次求 gcd 的方式(跟上面一样)求出“单位 gcd”作为“伪质因子”。

法二,因为是树上构造,每次删叶子来归纳,如 T-134,T-175 一样,问题在于三部分:第一,快速找出一个叶子。第二,找出这个叶子的父亲(或者说,对于这个叶子,我们好奇的信息)。第三,删除一个叶子后,出现新的“叶子”,加入待考虑栈中。这个过程也适用于一切广义的广义串并联图方法。(*) 一个点 \(x\) 被认为叶子,如果存在另一个点 \(y\) 满足每次 \(x\) 出现 \(y\) 都出现。故把 \(x\) 合并到 \(y\) 里边去就行了。

T-190-4 P13356 A

法一,因为结构大小限制是一个分数。看上去需要 \(n-1\) 条边分一组,对结构大小(路径条数)贡献一。联系图论中生成树的重要地位,不妨不断建立生成森林,然后将该生成森林删去,显然能够满足构造的要求。问题在于如何模拟上述过程,求出这些森林:如果扫描“森林编号”轴,一个一个求是不可行的。不妨改为扫描“点/边编号”轴,每次添加一条边到某个森林中去,添加到哪一个都是可行的。故不妨添加到编号最小且边两端点尚不处于一个连通块的那个森林中,每轮添加需要二分出这个编号,做到 \(O(m\log n\alpha(n))\)

法二,每次删点归纳。(*) 感性理解,删的点应该是不重要的一个,例如(数量关系来刻画)度数最小的。删完之后,要把它的贡献给到 \(n-1\) 个点的图中。不妨 \(m=k(n−1)\)。总存在度数不超过 \(2k\) 的点。取出这个点 \(u\),我们希望能把一些 \(u\) 的边 \((u,x)(u,y)\) 合成边 \((x,y)\)。同时新图的边数超过 \(k(n−2)\)。感性理解,如果 \(u\) 到某个 \(v\) 边数不少于 \(k\) 条就做完了。否则损失的边不会超过 \(k\) 条(经典结论:如果一个序列中的元素有颜色,不同颜色的元素组成配对,问能否配满。只要没有绝对众数就可以,构造方案考虑类 Hakimi 算法,每次匹配元素最多的两个颜色)。

T-190-5 A

给定一个图,每个点有黑白两种颜色。把一些点变成红色,使得:没有相邻的点有相同的颜色,除了一个红色的团。

颜色数目很少,而且“团”的限制令人想到“最小团问题”从而想到集合划分模型(但不能直接应用),与之类似的还有 2-sat,二分图/并查集模拟双向边 2-sat。显然本题可以是个 3-sat 问题:每个点有三种状态:红色孤立点、红色团、不变。

(*) 怎么干掉一个状态?枚举一个点,钦定它属于红色团,那么它领域中的点不能成为红色孤立点,非它领域中的点不能成为红色团。变成 2-sat 了。

T-190-6 QOJ5090 弱化版 B

弱化:type=0。

法一,显然两两分组归纳构造。既然分组,那么做出的决策只跟组内伙伴的帽子颜色有关,只有两种方式:和他颜色相同;和他颜色不同。钦定编号为 \(2i-1,2i\) 两个人分一组,然后奇数人输出伙伴的帽子颜色,偶数人输出伙伴的帽子颜色的反色,则每组对结构大小贡献了一。

法二,采用第一种分组构造。分两个一样大为 \(\frac{n}{2}\) 的集合,使得至少有一个集合全部猜中。考虑数量:全局帽子的异或值,如果知道这个值,每个人就能直接输出答案。这个值无外乎两种可能,所以令集合 \(A\)(例如奇数人)按照“已知全局异或为一”输出自己的答案;集合 \(B\)(例如偶数人)按照“已知全局异或为零”输出自己的答案。必有一个集合里面的老哥全部猜对。

至于原题,请阅读 QOJ 上的题解。

T-190-7 QOJ5504 A

零一变量故建立图论模型,也无非就是 T-190-5 所述几种之一。但看起来不太可能,因为不存在形如“若 A 被赋值为一则 B 必被赋值为一”或者“A,B 的零一性必须不同”之类的限制。然而做限制的对称(有半年没提过这个词了,回顾:限制的取反,容斥,换轴描述),限制取反做全局-存在对称,翻译成“若 \([a_i,b_i]\) 中有一则 \([c_i,d_i]\) 都是一”,就可建立 2-sat 图(不是双向边所以无法二分图/并查集)。容易看出 0,1 两层图之间没有连边。但是如何处理“\(2n\) 个点”的限制呢?

思考如何判定解是否合法,当且仅当染色为一的点在 2-sat 缩点 dag 上为一个闭合子图。第二是限制了这个闭合子图的大小范围。类比 T-168,(*) 若想要选取一些元素使其权值和落入 \([a,b]\) 这个范围内,则如果所有单个元素的权值小于等于 \(b-a\),按照任意顺序访问元素,并给计数器增加相应权值,就必定能得到解。本题中在 dag 上拓扑排序,不断给计数器增加当前点的权值(如果该权值小于 \(n/3\))。如果某一瞬间计数器合法就结束;如果一个权值大于 \(2n/3\) 的节点应当出队,则禁止它的出队,继续拓扑排序;如果遇到权值属于 \([n/3,2n/3]\) 的元素 \(x\),不妨将它特殊处理:单独考察 \(x\) 和 dag 上其所有后继作为闭合子图,权值和是否合法,如果不能那 \(x\) 不能被任何合法解选取。

T-190-9 QOJ7535 A

我们先随机模拟几回 Bobo 的行为,看看最终的排列可能长什么样。没看出什么也不要紧。结构大小(操作步数)限制是个分数,那么能否归纳-分组构造呢。关注边界元素,发现全局最大值只能在序列末尾的三个元素之一,可以通过两次比较找出最大值的位置,然后把它和末尾元素互换,就递归成了 \(n-1\) 的排列。这个的操作是 \(2n\) 步的。

那么改用五次操作处理三个元素,仿照上面的办法,尝试处理最大的三个元素,注意到这三个元素都不会超出序列末尾五个的范围。那如何从五排列中,找出最大的三个元素分别是谁?

介绍一个办法,在某年清华营工程题和某年 WC 应用过:构建决策树。换句话说将所有可能的状态拿出来,则最终的合法状态就在这个集合中。树上的每个节点都是找出“最优的询问”,进行该询问后能够根据其回答。将待定集合划分成若干大小尽量相等的小集合,向一个小集合买进。构建这颗决策树的过程就是,对于每个节点暴力考虑其所有可能的询问,找出最均衡的一个。

(*) 事实上用六步可以唯一确定一个五排列。那么由于每次的五排列中有两个元素是上一轮剩下的,这两个元素间的顺序已经知道,所以也就省下了一次询问,能够通过本题。

T-190-10 QOJ9607 A+

好,终于有一道“没有给出结构大小限制”的题目。我说过什么来着?构造题目先判断有解性,考虑上下界和/或奇偶性。显然,颜色数作为唯一变量,只需考虑其下界,我们先估计一个“必要”的下界,再证明/验证其充分性。改换主体对于每个点,它被覆盖的路径条数显然是低于颜色种数的。每个点被覆盖的次数最大值实际上就是能够取到的 \(k\) 下界。

现在你就拥有了一个“结构大小限制”,不妨归纳。也就是说,通过消耗一种颜色,把全局覆盖次数最多的那些点的覆盖次数减小一。换句话说,把这些被覆盖最多的点当作“关键点”,则需要选择若干不相交路径把关键点都覆盖即可。

这个问题看上去容易 dp/贪心解决,然而合并子树或者剥叶子是不太对的。(*) 树轴上还有一种从上向下的构造方式,我们是每次找出“没有父亲是关键点”的关键点并解决它的问题(考虑:剥叶子相当于找出“没有儿子是关键点”的关键点并解决)。题解说随便找出一条以它为 lca 的路径就做完了。

树上从上向下的构造不太多见。这是一种,还有一种是按照深度轴从浅至深。至于树上路径作为主体时要挂到 lca 上也是提过多次的技巧。

T-193 DDCC2019finalE 26-4-20 A+

兄弟,我不懂啊。

首先试图 BSGS(超级超级经典的分组方法。例如:有一个未知圆排列,未知环长。每次可以要求当前指针往后走 \(x\) 然后交互库告诉你当地的排列号 \(p_i\),问环长),有一个 \(2\sqrt n+2=92\) 的做法,那就是源点向一排点分别连 \(1,2,3,...\sqrt n\),另一排点向汇点分别连 \(0,\sqrt n,2\sqrt n,...\)。中间的完全二分图,它要什么你就连什么。

这是个 dag,如果是那种缠在一起的,显然很难掌控其“路径长度集合”;即使是分层的,层数一多你也不好掌控。

然而有一个非要缠在一起的乱搞做法:我们按编号逐步添点,钦定边从小点到大点连(扫描拓扑序轴),每次确定当前点的所有入度。那么有一个必要条件就是,如果给每个点维护一个“从源点(钦定为编号为一的点)到它的路径长度集合”的 bitset,那么无论对哪个点,这玩意都必须是被输入的“最终集合” bitset 的某个子串的移位结果。好像你满足一下这个必要条件就可以做到 180 个点的优秀成绩。考虑到,几个编号很小的点如果集合太怪异,那么后面很容易完蛋,所以要求前多少个点的集合大小小于等于二,接下来多少个小于等于四,八,... 就可以做到 60 多个点,得到高分。

然后呢然后呢,(*) 作为一个零一串,四毛子算法比较有名嘛,介绍一下:把零一串按照每长度 \(B\) 分组,然后你需要 \(2^B\) 预处理个什么东西,大概就表示“对于每一组,若它的零一形态如此,则...”。本题中,你先考虑 92 个点的做法,本质上就是 45*45=2025>2000 个边而已,跟我们 BSGS 完全没关系(对不起!换句话说我们令源点,汇点和二分图点的连边边权都为零,然后令二分图的中间有边权即可)。现在既然你分组了,那么同组元素一起做,例如某一组在原串上的位置为 \([l,l+B-1]\) 那么组内为一的元素的共性就是,其要求的路径长度都大于等于 \(l\),因此给它们新开一层,由这一层向二分图左部点层连边,处理掉组内元素的差异,然后由目标左部点向右部点连长度为 \(l\) 的边。具体来说,如果某组 \([l,l+4-1]=0101\) 那么建立:\(t_1\to t_2\to t_3\to t_4\) 边权均为一;本组涉及到的预处理部分是 \(t_2\to p_{0101},t_4\to p_{0101}\) 边权为零。本组令 \(p_{0101}\to l_x\) 边权零然后 \(l_x\to r_y\) 边权 \(l\)。这样的话,超源超汇合计两个,\(t\)\(B\) 个,\(p\)\(2^B\) 个,左部点有 \(\sqrt \frac{n}{B}\) 个,右部点也是那么多上取整个。合计 \(2+B+2^B+2\sqrt\frac{n}{B}\) 好像在 \(B=3\) 取到六十几来着。

然后聪慧地发现 (*) 可以钦定每组的第一个元素为一(删除所有 \(p_{0:::}\) 因为无用),要不然就把组直接往后移,也就是把极长的零段空过去。而且注意到 \(p_{1000}\) 不需要虚点(用 \(t_1\) 代替)。做到 \(2+B+(2^{B-1}-1)+2\sqrt\frac{n}{B}\)\(B=4\) 取到 58。可以把源点放到 \(t_1\) 然后汇点放到最后一个右部点(右部点之间搞一条链之类)做到 56。再删除三个显然是删掉 \(t\) 里边的了,尝试把 \(t_2,t_3,t_4\) 搞掉,那就是源点 \(t_1\) 直接向那几个 \(p\) 连边,还可在 \(p\) 之间互相递推,胡乱搞一下即可。

t_1 ==0==> (1100) ==0==> (1010),(1110),(1001),(1101),(1011),(1111)
t_1 ==1==> (1110) ==0==> (1101),(1111),?1100?
t_1 ==2==> (1010) ==0==> (1110),(1011),(1111)
t_1 ==3==> (1001) ==0==> (1101),(1011),(1111)

显然这个是不对的,它需要额外一个点处理掉 (1100),(1110) 之间的重边。要把这个搞掉的话,就不妨做个小调整,删除 (1100) 向 (1110),(1010),(1001) 的连边,让这四个超级点互相连成个链/环,把零边处理掉。

t_1 ==0==> (1100) ==0==> (1101),(1011),(1111)
t_1 ==1==> (1110) ==0==> (1100),(1101),(1111)
t_1 ==2==> (1010) ==0==> (1110),(1011),(1111)
t_1 ==3==> (1001) ==0==> (1101),(1011),(1111)
(1100) ==0==> (1010) ==0==> (1001) ==0==> (1110)

T-198 QOJ14808 26-4-20 A

内外层关系不大,所以改换一下描述顺序和主体,目的是让二者拆开。那么描述第一个子串的结尾位置 \(l\) 以及最后一个子串的开头 \(r\),求出 \(f_{l,r}\) 表示满足上述条件的一对第一、四个子串;求出 \(g_{l,r}\) 表示满足“第二个子串的开头大于等于 \(l\) 且第三个子串的结尾小于等于 \(r\)”的一对第二、三个子串。

为了求 \(g_{l,r}\),我们尝试递推,相邻二者做差之后,转化为求 \(g'_{l,r}\) 表示“第二个子串的开头大于等于 \(l\) 且第三个子串的结尾恰好等于 \(r\)”的对数,然后你发现 \(g'_{l,r}\) 亦可递推,故最终只需求 \(p_{l,r}\) 表示“第二个子串的开头等于 \(l\) 且第三个子串的结尾等于 \(r\)”的方案数。实质上就是对 \(g\) 做了个二维差分的对称。

先处理 \(p\),似乎要用 kmp 类似物处理第二个子串的严格后缀,称为“后缀”。也可以递推求:对于 \(p_{l,r},p_{l-1,r}\),后者就是前者加上:“后缀”从 \(l-1,l,l+1,...,r\) 开始,而第三个子串以 \(r\) 结尾的方案数。把这个的答案称为 \(p'_{l-1,r}\)\(p'\) 亦可递推,故只需求 \(h_{l,r}\) 表示“选择一个以 \(l\) 开头的子串,和另一个以 \(r\) 结尾的子串,使之完全相同,而且不准重叠,方案数是多少”。换句话说,问一个子区间短于一半的 border 个数。这是好求的,因为有经典结论:对一个字符串,长度大于一半的 border 形成一个等差数列。只需枚举 \(l\) 然后扫一遍 \(r\) 进行 kmp。

再处理 \(f\),这玩意和 \(h\) 完全一样吧。构造序列 \(s_l,s_{l-1},...,s_1,!,?,s_n,s_{n-1},...,s_{l+1}\)。在这上面跑出的 \(h\) 不就是 \(f\) 吗。事实上能看出来因为 \(f\) 所查询的那些子串都包含 \(!,?\) 所以这些子串都不存在长度大于一半的 border,比 \(h\) 还要好求一点。

T-199 QOJ5069 26-4-21 B

根据 NOIP2025 T4(也不知道谁根据谁),按定长 \(c\) 分块然后一个合法区间必然不会跨过三个块。

如果合法区间在某个块内(整块对自身)。那么对每个块建立一个普通线段树,做最大子段和的合并。然后我们再以块编号为轴建立一个抽象的线段树,每次查整块对自身,就在上面查。这个抽象线段树只会被单点改而已。
如果合法区间在某两个相邻块间(整块对相邻整块)。显然也需要个抽象线段树。问题转化为 \(O(\log n)\) 及以下的复杂度,完成“单点改,并查询被改的所在整块处,跨过两个相邻整块的合法区间最大值”。T-118-2 谈到过单答案问题,我们在此处也用个线段树做合并,输出根就可以了。具体来说,先转前缀/后缀和(前一个块后缀和 \(p_i\),后一个块前缀和 \(q_i\))。问题翻译成选择 \(x\ge y\) 最大化 \(p_y+q_x\)。联合建立线段树合并信息是能够通过的。
散块内部、散块对整块。也可以用上述线段树处理。

T-200 QOJ6304 26-4-21 A

两种情况:三条竖线;一横两竖。

对于第一种情况,我们用“逐步”描述法,先枚举一条线。例如枚举中间的线 \(y=i\)(这是试出来的),则问题变成:剩余线段(分为左右两部分)分别的交集大小。这仍不好求,然而该子问题只关于 \(i\) 故可以尝试递推:当 \(i\) 增加一时,左部集合、右部集合中的线段个数可能会减少/增加。动态维护集合的最大值/最小值是非常容易的。

对于第二种情况,先枚举横线,用递推的办法(扫描横线的位置),问题变成:有一些线段,多次删除/增加一个线段,求选择两个点使得每个线段至少覆盖一个点的方案数。枚举其中一个点(比如左边点)的位置,另一个点如果合法,则处于一个区间内。换句话说任意时刻(横线的位置称为“时刻”),若第一个点位于 \(l\) 则第二个点必须处于 \([f_l,g_l]\) 内。用线段树在内层(相对于“横线的位置”作为外层)动态维护 \(f,g\),若加入一条线段则某段前缀/后缀的 \(f,g\) 要和某数取最大值/最小值,但这不可撤销,无法删除线段。不喜欢删除操作,可以思考:线段树分治不可行,因为甚至无法撤销上一步。时间轴分块怎样呢,似乎也不太行。那这个题没法做呀。

(*) 我们还有两个东西没用:势能线段树;单边递归线段树。前者不太有用,因为没有所谓“特殊类型的修改”。后者的话,你把修改“让 \(i<x\)\(f_i\) 都与 \(t\) 取最大值”当成是把修改挂在 \(x\) 单点处,然后 \(f\) 的定义就变成该序列的后缀最大值了。

所以说我们要勤于定义函数,例如本题中的 \(f_l,g_l\) 还有 T-198 中的。好像就是你一旦把函数(带有某种参数的子问题)定义出来,就会自然而然地想到那几个处理“本质相同问题”的常见做法。

T-201 CF1458D 26-4-22 B+

首先对于 01 串有一个经典处理方式:把 0 视作 -1 然后 1 视作 +1,关注前缀和 \(s\),转化为折线图,就像我们对括号序列常做的那样。顺带一提,对于折线图我们常常关注其最值点的高度。那么本题中的一次操作,就相当于选择折线图中两个高度相同的点,并把他俩中间的一段进行左右对称。

然后又一个套路 (*) 就是对于这种折线图,考虑值域上建点,然后若 \(s_i+1=s_{i+1}\) 就给 \(i\to i+1\) 连接一条有向边。一个折线恰好对应一个这种图,这种图具备欧拉路径(如果不是起点或终点,你上去必然还要下来,所以度数均为偶数;起点和终点度数是奇数),注意这种图可能对应多个折线,但是“这种图-这种图上的一种欧拉路径”与“一个折线”一一对应。01 串转化为折线,然后转化为这种图。把操作也翻译过来,相当于任取图中一个欧拉回路,然后把其上的边方向反转。如果建立无向边,那么原图不会被改变;能感受到(无向边)原图的任意一条欧拉路径代表的字符串,都可以由原字符串进行一系列操作得到。

那么建立无向图,然后贪心地模拟,能填 0 就填(只要走过去还能回来即可,也就是 \(x,x-1\) 之间的边数大于等于二)。

T-202 CF1672G 26-4-22 A+

观察到答案总是 2 的次幂。取一点势能量,例如每行每列异或和。

如果 \(n,m\) 均为偶数,那么答案是 \(2^k\) 其中 \(k\) 表示灰点个数。证明的话,可以通过二级结构的形式构造出来。
如果有一个是奇数,例如 \(n\) 是奇数,那么每次操作会给每一列的异或和都异或上一,也就是最终状态下所有列的异或和都相同。对于行则看不出来什么。这玩意就是充要条件,可以二级结构构造。求答案的话,枚举最终每列的异或和是 0 还是 1,非常容易。
如果都是奇数。那么最终状态下所有行的异或和都相同;所有列的异或和都相同。枚举它们分别等于什么之后,如何求方案数呢?一个灰格子 \((i,j)\) 的颜色会影响到其所在行列的奇偶性,故套路化地建边 \(l_i\to r_j\)。这是一个二分图。问题转化为:给定若干要求,形如 \(x\) 的度数必须是奇数/偶数,请你删去一些边满足上述条件,问方案数。

(*) 回忆 T-159 欧拉子图计数的办法,欧拉子图计数的限制不就是“删去一些边,使得剩下每个点的度数都是偶数”吗?本题中完全一样,方案数就是二的非树边条数次方。

T-203 CF1519F 26-4-22 B+

首先若已知 Alice 的决策,如何求 Bob 的最优选择?第一种,网络流最大闭合子图;第二种,枚举 Bob 选择要打开的箱子集合 \(S\)

Alice 的任务是让 Bob 无法获得正价值。

法一,用第一种的语言来翻译,就是最小割割掉了源点和所有箱子之间的边,换到最大流上说源点和箱子之间的边全部满流。问题变成选择一些边添加在中间,求达成全部满流的最小代价。注意数据范围很小,所以状压 dp 一下。
法二,用第二种的语言来翻译,就类似于 \(S-N(S)<0\)。这完全就是霍尔定理的形式,准确点翻译:左部点为 \(a_i\)\(i\),右部点为 \(b_i\)\(i\),问题转化为让该二分图左部点存在完美匹配(每个左部点都有其匹配上的右部点)。状压 dp 一下。

类似于 T-194,极小范围类二分图问题的解决策略就是,状压/枚举左部点涉及的全部信息,然后扫描右部点做 dp。

顺带学习一下模拟最大流/模拟最小割。回顾:最小割就是割掉边权最少的边使得 \(s,t\) 不连通。常见模拟方法:描述与 \(s,t\) 分别连通的集合,这两个集合不能有交。最大流直接转成最小割即可。当然,如果某一层的边数非常少,常常枚举一下这一层的边究竟割不割,再以此为基础考虑剩下的图。

T-204 CF1893E 26-4-22 A+

打表感受了一下,每条边的边权只能从其两个端点的点权中选取,且这两个点权必不相同。作为一个无向图,通过给边定向的方式描述信息是常用手法 (*),所以我们钦定边的方向指向“边权来源”。

对于新转化出的图,第一要务是把问题翻译过来,也就是把对点权的限制翻译过来。因为限制是对图上点的,关注每个点的度数(我们介绍过,用每个点度数来描述一个图的性质)。一个点合法的充要条件是出度为奇数。

那么问题是“给赋点权使得相邻点权不同-给边定向使得每个点出度为奇数”联合方案数,前后两部分没有关系,只需乘起来。后一部分比较容易,T-202 才介绍过(注意总度数的奇偶性必须为 \(m\),也应与 \(n\) 同奇偶,由此判断答案是否为零。如果不为零,那么就是二的非树边条数次方了)。

前一部分咋办呢。因为是个仙人掌,先考虑环怎么做,再考虑链怎么做,两部分拼起来即可(因为环部分和链部分,基本上也没啥关系,大致是乘起来就可以了。直观一点说就是把图上的所有环分裂出来,所有链分裂出来,把每个连通块的答案算出来再乘一起,然后稍微处理一点点边界情况)。链的话显然是 \(3\times 2^{x-1}\)。环的话,随便 dp 一下外加矩阵快速幂,例如定义 \(f_{i,j,k}\) 表示 dp 到长度为 \(i\) 的环,起点颜色为 \(j\),当前点颜色为 \(k\) 的方案数(因为本题中点有标号,所以可以钦定环上编号最小的点为起点,不会存在算重的问题)。但是有一个更加巧妙的办法,在这类问题里边很通用的 (*)。就是用链的方案数减去链首尾颜色相同的方案数,而后者恰好是长度短一的环的方案数(考虑把链的首尾缩合成一个点)。

T-205 CF2003F 26-4-23 B

有类似的题在某场模拟赛出过,有位老哥秒过,我大为震惊。

状压,用 \(f_{i,s}\) 表示关注小于等于 \(i\) 的数的选取情况,选择了的数的状态为 \(s\),且要求 \(i\) 必须选,最大 \(c\) 和是多少。用树状数组优化,时间复杂度无法接受。

(*) 给每个 \(b\) 数组中的值,随机赋一个 \([1,m]\) 内的权值,增强限制为:选取元素的 \(b\) 对应随机权值形成一个排列。这样做只有可能漏解。对于“最优解”,它能够被“一组随机权值对应的 dp”纳入考虑(不漏掉)的概率应大于 \(\frac{m!}{m^m}\)。多随机几次,取各次 dp 值中的最大值即可。

T-206 CF1746F 26-4-23 B

是不是把 T-182 忘掉了。

过分复杂的数据结构题,尤其是带有“判定”色彩的题目,尝试用某种区间和/哈希值来替代区间信息,转化为对该区间的这个值的判定。本题取 \(\sum w_{a_i}\),其中 \(w\) 应为随机权值。判断这个“区间和/哈希值”是否被 \(k\) 整除,就可以了。

T-207 CF1349E 26-5-9 A+

像这种分多轮猜自己帽子颜色的题目,只需把握“全局广播”“变现”的两个概念即可。

每当一轮结束,全局广播的信息就是“位置集合为 \(S\) 的人没能猜到自己帽子的颜色;位置集合为 \(U-S\) 的人猜到了”。由于每个人足够聪明,所以任一人都了解“位置为 \(i\) 的人,在何种条件下,才能猜到自己帽子的颜色”。据此,所有人就通过全局广播知道,一部分条件被满足,而另一部分条件没有满足。

关注边界情况,也即关注第一轮。在何种情况下,第一轮会有人猜中?第一种,裁判公布没有黑帽子,那么所有人都猜中,这一种没有什么用;第二种,裁判公布有黑帽子,且黑帽子恰好是最后一个人头上的,那么最后一个人,因为看到前面所有人都戴白帽,猜中自己是黑帽。变现排除掉这两种情况,进入第二轮。在第二轮开始时刻,有一全局广播:最后一个人的前面并非全白。此时此刻,第 \(i\) 个人可比照自己的视野,如果这个视野并非全白,那么全局广播暂时没有用处;反之他就知道在 \([i,n-1]\) 中有一顶黑帽子。据此再关注边界元素得到:第一次有人猜中的时刻处于第二轮,当且仅当第 \(n-1\) 个人视野全白(猜中的人就是他)。

规律已经十分明显,可归纳:第一次有人猜中的时刻是在第 \(x\) 轮的条件是,第 \(n-x+1\) 个人视野全白且 \([n-x+2,n]\) 的人视野并非全白。接下来在第 \(x+1\) 轮开始时刻,全局广播的累计信息就相当于上述条件,因此所有位于 \([1,n-x]\) 的人都了解自己的帽子是白色,从而猜中;全局广播对其它人暂时无用。当然:若裁判通告全白,则所有人猜中;反之对当前队列的末尾人来说,若视野全白,则他也必然猜中。

因此从第 \(x+1\) 轮开始又是新一轮循环。由此得到,对于已知 01 序列,倒序标号,第 \(i\) 个人的离开时刻是:若第 \(i\) 个人是黑帽子,则 \(t_i\) 是标号大于等于 \(i\) 的黑帽标号和;反之为上述标号和加上“小于 \(i\) 标号最大黑帽之标号”。

尝试构造,先处理已知信息对答案 01 序列的限制。对于相邻有值的 \(t_i,t_j(i<j)\),一是能够知道此二者是否处于一个零连续段(\(t_i=t_j\) 时),二是能知道此二者是否相当于一个零连续段内元素与一个零连续段的末尾(\(t_i=t_j+1\))。把这两种情况变现掉,缩合连续段,得到新序列使得相邻有值的 \(t_i,t_j\) 满足 \(t_j>t_i\)

关注边界元素,即关注标号最大元素(最左元素),其 \(t_i\) 由两部分组成(预告:后续选择从大到小扫描标号轴,处理限制并完成构造):标号大于它的黑帽子标号和;标号小于等于它最大黑帽子之标号 \(x_i\)。由于完全无需考虑标号大于它的帽子的黑白,第一部分能够取值的范围相当于 \([i+1,n],[2i+3,2n-1],[3i+6,3n-3]\) 等诸多区间的并集。由于选择从大到小扫描标号轴,并基本按扫描顺序确定帽子的黑白,关注到:对于任两相邻关键点 \(i<j\),为了达成 \(t_j\),只能将大于等于 \((n-x_i+1)+1\) 的部分帽子自由涂黑,因为无论 \([1,n-x_i+1]\) 帽子的黑白情况如何,它都已被用于满足 \(t_i\)(换言之,被前面的扫描过程确定过了),而不能擅自涂改。关注“满足 \(t_i\)”对“满足后续 \(t_j\)”的影响,只与 \(x_i\) 有关。\(x_i\) 尽量大,影响更小,更优。故逐次二分找出最大的 \(x_i\) 即可完成贪心。

但有一个小问题。令关键元素 \(i\) 为黑帽时,相当于要对 \(t_i\) 做一的微调。故改贪心为 dp,记录 \(f_{i,0/1}\) 表示考虑标号前 \(i\) 大的关键元素带来的限制,并据此填写了标号范围 \([x_i,n]\) 所有帽子的黑白,并且第 \(i\) 大元素是白/黑帽,则最大 \(x_i\) 是多少。

T-208 26-5-13 B+

\(n-1\) 个等重的标准球,还有一个神秘球。神秘球比标准球重一点,或者轻一点。共 \(n\) 个球随机编号。每次可选择两个大小相同的集合,并比较其重量之和的关系,请在小于等于 \(\log_3 2n\) 次询问内找出神秘球。

照旧从边界考虑,第一次询问,一定是找出编号前 \(2a\) 小的球,分成相等两集合 \(A,B\) 然后问,啥也不知道时,这样问不劣。假设结果是“相等”,则神秘球属于剩余 \(n-2a\) 个,反之神秘球属于前 \(2a\) 个,似乎能做到 \(\log_2 n\)。然而若神秘球属于前 \(2a\) 个,第一次询问还带来额外信息形如:若神秘球属于 \(A\) 则它是重的;反之它是轻的。

换句话说,若第一次询问结果为“相等”,则递归成 \(n-2a\) 的子问题 \(q(n-2a)\);反之递归成另一种问题 \(p(2a)\):已知神秘球在 \(2a\) 个球里边,如果神秘球编号小于等于 \(a\) 则它是重的,反之它是轻的。对于 \(p(2a)\),考察解决本问题的边界第一次询问 \((i+j,k+l)\),若结果为“相等”,则问题转化为:神秘球在 \(2a-(i+j)-(k+l)\) 个里面,如果编号小于等于 \(a-(i+k)\) 则它是重的。所以我们应该改成定义 \(p(a,b)\)

那么,若结果为相等,则 \(p(a,b)\) 递归到 \(p(a-i-k,b-j-l)\)。若结果为小于,则递归到 \(p(k,j)\)。若结果为大于,则递归到 \(p(i,l)\)

现计算最优 \(i,j,k,l\)。对于任意问题 \(q(x)\),感受一下,第一步取 \(a=\frac{x}{3}\) 最优。问题递归成 \(q(x/3),p(x/3,x/3)\),前者不用管,看后者。此时还剩 \(-1+\log_3 2x\) 步用于处理 \(p(x/3,x/3)\),注意到 \(\log_3(2x/3)\) 就是步数限制。主动加强性质,可以猜测:能够用 \(\log_3(a+b)\) 次问出 \(p(a,b)\)。如此一来,显然 \(i=k=\frac{a}{3},j=l=\frac{b}{3}\)。不过步数要严格小于等于限制,不能上取整。针对 \(a,b\) 模三的结果分九组,分讨一下。只需保证:在该组别下,策略 \((i,j,k,l)\) 可能递归到的三种 \(p(f,g)\),均满足 \(1+\log_3(f+g)=\log_3(a+b)\)。很显然 \(i,j,k,l\) 都会在 \(\frac{a}{3}\pm \epsilon\) 或者 \(\frac{b}{3}\pm \epsilon\) 浮动,手动枚一下吧。

所以感受:这种交互题目的 dp 状态是通过边界询问得到的信息,生成出来的。还有就是对于一个状态,如果已明确其步数限制,在递归向更小状态的同时,也可将步数限制递归下去。

T-209 P13535 26-5-15 B+

步数限制超过 \(\frac{n(n-1)}{2}\) 所以没有意义。从边界元素,全局第一次只能询问 \(P_0-1,...,P_0-n+1\) 中的某个数,否则有可能一个都买不到。不妨询问 \(P_0-1\)。此时必然买到第一个物品,如果只买到第一个,那么问题规模减少一;反之,假设买到了 \(a_1=1,a_2,a_3,...,a_k\) 这些物品,花了 \(t\) 的价钱。这种情况下,考虑全局第二次询问,其实只能询问小于等于 \(c=\lfloor\frac{t}{k}\rfloor\) 的值,否则可能再次买到 \(a_1\)。不妨询问 \(c\)。然后即可发现,对于任何一个询问,都可以衍生出另一个合法的询问,而且衍生询问买到的最小编号,比原询问买到的最小编号要大。换句话说,经过若干次递归,一定能够得到最后一个元素的值。

那么很自然地,把一次询问得到的回答看作一个方程,就可以用已知的“最后一个元素的值”代入回去,解出一些方程。按照编号轴倒序扫描,依次求出每个元素的 \(p\) 值。只需不断迭代“当前首元素最大”的方程,以至得到某个“首元素为 \(i\)”的方程,便解出值 \(p_i\)。代入更新已有的全部方程,归纳使问题规模减小一。这样做的话,每个元素作为首元素只会出现一次,恰好满足要求。

发现“可以迭代从而解出最后一个元素值”之后,最后一个元素就“没用了”,自然而然想到归纳、倒序扫描,即可解决本题。

T-210 P7864 26-5-18 B+

某类题目:两人轮流博弈。有个初始元素集合 \(S\),根据 \(S\) 计算出“可选集合” \(f(S)\),玩家每轮可选择 \(f(S)\) 中的一部分元素,删得状态 \(S'\),交还第二位玩家。不能操作者输,问谁必胜。

通用结论:对于初始元素集合为 \(S\) 的问题,给 \(S\) 添加一些元素(称这些元素构成集合 \(D\)),得到问题 \(T\)。若:第一,添加的元素均属于 \(f(T)\);第二,\(f(S)\subset f(T)\)。则无论问题 \(S\) 胜负情况如何,问题 \(T\) 先手必胜。原因:若问题 \(S\) 后手必胜,则问题 \(T\) 的先手 Alice 只需选集合 \(D\) 删去,交给 Bob 的局面是 \(S\),故问题 \(T\) 先手必胜;若问题 \(S\) 先手必胜,找出问题 \(S\) 的先手必胜策略中,先手应执行的第一步,称为集合 \(F\)。则问题 \(T\) 的先手 Alice 只需选 \(F+D\) 删去,交给 Bob 的局面是 \(S-F\),Alice 仍然必胜。

对于本题,先将通用结论变现,特判掉一些“容易判断”的输入状态。若输入状态 \(S\) 中存在元素 \(x\),使得 \(x\in f(S),f(S-x)\subset f(S)\)(称 \(S\) 具备“良好性质”),则 \(S\) 先手必胜。剩下的、需要认真判断的状态满足“所有叶子的父亲都是二度点”。

对于任意状态和任意删除序列,总存在一个中继状态具备良好性质。因此“按照删除顺序,当前状态第一次具备良好性质”就是“里程碑事件”,该事件由哪位玩家达成,直接决定胜负。感受一下,取出每个叶子到最近的非二度祖先间的链,达成“里程碑”之前,这些链都不会被删空;若有个链被删成长度为一的,则达成“里程碑”;除链上点外,没有点会在“里程碑”之前被删掉。因此,这些链互不影响。若只有一个链,问题类似于“有 \(n\) 个点,两人轮流删一个点,删空者胜”,胜负只和 \(n\) 奇偶性有关,sg 函数大概就是:若为奇数则一;若为偶数则零。有多个链,给 sg 函数求异或,可得先手必胜条件:这些链长度都是奇数。

posted @ 2026-04-15 16:53  timefinder  阅读(2)  评论(0)    收藏  举报