2026 集训5
1.CF1991F
考虑三角形两边之和大于第三边,那要是一直不合法就是两边之和小于等于第三边,也就是排完序都有 \(a_i + a_{i+1} \le a_{i+2}\),我们希望找到一个序列满足这个条件且序列最长。
由于长度都是正整数,于是 \(a_1 =a_2 = 1,a_{i+2} = a_i + a_{i+1}\),发现是斐波那契。
注意到 \(F_{45} = 1134903170 > 10^9\),这就告诉我们 \(45\) 个木棍一定能拼出 \(1\) 个三角形。我们再往里塞三个棍,就能拼出来 \(2\) 个了。
于是 \(r-l+1 \geq 48\) 时输出 YES。
剩下的暴力,但是无法 \(n^6\),考虑一个三角形,显然大部分都是排完序三个连续木棍拼的。于是我们排完序枚举两段不交的长度为 \(3\) 的连续木棍看能不能拼。
写完发现过不了第一个询问。
2 2 4 5 10 10,按我们这么做拼不出来,于是还得看连续 \(6\) 个木棍,随便排能不能拼。
至于为什么是连续 \(6\) 个,比如你原来选的 11011011,如果一个 \(0\) 左右都是同一个三角形的棍子,那么可以把那个三角形最左边的一根换成这个 \(0\)。
因为原来是 \(x\le y \le z,x+y > z\),你换一个 \(x < x' < z\) 过来,仍旧 \(x' + y > z\)。
不断做这样的替换。最后如果所有空位都被填掉,那么选中的就是连续 \(6\) 根;如果还有空位无法填,那么这个空位左右一定属于不同的三角形,都能在她覆盖的区间内找到连续三根组成三角形,也就被前边算过了。
2.CF2003D2
刻画一下这个过程,发现像是算出来每个序列的 mex,你要是能从别的地方给她一个,就能跳到更大的 mex。
那我们把每个序列的 mex 值称为 \(g\),让 \(g\) 向这个序列加上 \(g\) 的 mex 建边。
然后发现能吃到的最大的 mex 就是这个点能达到的最大点。
由于我们一定是小点连向大点,所以这个扫一遍就能快速算出。
不管怎么走都劣的也就是比最大点还大的起点,直接不操作,等差数列算一下和。
写完发现样例差 eps。
就想到这。
发现有的点是可以拿到低保的。
比如 2->3 2->10,起点是 \(100\),你能通过第一个边走到 \(2\) 之后再走第二个边到 \(10\)。其她起点都同理。
所以我们记录一下所有出度至少为 \(2\) 的点能到最大的点的最大值,以及所有的 \(g\) 的最大值作为低保。
3.CF2008H
发现给所有的都减到 \(\le x\) 不劣。
二分答案。
\(mid\) 为中位数只有
发现贡献是一个 \(a_i \in [kx,kx+mid]\) 状物。
维护一个桶的前缀和,这样可以快速算值域内数的个数。
然后枚举 \(k\) 来 check。
4.CF2013E
考虑当前前缀 \(\gcd\) 为 \(g\),设 \(A = \min_j \gcd(a_j,g),B=\gcd(g,y)\),\(y\) 是一个任意的 \(a\) 中能满足 \(A<B\) 的值。
假设现在 \(A=\gcd(g,x),B=\gcd(g,y)\),我们看一下先选 \(x\) 再选 \(y\) 的贡献。
选 \(x\) 这步显然贡献为 \(A\)。
接下来前缀 \(\gcd\) 变成 \(A\),贡献变成 \(\gcd(A,y)\)。
由于 \(A \mid g\),所以 \(\gcd(A,y)=\gcd(A,\gcd(g,y))=\gcd(A,B)\)。
我们算好了贡献,看能不能比出来大小。
因为 \(\gcd(A,B) \mid B-A\) 且 \(A<B\),所以 \(\gcd(A,B) \le B-A\)。
两边同时加 \(A\),得到 \(A + \gcd(A,B) \le B\)。
因此,对于任意一个没有选择 \(x\) 的最优方案,都可以把 \(x\) 提到当前位置,且答案不会变差。所以当前一定可以选择使下一项前缀 \(\gcd\) 最小的数。
对于第一个位置,直接认为 \(g=0\) 即可。
5.CF2014G
直接模拟。
6.CF2031E
考虑如果我们知道 \(u\) 所有儿子的子树的最小深度,假设就俩儿子,那 \(u\) 的深度就是她俩 \(\max\) 再加一。
思考一下,肯定越晚拿大的,大的贡献就会越少。
所以用优先队列模拟一下每次取两个的过程。
7.CF2034E
被这题硬控 1h。
为了方便,我们把题面中的 \(n,k\) 叫做 \(m,n\)。
首先考虑一些显然的无解情况:\(m! < n,m! = n+1\)。
其次我们可以知道,每列的和就是 \(\frac{(1+m)nm}{2m} = \frac{(1+m)n}{2}\),无法整除也就是 \(m\) 偶 \(n\) 奇同样无解。
接下来分讨 \(n,m\) 的奇偶性。
-
\(n\) 偶,\(m\) 奇/偶:
不难发现一种好的构造方式:每两行组队构造,所有奇数行直接
next_permutation,偶数行就看每个位置,上一个距离 \(1+m\) 差多少直接填。 -
\(n\) 奇,\(m\) 奇
首先一个显然的想法是先用 \(m\) 行 \(m\) 列的填出一个循环位移的方阵,剩下的按偶数做。填不了的你断言无解。
但这样真的对吗?你开开心心地写完,交上去发现
WA on #2 test case 2,你把有解判成无解了。看她的输入
137 5。一看 \(n\) 这么小,难不成能用 \(3\) 行就构出来剩下的按偶数做?稍加思考发现,确实如此。
具体地,我们分别填:
\(1,2,3,\cdots,m\).
\(m,m-2,m-4,\cdots,1,m-1,m-3,\cdots,2\).
\(\frac{m}{2}+1,\frac{m}{2}+2,\cdots,m,1,2,\cdots,\frac{m}{2}\).
具体咋发现的话,手画一个 \(n=3,m=7\) 的,算出来每列需要 \(12\),首先我们填 \(1\) 到 \(m\),每列需要的就是 \(11,10,9,\cdots,5\)。我们再猜一下这个按奇偶放的,再减去贡献发现需要的也是一个排列,而且很有规律,于是做完了。
要注意这种情况 \(n<3\) 中除了 \(n=m=1\) 同样无解。
8.CF2046C
考虑二分城市数 \(k\)。
check 就枚举一个竖线,在两边直接看高度第 \(k\) 小和第 \(k\) 大,中间这个区间就是横线可以在的区间,看左右的这个区间有没有交即可。
10.CF2062D
考虑她操作的本质是啥。
不难发现就是给一个子树或者她的补集加 \(1\)。
考察一条边 \(u \to v\):
当 \(a_u > a_v\),时,把 \(v\) 这侧都加一,没有提高
11.CF2070E
显然两个 \(0\) 加一堆 \(1\) 或者 \(0\) 直接先手必胜。
玩一下样例,发现 0 0 1 是很厉害的样子。
发现往里再填一对 0 0,后手必胜;填一对 0 1,后手必胜;填一个 0,后手必胜;填 0 0 1,后手必胜;填 0 1 1,后手必胜。
填 0 0 1 0,先手必胜。
同时我们猜测在先手必胜状态下加一个 0 0 1 0,仍先手必胜,其余除了最开始说的状态先手都必败。
考虑基础先手必胜状态:0 0 1 以及全 \(0\)。
验证一下,发现还挺充分。
发现我不会计数,而且两种先手必胜状态拼出来的也不一定是先手必胜。
然后瞎推了推式子,写完发现样例都没过。
就想到这。
其实我的做法是对的,只是代码写炸了而已。
12.CF1876C
考虑建 \(i \to a_i\) 的边建出一棵内向基环树。
发现如果给原图黑白染色表示 \(i\) 点被没被圈。
发现如果 \(i\) 是白色,那么 \(a_i\) 一定是黑色。
这是因为如果 \(i\) 是白色,那 \(a_i\) 肯定在剩下的里,即在操作序列里,即 \(a_i\) 为黑色。
发现如果一个点 \(x\) 是黑色,那么一定有一个指向她的是白色。
这是因为她是黑色说明她在操作序列里,也在剩下的序列里,说明剩下序列里肯定有一个 \(a_i = x\) 的。
知道这两条性质之后就很好办了。
贪心地做,如果有白色儿子,那自己就是黑的;反之自己就是白的。
环上的话,只需要保证没有奇环,偶环直接染就好了。
13.CF1898E
如果没有排序操作,就直接找后边第一个能匹的地方了。
那排序的作用就在于,能把后边匹的位置提到前边而不浪费中间的值。
显然如果一个字母在后边,她肯定不能把在前边比她字典序小的排过来
所以我们维护 \(26\) 个队列分别表示 \(s\) 中 \(26\) 个字母出现的位置,前边还比当前这个小的直接弹掉,要是有一个时候填不上就无解。
14.CF1907G
考虑建出基环树,不在环里的而且入度为 \(1\) 还是亮的,就必须做操作。
所以做一个类似于拓扑排序的东西,把非环都处理完了。
接下来环上一定会是相邻两个,一个一直推过去,然后她们两个消掉。
发现这样的答案只有两种,也就是奇推到偶或者偶推到奇。
直接算一下贡献,每个环直接取 \(\min\) 就好了。
15.CF1919D
考察一个点,裂开的话会在她左边或者右边新增一个她的权值加 \(1\),这是显然。
反过来的话,如果左边右边如果都是叶子,那说明两个叶子权值分别是她和她加一。
我们持续对这样的点往上合并,看看最后能不能合成 \(0\)。
考虑一个数 \(x\),她能被删说明有一时刻她旁边走过来一个 \(x-1\) 把她带走了。
考虑一个序列 \(y,\ge x,\ge x,\cdots,\ge x,x\)。
中间这些有可能被删掉,然后 \(y\) 来到 \(x\) 旁边,如果 \(y = x - 1\),直接删掉了,右边同理。
如果中间每个点都能删掉那 \(x\) 自然能删掉。
按权值从大到小归纳。处理到 \(x\) 时,我们假设所有 \(>x\) 的点都已经能被删掉了。
这样中间全是 \(x\),\(y\) 一路删过来即可。
所以直接看每个数是否都有能删掉她的就好了。
16.CF1934D1
第一眼看见这题,给你 \(63\) 次,而且这样例也是一位一位做的,所以我们也考虑一位一位做。
写了个从低往高不一样的直接翻,甚至过样例了。
交上去 6 1 直接构出来个 6 7 5 1。
我发现这个做法简直没有任何道理。
先把 \(n<m\) 判了。
考虑一次操作,当前是 \(x\),选一个 \(a\),可以变成 \(a\) 或者 \(a\oplus x\)。
考虑当前为 \(x\),希望一次操作后变成 \(z\)。此时可以直接选择 \(a = z\),另一部分就是 \(x\oplus z\),因此要求 \(z<x,x\oplus z<x\)。
设 \(z\) 最高 \(1\) 位为 \(r\)。
-
如果 \(x\) 最高 \(1\) 位也在 \(r\) 这,那么说明她俩的异或也小于 \(x\)。
-
如果 \(x\) 最高 \(1\) 位比 \(r\) 高且 \(x\) 第 \(r\) 位是 \(1\),那她俩的异或小于 \(x\)。
-
如果 \(x\) 最高 \(1\) 位比 \(r\) 高且 \(x\) 第 \(r\) 位是 \(0\),那她俩的异或大于 \(x\)。
这告诉我们,\(x\) 能够变成 \(z\),充要条件是 \(z\) 最高 \(1\) 位在 \(x\) 这里同样是 \(1\)。
设 \(n\) 最高,次高位 \(1\) 分别为 \(p,q\),\(m\) 最高位 \(1\) 为 \(r\)。
如果说 \(n\) 第 \(r\) 位是 \(1\),直接一步就能做完了。
接下来,也就是 \(n\) 第 \(r\) 位为 \(0\),如果 \(r<q\),也就是 \(m\) 最高位比 \(n\) 次高位还低,那么我们构造一个 \(g = m \oplus 2^q\)。
这样 \(g\) 最高位在 \(n\) 是 \(1\),\(m\) 最高位在 \(g\) 上是 \(1\),这样可以两步做完。
接下来考虑 \(q<r<p\)。
看任何一个与 \(n\) 最高位相同、小于 \(n\) 的数 \(x\)。
由于 \(p\) 到 \(q\) 中间全是 \(0\),如果想得到一个 \(p\) 到 \(q\) 中间的值为 \(1\),显然她就会大于 \(n\),不合法。
如果没有次高位而且第一个做法也做不出来就无解了。
因此,当当前数的最高位仍为 \(p\) 时,第 \(r\) 位恒为 \(0\),所以根据前面的单步转移条件,不可能一步把最高位降到 \(r\)。
一旦最高位降到 \(q\) 或更低,由于每次操作后数值严格减小,就再也不可能到达最高位为 \(r\) 的 \(m\)。因此无解。
17.CF1948E
把点 \((i,a_i)\) 扔到平面上,那在一个团也就是任意两点曼哈顿距离 \(\le k\)。
我们想满足这个,然后我们发现同一个团 \(a_i\) 连续一定不劣,接下来考虑怎么放。
假设现在一个大小为 \(x\) 的团发现限制最严的就是 \(1\) 和 \(x\),越往里限制越松。
例如 \(x=5\),我们构造 \(a=[2,1,5,4,3]\),发现是可行的。
设这一团取的最小最大下标分别是 \(l,r\),这一团大小为 \(s\),那么 \(r-l\ge s-1\),且 \(|r-l|+|a_r-a_l|\le k\)。左边至少是 \(s-1+1=s\),因此 \(s\le k\)。
那么一个团大小上界就是 \(k\)。
我们按照上边的构造方案做即可。
18.CF1954E
看到跟值域相关的问题,想到笛卡尔树。
建一个小根笛卡尔树,显然她的操作是在子树减 \(k\),根减没了直接裂成左右两棵树。
一个点最多能吃 \(\lceil \frac{a_i}{k} \rceil\) 次伤害,父亲死后儿子只需要吃 \(\lceil \frac{a_{fa}}{k} \rceil - \lceil \frac{a_u}{k} \rceil\) 次伤害就好了。
发现这个东西等价于 \([a_{fa},a_u)\) 有多少个 \(k\) 的倍数。
考虑处理出 \(c_i\) 表示 \(i\) 在每个 \([a_{fa},a_u)\) 共出现多少次。
这个对于每条边 \(u \to v\) 直接 \([a_u,a_v)\) 区间加一就好了。
之后查询直接枚举所有 \(k\),枚举 \(k\) 的倍数,求 \(\sum_j c_{jk}\)。
19.ARC179B
看见 \(m\le10\),考虑状压。
设 \(dp_{i,s}\) 表示前 \(i\) 位,当前可以填的数有哪些。
枚举一个 \(h\) 填,接下来 \(h\) 不能用了,但是所有 \(x_i = h\) 的都可以填了。
因此 \(dp_{i,s} \to dp_{i+1,s\oplus 2^{h-1} | g_h}\),其中 \(g_h\) 表示所有限制为 \(h\) 的位置状态。
20.ARC179B
考虑设 \(f_{i,j,k,l}\) 其中 \(j,k,l\in\{0,1\}\) 表示前 \(i\) 位拼出有这仨倍数的状态的最小操作次数。
转移我说不清了,你自己看吧。反正我没绷住。

21.ARC175B
先把 \(n\) 变成 \(2n\),不然说着不方便。
考虑把操作放到前缀和上,发现就是区间加 \(\pm 2\) 和后缀加 \(\pm 2\)。
考虑先让 \(sum_n\) 通过后缀加减变成 \(0\),因为区间加减是左闭右开的,\(sum_n\) 吃不到。
然后我们看这个东西对全局有没有积极影响,如果她加的是正数,那我们让她加给全局;如果她加的是负数,那位们只让她自己减。
接下来找到前缀和序列里的最小值 \(mn\),我们假设总能找到一个包含 \(mn\) 的区间让她全吃到加 \(2\),那我们就疯狂操作就好了。
接下来我们来证这个事情。
假设 \(mn\le-2\),我们找 \(l,r\) 分别表示第一个、最后一个 \(sum\le mn+1\) 的位置。
由于 \(l\) 是第一次掉到 \(mn+1\),所以 \(sum_{l-1} = mn+2\),所以第 \(l\) 个字符为 );同理 \(sum_{r+1} = mn+2\),第 \(r+1\) 个字符为 (。
因此这就是我们要找的区间,随着不断加,区间也会不断变小,最终变成滚木。
因此这种区间必然存在,得证。
所以算一下贡献就好了,别忘记区间操作等价于两次后缀操作,需要取个 \(\min\)。
22.ARC180B
考虑从大值往小做,每次只找前边能操作的做操作,这样能保证前边不管咋做不影响一会到下一个人的她的位置。
我们拿到前边能操作的数,按从小到大地和当前位做交换,这样满足所有条件,但是是最优吗?
你交换一次会让逆序对数至少减 \(1\),你肯定想让他们每次都只减少 \(1\)。
显然从小到大做,每个前边的值都不会被卡住,这样保证了每个合法的对都吃到了贡献。
这样同样也不会让后边的贡献减少,因为你找的 \(l,r\) 同样是从大到小枚举的,且 \(l,r\) 都比当前枚举这位大,因此不会影响后边遍历到更小的 \(r\)。

浙公网安备 33010602011771号