构造杂题选做-CF
难度按CF*2500- *2900。
<=*2600基本可以独立完成。
可能不完全是构造?也有强注意力题目。
1840G2
*2500。
很小清新的概率+构造。
大义是给定一个环,这个环由若干不同数字连接而成,你不知道环的大小,最初有个指针指向某个数字,你每次可以顺时针或者逆时针转动指针任意步,交互库会告诉你新的指针指向的值。
在 1000 步以内找到 \(n,n\le 10^6\)。
先来考虑 G1 怎么做,是一个比较套路的分块思想,注意到可以占据连续的 \(d\) 个位置,这样再暴力跳 \(\frac{n}{d}\) 次,每次跳 \(d\),再次跳回这个区域的时候,就能通过跳跃次数和在这一块的相对位移计算出 \(n\)。这个模型感觉比较经典,即任意数字 \(d\),都满足 \(\forall x,\exists k\in [0,\frac{n}{d}],x+kd\bmod n\le d-1\)。
次数是 \(\min(d+\frac{n}{d})=2\sqrt n\le 2000\),还不够。
怎么能够变少一点呢?占据连续位置的次数应该不能省,但跳跃次数呢?注意我从 \(d-1\)(从 \(0\) 开始标号)起跳,恰跳 \(\lfloor\frac{n}{d}\rfloor\) 次可以跳回环上,那么如果我已经知道一个数字 \(t\le n\),我就能一次性跳 \(\lfloor\frac{t}{d}\rfloor·d\) 这么长而不会错过解。
因此,可以使用一些代价找到这个尽可能大的 \(t\),也就是最开始进行若干次随机位移,在高概率得到一个足够大的 \(t\) 后再考虑定下 \(d\) 并沿用上述策略。
\(1000\) 的限制实际上是比较松的,随意估计一下参数就能通过,这里取的随机三十次,定 \(d=500\),最多的测试点只用了八百多次。
启示:达到一个局面后,不妨审视所有有效信息,尤其是未利用信息,它可以让你更进一步
2029F
给定一个大小为 \(n\) 的环,每条边上标记 R/B,判断是否对于环上任意两点,都存在从一点出发到另一点的路径(可以不简单)满足经过的路径是回文的。
判掉显然的存在颜色出现 \(\ge n-1\) 次的情况。
显然这个问题非法的情况比较多,不妨先思考显然的非法情况。
首先弱化回文条件,改为起始位置和终结位置相同,那么这就启示我们,如果一个点出发开头位置只能是 R,另一个点只能是 B,则一定非法。
即,原序列合法则不同时存在 RR,BB 作为循环串的子串。
再考虑能否同时不存在?此刻是 RBRBRBR…… 的情况,则为偶环,且相邻字符不同。
取偶环直径,则不存在简单路径合法,同时若走回头路则路径上首段颜色必然出现奇数次而末尾出现偶数次,非法。
这里启发我们关注颜色段奇偶性,同时也可以看出,连续的偶数个相同颜色可以简化为 \(2\) 个,连续的奇数个相同颜色可以简化为 \(1\) 个。
不妨设最终只存在 RR,可以看到样例RRBRRBRRBRRB是非法的,不妨简化至 RRBRRB 同样非法。
其原因为取较远的 R|B 和 R|R 这两个点时非法,理由是限定了 R|B 出发只能第一步走 R 一侧,此刻会经过完整偶数段,也即最终回文串的第一个连续段必然是长为偶数的 R 段,而又,R|R 两侧段长都是奇数,限定了最终回文串最后一个连续段必然是长为奇数的 R 段。
由此可以看出不能同时存在两个偶数段。
这会引导人自然探究是否可以不存在偶数段,显然,根据上面的等价理论,这个局面等价于 RBRBRBRB…… 是非法的。
那么再探究奇数段。似乎不能找到什么满足以上条件的非法局面,这引导人去尝试满足以上条件的情况下构造解。
将问题想象为两个人从两个点开始走,期望相遇。
当一个人遇到了一个奇数段,另一个人可以原地踏步,等待这个人跨过奇数段。
如果它们起步段可以相向走(也就是靠近),那么顺+逆和逆+顺中一定存在一个合法的不经过偶数段,可以直接相遇。
否则最开始一定是同样顺时针或者逆时针。
这样下去,两个人如果不相遇,则一定有一个人碰到偶数段,另一个人同样原地踏步等待,等待这个人跨段。
接着跨过后,不跨段的人方向反转,就变成互相靠近了,由此可以相遇。
1951F
设 \(b_x\) 为 \(q_x\) 会被换到 \(q·p\) 的位置下标。
逆序对问题,常见的一个思路是讨论每一对构成逆序对的条件。
讨论一下:
- \(x<y,b_x<b_y\),若填 \(p_x<p_y\),贡献 \(0\),否则贡献 \(2\)。
- \(x<y,b_x>b_y\),无论怎么填,贡献都是 \(1\)。
则先将 \(k\) 减去 \(b\) 的逆序对数,显然减成负数或者减成奇数都是非法的。
不妨将 \(k\) 除以 \(2\)。
然后考虑剩下的位置,定义 \(w_i=\sum_{j<i}[b_j<b_i]\),也就是在当前位置填最小值的贡献。
注意你在 \(x\) 处填当前的最小值,会导致 \(y>x,b_y>b_x\) 的没填数的 \(y\) 的贡献减少 1。
这个贡献只减少 \(1\) 很重要,它启发我们答案一定是:
首先从后往前填最小值,直到 \(k\) 小于当前最大的 \(w\),然后从前往后填最小值,直到 \(k\) 等于当前最大的 \(w\),填这个 \(w\),然后再继续从前往后填最小值。
容易发现这样的构造能取到 \([0,\sum w]\) 的所有 \(k\)。
模型:
给出一张 DAG,表示偏序集,设 \(to_i\) 为 \(i\) 偏序的点的个数。
现在需要你给每个点赋权,使得图被偏序且权被偏序的个数恰好为 \(k\)。
显然,按 \(to\) 从大到小填,使得 \(k\) 减小到小于当前最大的未填的 \(to\),然后按 \(to\) 从小到大填,直到这个未填的 \(to\) 等于 \(k\),填写后再从小到大填。
这个方法这样被扩展到了一般的偏序集。
1906L
显然有 \(2k<n,k=n\) 无解,因为取所有的左括号这个方案是 \(\frac{n}{2}\) 的,而显然一个匹配的括号序列不能作为回文串,开头结尾都不同。
考虑 \(2k=n\) 时显然构造 \(k\) 个左括号接上 \(k\) 个右括号。
不妨考虑 \(k=n-1\) 时的构造,不难发现构造 \(\frac{n}{2}\) 个 \(()\) 即可。
这启发我们扩展 \(k\) 为奇数的构造,构造 \(\frac{k+1}{2}\) 个 \(()\),然后如何放置剩余串来尽可能降低影响。
显然,剩下的左括号全放这个构造的串的左边,右括号全放右边,它们不会与中间串产生任何贡献。
再考虑一些特殊的子结构,比如 ())( 这类结构。
可以发现,它可以解决 \(k=4m\) 的情况,不断嵌套 ())( 子结构,最终需要解决剩余的 \(n-k\) 个括号放置问题。
效仿 \(k\) 为奇数时的构造,将所有左括号放左边,右括号放右边,它们不会与中间产生贡献。
再考虑 \(k=4m+2\) 的情况如何从 \(4m\) 扩展过来。
可以在 ())( 构造完成后,先在左右两侧各自甩一个 (。然后再放置剩余左右括号即可。
启示:关注较小局面,用较小局面填充/扩展较大局面。
2071D2
虽然但是,这个题为什么有构造标签。
显然先拆前缀和,不妨设现在在算 \([1,N]\)。
考虑发现一点关键性质:
-
\(a_{2k}=a_{2k+1},2k>n\)。
-
若将 \(n\) 视作奇数(也就是从 \(n+1,n+2\) 立刻开始相邻两个元素相同),设 \(w=a_1\oplus a_2\oplus \dots \oplus a_n\)。
则对于 \(2n\) 往后,\(a_{2n}=a_{2n+1}=w,a_{2n+2}=a_{2n+3}=w\oplus a_{n+1},a_{2n+4}=a_{2n+5}=w,a_{2n+6}=a_{2n+7}=w\oplus a_{n+3}\)
也就是 \(2n\) 往后会呈现地比较循环。
不过这个结构,足以提示我们递归解决问题。
考虑我们可以整个把 \(w\) 拿出来,对那一段进行求和,再根据 \(w\) 的取值 \(0,1\) 重算这个解。
仔细看看,\([n+1,N]\) 的值等价于?
考虑循环节长度为 \(4\),不妨假定区间 \([2n,N]\) 的长度是 \(4\) 的倍数。
那么问题就等价于计算 \(2a_{n+1}+2a_{n+3}+\dots\),注意到 \(a_{n+1}=a_{n+2}\),就等价于算 \(a_{n+1}+a_{n+2}+a_{n+3}+\dots\)
至于相较于 \(4\) 的倍数多出来的部分,其贡献仔细检查边界同样可以计算。
小心推导后可以给出子问题为 \(N'=n+2\lfloor\frac{N-2n-2}{4}\rfloor+1+\min(1,(N-2n-2)\bmod 4)\)。
1696F
幽默题目。
先不说正解,来看看最开始的想法。如果有 \(i,j,k\),满足 \(d(i,j)=d(i,k)\),我们就知道 \(j,k\) 没有边相连,删掉这样不可能的边后,注意到我们可以将图划分为二分图。
进一步地发现我们就很难得到进一步结论了。
此刻我才发现 \(n=100\)。
注意到你如果确认了树上一条边,则可以遍历所有的点来判断是否与边的两个端点有边。
则考虑枚举一条边 \((1,x)\),这是 \(O(n)\) 的。
然后判断一条边带来的增量也是 \(O(n)\) 的,总共需要判断 \(O(n)\) 条边,因此复杂度是 \(O(n^3)\)。
建出树后再 \(O(n^3)\) 判断是否满足题设数组
复杂度 \(O(n^4)\),瓶颈是判断合法。
事实上可以优化到 \(O(n^3)\),我们只需要提前判断对于一个点为根的情况下,\(d(rt,i)=d(rt,j)\) 是否满足其为传递性关系即可。
1977E
题意:隐藏了一张传递闭包的有向图,满足所有的边 \(u\to v\) 都有 \(u>v\),保证任意三个点至少有一对点较大的可以到达较小的,一次可以询问一条边是否存在,需要在不超过 \(2n\) 次操作内将点划分为两个点集,点集内的任意点对 \(i<j\),都有 \(j\to i\)。
初步分析题目性质。
考虑一下这张图的情况,不妨先忽略掉有向边,只考虑弱连通。
条件相当于补图无三元环,也就是补图最大团 \(\le 2\),也就是原图的最大独立集大小 \(\le 2\),间接说明图可以由两条可重的链来表达。
我们只需要找出这两条链,划分点集的话只需要拿出一条链和剩下的点即可。
怎么找?由于图满足 \(1\sim n\) 为其拓扑序,考虑从小到大增量构造。
\(i:1\to n\)
维护两条链的当前形状,考虑新加入点 \(i\),与两条链的末尾分别询问。
如果恰能加入一条链则加入,否则如何选择加入哪条?
对于当下有优势可以调整的决策,不妨存下,留待日后。
那么考虑维护三条链,满足:
- 第一条链。
- 第二条链。
- 能同时加入两条链的点且它们也可以自己可达。
考虑这个新加入的点,你应当首先与第三条链的末尾询问,因为这个末尾比剩下两个都大。
如果可以加入第三条链则直接加入。
否则其至少与第一条链和第二条链的链尾其一有可达关系,否则就出现了大小为 \(3\) 的独立集了。
一次询问就能求出其与哪条链顶存在可达关系,加入这条链,并将整个第三条链并入另一条链,清空第三条链。
我们就维护了这个双链顶独立的结构,最终将第三条链全部加入第一/二条链,两条链就对应了划分方案。
1893D
我太幽默了,想岔了。
不过这里提出一个思路:
考虑如何构造一个架子的最优解,设大小为 \(n\),数字的出现次数分别为 \(c_i\),满足 \(\sum c_i=n\)。
设 \(c\) 的最大值为 \(mx\),个数为 \(cnt\)。
我们声称答案是 \(d=\lfloor\frac{n-cnt}{mx-1}\rfloor\)。
考虑构造,将这 \(cnt\) 个最大值按顺序每 \(d+1\) 个或 \(d\) (把 \(d+1\) 放完必须放 \(d\) 后)个位置放一次,保证最后 \(cnt\) 个位置都是最大值。
然后考虑剩下的数字,依次在这 \(mx-1\) 个块里填,可以写出一个顺序:第一个块的第 \(cnt+1\),第二个块的 \(cnt+1\),第三个块的 \(cnt+1\)……第 \(1\) 个块的 \(cnt+2\) ……。
这样显然一个数字不会放在一个块里。
以上与本文无关。
有限制的问题,思考最优化的优先级应当放在思考可行性之后。
同时相信 *2600 不会这么复杂
根据上面的构造,也不难看出 \(s_i\) 要求为 \(d_i\) 有多松,就是每块( 长度为 \(d_i\),以及最后的 \(s_i\bmod d_i\)) 不出现重复数字即可。
可以直接将其划分为若干个独立段,要求其不出现重复数字。
将段长从大到小排序,每次从堆里取出最大的这么多个值放入一块即可。
最后放一起构造一下就行了。
1835C
考虑到有 \(2^{2k+1}+2^k\) 个区间,而值只有 \(2^{2^k}\) 种,这说明至少存在 \(2^{k+1}+2^k\) 个区间存在区间值与它相同。
我们每次随机一个区间,找不到解的概率小于 \(\frac{1}{2}\),可以用前缀异或和结合哈希来寻找不交且值相同的区间即可。
可以特判一下出现相同数字的情况来加速。
1906B
太幽默了这题目。
对于这种只有开关两种状态且限制并不很复杂的情况(往往是很接近的数字来操作),一般可以优先考虑异或前缀和。
考虑其异或前缀和,相当于 \(S_i\neq S_{i-1}\),则可以将二者同时异或 \(1\),相当于将 \(S_i,S_{i-1}\) 进行交换。
若 \(S_1=1\),可以反转 \([2,n]\)。
那么直接做异或前缀和,两个序列的 \(1\) 的个数要么相等要么和为 \(n-1\)。
这题怎么有 *2600 的???
2103E
操作性题目,一个常见的思考方向是能否组合出更强的操作,同时可以一定程度上忽略操作次数限制
考虑有 \(a_i+a_j=k\),我们可以将其变化为任意的 \((x,k-x)\),\(x\in [0,k]\)。
如果存在另一个数 \(a_k\),可以发现我们能在 \(3\) 次操作内交换 \(a_i,a_k\)。
设 \(a_i=x,a_j=y,a_k=z\)。
原理:将 \((a_i,a_j)\) 变为 \((k-z,z)\),然后将 \(a_i\) 与 \(a_k\) 进行变化 \((z,k-z)\),接着再将 \(a_j,a_k\) 进行变化,\((z,k-z)\to (y,k-y=x)\)。
考虑用这个操作解决原问题。
如果我们找到了这样两个位置,则可以通过一个数能与另一个数换位的办法,实现互换两个数字的位置。
比如 \(a_i+a_j=k\),要交换 \(a_x,a_y\),先交换 \((i,x)\),然后交换 \((x,y)\),最后交换 \((y,i)\)。
把 \(i\) 先换到 \(1\), \(j\) 先换到 \(n\),这样就能将剩下的 \(n-2\) 个数字排序了。
接着再将这两个数变成 \((0,k)\) 即可。
考虑减少操作次数。
我们只需要保证操作完这两个特殊值的和还是 \(k\) 即可,它们具体是什么值不关心,这样就能只用 \(2\) 次与一个数字交换了。
同时,可以扩展到用 \(3\) 次操作给两个数字换位—— 设要交换 \(x,y\),\(1\) 先变成 \(k-a_x\),然后将 \((1,x)\) 变成 \((k-a_y,a_y)\),接着再将 \((1,y)\) 变成 \((k-a_x,a_x)\)。
这样的操作只需要做 \(n-2\) 轮,最初将一对值换到 \(1,n\) 最多需要 \(2\) 次,最终只需要 \(1\) 次调整,综上最多用 \(3(n-1)\) 次。
1918G
构造符合题设要求的序列,尤其是在给出限制 \(n\) 这种单一情况时,不妨手动构造小数据,并且可以考虑增量法构造,找基础性质辅助构造之类的。
考虑一个序列合法要满足什么条件,这本质是集合哈希的思路。
注意原题操作是加,那么用序列和刻画一下:
\(S_n=2S_n-a_1-a_n\implies a_1+a_n=S_n\implies a_1-S_{n-2}=a_{n-1}\)。
借助这个条件,并注意到样例 \(4\) 有解而 \(5\) 无解,考虑从 \(4\) 的基础上增量构造,每次构造 \(2\) ——借助上面的条件快速确定下一个位置填什么,接着考虑下下个位置用两个序列数集差异确定。
手算一会,可以得到:
$[1,2,-2,-1]\to [1, 2, -2, -1, 1, -1, 1, 2, -2, -1, 1, -1, 1, 2] $。
不妨设变换后的序列是 \(b\),原序列是 \(a\),\(a\) 的前缀和是 \(s\)。
注意到有:
或者看出来长为 \(6\) 的循环节。
那么奇数呢?我们显然无法找到 \(3\) 的解,同时样例告知 \(5\) 无解。
探求一下 \(7\) 是否有解,基于偶数情况的提示,我们可以自然猜测数域不会太大。
爆搜发现 \([-2,2]\) 的数域无解,\([-3,3]\) 的数域就有解了。
但其中有一些解是不具备扩展性的,也即它们的第 \(8\) 项数域超了。
对于第 \(8\) 项仍在 \([-3,3]\) 的解筛选一下,有四组(还是五组记不清了),任取一组,尝试用类似偶数的办法构造。
比如一组解 \([3, 3, -2, -1, 1, -1, 2]\)。
发现这样构造是可行的,由此本题解决。
2068H
转化一下问题,相当于是找到 \(dx_i,dy_i\),满足:
- \(|dx_i|+|dy_i|=d_i\)
- \(\sum dx_i=a,\sum dy_i=b\)
那么先做一下 Yes/No 的判断。
- \(\sum d_i<a+b\) 显然非法。
- \(\sum d_i+a+b\) 是奇数显然非法。
- \(\max d>a+b+\sum d-\max d\) 非法,这是因为一个太超,后面救不回来了。
剩下的情况,考虑这个形式比较丑陋,用常见思路曼哈顿转切比雪夫转化一下。
设 \(a'=a+b,b'=a-b\)。
问题就还是变成了设 \(dx_i,dy_i\),有:
- \(\sum dx_i=a',\sum dy_i=b'\)
- \(\max(|dx_i|,|dy_i|)=d_i\)
- \(dx_i,dy_i\) 与 \(d_i\) 奇偶性相同。
先不考虑第三条奇偶性的限制,这是经典凑数模型。
将 \(d\) 从大到小排序,将 \(d_1\) 分给 \(x\),\(d_2\sim d_{n}\) 分给 \(y\)。
对于 \(y\):扫描 \(d_2\sim d_n\),如果为正数就减去 \(d\),否则加上 \(d\),由于值从大到小,最终的 \(y'\in[-d_1,d_1]\),就能直接找到 \(d_1\) 取多少了。
对于 \(x\):先减掉 \(x\),然后考虑 \(d_2\sim d_n\),是正数就减,最多减到零,是负数就加,最多加到零。
考虑奇偶性的话,显然 \(y\) 是不用考虑的,考虑 \(x\),先把奇数的限制清掉,也就是减掉 \(1\) 变成偶数,包括 \(d_1\)。
然后把操作后的 \(x\) 拿去逐个与奇数的 \(d\) 做加减一的扫描——奇变偶,再来单独处理奇的变数。
复杂度 \(O(n\log n)\),瓶颈在排序。
2081C
感觉这个题难点在实现啊。
优先执行最有性价比的操作
考虑只有 \(0,1\) 的情况,显然是拿出 \(1\) 的行有 \(a\) 个,\(1\) 的列有 \(b\) 个,最终是有 \(\max(a,b)\) 的操作次数。
原理是可以一行配一列一次操作去掉两个,剩下的那个只能两次操作去掉两个。
探求一下关系,本质上是可以将一个至少一行至少一列的异或和为零的行列,使用大小 \(-1\) 次操作解决。
也就是 \(n\) 个行点,\(m\) 个列点,一个点集 \(S\),如果同时含有至少一个行点和一个列点且内部异或和为 \(0\),则可以用 \(|S|-1\) 次操作将它们全部变成 \(0\)。对于任意大值都成立。
那么,问题就变成了给有值的位置尽可能多分,实在分不了就拿另一类点的 \(0\) 来凑数。
则优先选择 \(|S|\) 最小的划分不劣。
当不存在有值的行或者有值的列后,将剩下的有值的位置全部于第一行/列进行操作一定是最优的。
也即:
-
最优先选择 \(2\) 的划分:值相同的行列。操作后每个值只有行/列存在。
如果剩下的所有点都是行点或者列点,则无法继续分。
不妨假设剩下的都是行点,则都将其与第一列进行操作即可。
-
然后选择 \(3\) 的划分:三个值分属 \(1,2,3\)。要求三个值剩下的点不能全是行或列,操作完后一定只剩下两个颜色。
-
考虑剩下两个颜色时,从每个颜色各拿两个出来形成一个 \(|S|=4\) 的组。
-
最终一定只会剩下一个颜色,也就是只剩下行或者列。
2022D2
先来研究一下各类人的性质,下面简称冒名顶替者为骗子,骑士为好人,恶棍为坏人。
这个询问有一个性质是向一个人询问某个人时,若回答是好人,则说明这个人认为询问的人与它是同类,反之则不是同类。
那么骗子的回答与人的回答会矛盾,形式化地,不妨设若 \(i\) 认为 \(j\) 是好人则连一条值为 \(0\) 的边,否则连一条值为 \(1\) 的边,则对于一个人的集合 \(S\),判断骗子是否在其中,可以将 \(S\) 的点排成一个环,每个人都问一下自己在环的后继,如果环的异或和为 \(1\) 则说明存在骗子。
显然,判定骗子在哪里,取 \(|S|=2\) 是最方便的。
当我们锁定了一个骗子所在点集,如何得到具体谁是骗子?显然拿到一个一定不是骗子的人,与一个可能是骗子的人互相询问,如果矛盾则确定骗子,否则不是骗子。
由此就容易给出一个至多 \(n+1\) 次的方法:将元素两两分组,最后能够确定骗子在哪两个点里,接着拿到一个非骗子,与这两个点其一互相询问。
仔细分析一下,这个策略在 \(n\) 为偶数的时候恰好 \(n\) 次(如果前 \(\frac{n-2}{2}\) 组都没找到的话就在最后一组),奇数恰为 \(n+1\) 次。
同时这个策略可以使用 \(2\) 的代价将 \(n\) 的问题转化到 \(n-2\) 的问题,对 \(n\ge 4\)。
而显然最小次数不小于 \(n\),\(n-1\) 连“是否存在骗子”都难以判定。
那么考虑 \(n+1\) 能否优化到 \(n\),\(n=3\) 显然是不行的,\(n=5\) 呢?考虑 \([3,2]\) 分组,先用 \(3\) 次判定骗子是否在 \(3\) 中,如果不在,则用 \(2\) 次操作判定 \(2\) 中的第一个即可,如果在,则在 \(3\) 中找一个点,问它的问回去,它问别人的让别人问回来。
如果两个都矛盾,说明是它,否则说明是矛盾的那一个边的另一个端点。
2201F2
考虑独立的两列,它相当于是说不同时存在 \((0,1),(1,0)\)。
如果将一列看作一个集合 \(S_i\),里面存的是为 \(1\) 的行号,相当于是在描述 \(\forall i,j,S_i\subseteq S_j\or S_j\subseteq S_i\)。
每次修改相当于在一个 \(S\) 里加入一个数字。
对于这样一个问题的判定,我们有两个通用的方法:
子集哈希法
注意到:\([S_j\subseteq S_j\or S_j\subseteq S_i]=[\max(|S_i|,|S_j|)=|S_i\cup S_j|]\),而其他情况都取 \(>\)。
对于这样 \(\frac{n(n-1)}{2}\) 个的二元不等式每个都取等,相当于不等式左侧和等于右侧和。
也就是有:
二者都能够在 \(O(1)\) 时间内处理出一次修改后的值。
阶梯法
第二种办法是,注意到可以将矩阵做如下变化:将黑点越多的行越往下排,同时将黑点越多的列越往后排。
这样更改后,一个矩形合法当且仅当其为一个阶梯状物,不存在中空的白点。
描述一个 \(n\times n\) 矩形内靠右的阶梯。
一个方法:记录每一阶的高度 \((h_1,h_2,\dots ,h_n)\),以及设 \(b_i\) 为有多少行具有 \(\ge i\) 个 \(1\)。
不难发现 \(b_x\) 的实际意义是表达第 \(n-x+1\) 列。
也就是满足 \(b_1=h_n,b_2=b_{n-2}\dots\)。
对于一般的可以转化为阶梯的图像,可以看到 \(h,b\) 都是不受影响的,只需要统计完后排序即可。
也就是对于一般的图,\((h_1,h_2\dots h_n)\) 这个集合等价于 \((b_1,b_2\dots b_n)\) 这个集合。
用集合哈希即异或哈希即可。
2061G
这题纯牛吧。
可以看出一组人本质上是一个匹配。
可以看到 \(f\) 是一个固定的问题,也就是对于所有点数为 \(n\) 的图,它的匹配数与它的补图的匹配数的较大值的最小值。
可以用一点时间打一下 \(\le 8\) 的表,看得出来答案是 \([0,1,1,1,2,2,2,3]\)。
大胆猜测答案是 \(\lfloor\frac{n+1}{3}\rfloor\),考虑怎么构造,塞一个前 \(x\) 个点为完全图,后面的点是孤立点的图,它的匹配数是 \(\lfloor\frac{x}{2}\rfloor\),再考虑它的补图,匹配数显然是 \(\min(x,n-x)+\lfloor\frac{max((n-x)-x)}{2}\rfloor\)。
取 \(x=n-\lfloor\frac{n+1}{3}\rfloor\) 即可取得这个界。
方案的话,考虑用询问的边来保存原图的一个匹配和补图的一个匹配。
这个值启发我们在增量法的前提下,应当尽可能用三个点给两个图的匹配都增加一。
因为这个问题 \(n\) 的构造法和 \(n-1\) 的构造法应当很相似才对。
维护一条满足性质的链来调整 是一个比较常见的方法。
维护一条链,链上相邻两个点的边存在状态相同(即全部存在于原图或者补图)。接着考虑新加入一个点 \(x\)。
若链长不足 \(2\) 或与链尾的边的关系和链的关系一致则直接加入链,否则拿出链尾 \(ed\) 以及链尾前一个点 \(p\)。
在两个匹配里分别加入 \((x,ed),(p,ed)\) 即可。
最终这条链会全部加入某个匹配,这个匹配就一定满足大小不小于 \(\lfloor\frac{n+1}{3}\rfloor\)。
2207G
\(\frac{2}{3}P\) 是一个很具有提示性的限制,这揭示了如下构造模型:
构造一个满足一定要求的选点方案,要求其权值和至少为 \(\frac{a}{b}S\)。
利用鸽巢原理,找到 \(b\) 个方案,满足其和为 \(aS\)(往往地,每个点在 \(b\) 个方案里出现 \(a\) 次),至少有一个方案满足要求。
在本题中亦是如此。
首先还是做一定的推理:什么样的图可以达到。
考虑最后一个染色的点,它的周围至多只有 \(1\) 个黑色点,这时候可以删去它,不断做这样的事情,最后可以删空整个图即可。也就是说,这个图是可以拓扑的,进而说明若在相邻黑色点之间连边,则图是森林。
结合上面的模型,我们先弱化一下必需点的条件,怎么将图划分为三个子图,每个点都出现两次?
常见的图划分方式是按坐标的某个函数模固定值的方式存在的。
不难发现 \((i+j)\bmod 3 \neq k\) 组成的一张图一定是个森林,因为一个点出发只能上左或者下右走。
枚举这三张图,考虑将不在图中的必需点加入。
加入一个必需点后,如果图中出现环,就需要删去环上的点。
数据范围不大,可以暴力找环删点。
鉴于保证必需点合法,则环上一定有点不是必需点,同时保证了 \(b\) 这个特殊点与必需点不相邻,因此环上一定存在值为 \(a\) 的普通点可以删。
来分析一下这个权值。
必需点权值和 \(cnt·a\),非必需点的 \(P-w_k\),再减掉删去的点 \(a·del\)。
考虑加入一个必需点,它会导致删掉三个普通点,并且只有加入 \(x+y\bmod 3=k\) 的必需点才会导致删掉。
不妨设这样的必需点个数为 \(t_k\),则有:
由此成立。
1979F
哈密顿路,欧拉通路 这种具备明显子问题结构的问题,要么考虑增量构造,要么考虑递归构造。
并且,只缺少 \(n-2\) 条边的限制,等价于再说度数最大的点度数 \(\ge n-2\)。
\(n=2\) 构造显然。
不妨询问一下 \(n-2\),若它给出的点是一个度数为 \(n-2\) 的点,那么可以直接递归,最后根据这个非邻接的点的位置选择插入当前路径的头或尾。
如果给出的是一个度数为 \(n-1\) 的点,直接递归就破坏了最大点度数 \(\ge n'-2\) 的性质。
因此我们需要配套一个 \(deg<n-2\) 的点,可以直接找度数最小的点,然后递归,接着将这个 \(deg=n-1\) 的点接上去,再把这个度数最小的点接到它后面即可。

浙公网安备 33010602011771号