Solution Set - 加训 CF!

加训一些 CF 题,这里写一些简要题解,可能是草稿。暂定只做 Div.1 的题。斜体的标题表示太菜了不会做。

CF1967


CF1967A

\(a_i\) 张写有 \(i\) 的卡片和 \(k\) 张空卡片,可以在每张空卡片上写 \(1\cdots n\) 的数字,然后把所有卡片排成一列。问最后的排列中最多有多少个子区间是 \(1,2,\cdots,n\) 的排列。\(n\le 2\cdot 10^5\)


设有 \(x\) 种卡片的出现次数最少,次数为 \(y\),则最大值是 \(ny-x+1\)。显然策略应该是每次写下一种当前最少的数。二分最后的最小值即可。

AC link.


CF1967B1

给定 \(n,m\),求有多少对 \(1\le a\le n,1\le b \le m\),满足 \(a+b\mid b\cdot \gcd(a,b)\)\(n,m\le 2\cdot 10^6\)


\(\gcd(a,b)=d,a=dx,b=dy\),则 \(dy\mid x+y\)\(y\mid x\),而 \((x,y)=1\),所以 \(y=1\),也就有 \(b\mid a\)。进一步,\(a\equiv -b\pmod {b^2}\)。于是直接枚举 \(b\) 计算即可。

AC link.


CF1967B2

给定 \(n,m\),求有多少对 \(1\le a\le n,1\le b \le m\),满足 \(b\cdot \gcd(a,b) \mid a+b\)\(n,m\le 2\cdot 10^6\)


\(\gcd(a,b)=d,a=dx,b=dy\),则 \(x+y\mid dy\)。约掉右边的 \(y\),可以发现 \(x+y\mid d\),则 \(x,y\le x+y\le d\)。那么 \(x\le \sqrt n,y\le \sqrt m\)。直接枚举 \(x,y\),根据 \(d\) 的范围计算即可。复杂度就是 \(O(\sqrt {nm})\)

AC link.


CF1967C

将一个数组变成它求树状数组 \(\bmod 998244353\) 之后的结果,称为一次变换。给定一个长为 \(n\) 的数组进行 \(k\) 次变换之后的结果,构造原数组。\(n\le 2\cdot 10^5\)


考虑初始数组中的第 \(i\) 个数对各个位置的贡献,会发现贡献到 \(i\to i+\text{lowbit}(i)\to \cdots\) 这样一条链上,每次可以沿着这条链走任意多步。那么贡献到走 \(m\) 步之后的方案数等价于 \(k\) 个非负整数和为 \(m\) 的方案数,也就是 \(C_{m+k-1}^{m}\)。那么直接枚举点对点的贡献即可,预处理组合数后,复杂度是 \(O(n\log n)\) 的。

AC link.


CF1967D

给定一个 \([1,m]\) 内长为 \(n\) 的数列 \(a\),和一个 \([1,m]\) 内长为 \(m\) 的序列 \(b\)。每次可以选择一个集合 \(S\),然后对所有 \(i\in S\),将 \(a_i\) 变为 \(b_{a_i}\)。求至少要多少次操作才能使序列 \(a\) 单调不减,或报告无解。\(n,m\le 10^6\)


显然 \(i\to b_i\) 构成一个内向树森林,问题可以重新叙述为:每个数 \(a_i\) 可以在这个森林上走若干步,求使得 \(a\) 单调不减时,操作次数最大值的最小值。考虑二分答案,维护一个指针表示上一个数的最小值,不断尝试增加,那问题就转化为判断从 \(u\)\(x\) 步是否会经过 \(v\)。这只要对基环树做一些基本的处理就可以了。

AC link.

CF1967E1,E2

给定 \(n,m,b_0\),考虑所有在 \([1,m]\) 内,长为 \(n\) 的序列 \(a_1,\cdots,a_n\),求有多少个这样的序列 \(a\),使得存在一个非负整数序列 \(b\),使得对 \(1\le i\le n\),有 \(b_i\neq a_i,|b_i-b_{i-1}|=1\)。E1 \(n,m,k\le 2\cdot 10^5\),E2 \(\sum n,\sum m,\sum k\le 10^7\)

考虑固定的 \(a\) 如何构造 \(b\)。显然的贪心策略是让每个 \(b\) 都尽可能的大。那么就可以设 \(dp_{i,j}\) 表示按照上述方法构造出的 \(b_i=j\) 的方案数。转移是 \(dp_{i-1,j}\to dp_{i,j-1},(m-1)dp_{i-1,j}\to dp_{i,j+1}\),答案是 \(\sum_{i=1}^{n}dp_{i,m}m^{n-i}+\sum_{j=0}^{m}dp_{n,j}\)。这样暴力的复杂度是 \(O(nm)\) 的。

这个 DP 是格路计数的形式。观察一下模型,要从 \((0,b_0)\) 开始走,每次往右上方走一步或者往右下方走一步,求(除端点)不经过 \(y=-1\)\(y=m\) 到达 \((\le n,m)\)\((n,\lt m)\) 的方案数。那么这就是一个反射容斥的模型,可以旋转 \(45\degree\) 后平移转化为反射容斥的模板。我们总共有 \(n+m\)\(\le n\) 步的反射容斥,复杂度就是 \(O(\frac{n^2}{m}+m)\)。可以结合前面的暴力进行根号分治,通过 E1。

继续优化这个容斥。用 \(X\) 表示碰到直线 \(y=m\)\(Y\) 表示碰到直线 \(y=-1\),需要统计的就是碰撞序列为空或者以 \(X\) 开头的路径。考虑路径终点在 \((n,x)\) 的方案,如果不考虑其他限制,路径数目是 \(C_{n}^{(x-b+n)/2}\)。然后反射容斥,注意 \(x\ge 0\)\(x\lt 0\) 的容斥是不同的, 前者可以写成 \(f(\empty)-f(Y)+f(XY)-f(YXY)+\cdots\),后者则写成 \(f(X)-f(YX)+f(XYX)-\cdots\)

我们将 \(\ge 0\) 的点和 \(\lt 0\) 的点分别放在一起容斥,会发现每次对称后都是一段连续的 \(C_{n}^{k}\),所以用差分统计每个 \(C_{n}^{k}\) 的系数 \(c_k\) 即可。这里的修改是对某个区间 \([l,r]\),给 \(c_i\) 增加 \((m-1)^{i+d}\) ,因为要考虑往右上走一步的系数是 \(m-1\),而在反射过程中系数是不变的。考虑差分 \(c_i-(m-1)c_{i-1}\) ,然后就做到线性了,最终通过 E2。

代码参考了官方题解。

AC link


F 题就不做了。


全局总评:这场是打了的。题目还不错,A,B1,B2,C 是简单题,同时能看出一定层次;D 做法好像平凡但其实没有那么好想;E 是相当有趣的题目。


CF1965


CF1965A

\(n\) 堆石子,每次选择一个不超过最小非空堆大小的正整数 \(k\),从每一堆中移走 \(k\) 个石子。变成博弈,两个人轮流操作,不能操作者(面对 \(n\) 个空堆)判负。问谁有必胜策略。\(n\le 2\cdot 10^5\)


首先相同大小的堆是没有用的。只有一个堆是必败态;两个堆时,较小的一个大小为 \(1\) 是必败态,\(\gt 1\) 是必胜态;三个堆 \(x\lt y\lt z\) 时,如果 \(y-x=1\),那么是必胜态;否则,如果 \(x=1\),是必败态;如果 \(x\gt 1\),是必胜态。不妨模拟,如果最小堆大小为 \(1\) 就不断操作下去,如果不为 \(1\) 或只有一堆就必胜。

AC link


CF1965B

构造一个长度不超过 \(25\) 的非负整数序列 \(a\),使得 \(a\) 没有子序列和为 \(k\),且有子序列和为 \(v,\forall v\le n,v\neq k\)

可以证明一定有解。\(n\le 10^6\)


扣掉 \(k\) 的最高二进制位 \(2^b\),给出其它位,那就只差所有含有这个位的数需要被构造。给出 \(k-2^b\),满足了这个位上不超过 \(k\) 的部分。给出 \(k+1\),满足了这个位上超过 \(k\) 的部分。给出 \(k+2^{b}+1\),满足了这个位上等于 \(k\) 的部分。

AC link


CF1965C

给定一个 \(01\) 串,将它的每一位依次写在一个纸带上。可以在任意位置翻折。一组翻折是合法的,如果同一个位置的字符相同,注意只在完成翻折之后检查。求最小长度。\(n\le 2\cdot 10^5\)


刻画最终的纸带:假装有一个光标,扫描整个序列,遇到一个字符可以左移光标或者右移光标。如果经过的位置已经存在字符,则两个字符需要相等;如果经过的位置不存在字符,则添加这个字符。

最终的序列一定是 \(01\) 交替。那么直接贪心就可以了。

AC link


CF1965D

给定一个大小为 \(\frac{n(n+1)}{2}-1\) 的可重集,请求出一个回文序列,使得它的所有区间和构成的可重集包含给定集合。保证有解。\(3\le n\le 1000\)


考虑回文串中那些独特的和,也就是那些关于中心对称的区间。这些区间的和是互不相同(严格递增)的,于是只有这 \(k=[\frac{n+1}{2}]\) 个和出现奇数次,其余和都出现偶数次。用 map 找出给定集合中的所有出现奇数次的和,这种和的数目是 \(k-1\)\(k+1\)

如果是 \(k-1\),先按照这些和构造出长度为 \(n-2\) 的序列,然后要把某个数拆成两个,或者在两端再增加一个数。把当前所有区间和从 map 中减去,找到剩下来的最大值,这个最大值一定是一个后半段的前缀和,暴力找到它应该在的位置即可。

如果是 \(k+1\),先尝试按照这些和构造出长度为 \(n+2\) 的序列,可能因为奇偶性而不成功。如果不成功,只有唯一一个数奇偶性不同,直接把它删掉。如果成功了,要合并某两个相邻的数。同样的把当前所有区间和从 map 中减去,会多减掉一些,同样找到多减掉的最大的区间和,一定是一个后半段的前缀和。找到它的位置,把这个数删掉就可以了。

AC link


CF1965E

\(n\times m\) 个单位立方体落在空间内 \((1,1,1)\)\((n,m,1)\) 的范围内,每个单位立方体染了 \(k\) 中颜色之一。现在要在空间内再放置一些单位立方体,满足每个立方体的三维坐标都是不超过 \(10^6\) 的正整数,使得同种立方体构成一个连通块。构造一种使用不超过 \(4\cdot 10^5\) 个立方体的方案,或判断无解。\(n,m,k\le 50\)


人类智慧题。考虑先把立方体分开一些,那么就往上拉,让每两行之间空出一行。接着在各个高度的空行放上不同的颜色,就连通了所有颜色。当然这只是简要思路。估计没几个人看得懂吧。

AC link


CF1965F

现在要举办一场会议,会议的每一天需要有一位学者作报告,且一位学者不能报告两次。有 \(n\) 位学者,第 \(i\) 位学者只能在第 \(l_i\)\(r_i\) 天作报告。如果连续的若干天中每一天都能有学者作报告,那么就可以在这些日子举办会议。对 \(k=1,2,\cdots,n\),求有多少种选择 \(k\) 天举办会议的方案。\(n,l_i,r_i\le 2\cdot 10^5\)


对于固定的一段时间,判定问题可以看作是二分图匹配,每个学者和每一天分别看作左部和右部的点,学者向它能作报告的天连边。一段时间合法当且仅当取出对应的右部点和所有左部点时,最大匹配是右部的完美匹配。

可以使用 Hall 定理检查。需要满足,对任何 \(x\) 个右部点,与它们中至少一个相邻的左部点都有 \(\ge x\) 个。应该如何取这 \(x\) 个右部点?只考虑连续区间大概是不对的。举例而言,\(3/1~3/2~2/2~2\) 是一个 hack,考虑 \(1,3\) 两个右部点会发现不合法,但是连续区间都是合法的。

考虑打补丁。假设左部两个学者对应的左端点是一样的,设它们的区间分别为 \([a,b],[a,c],b\le c\)。此时,如果将 \([a,c]\) 换成 \([a+1,c]\),答案不会变化。可以这样理解:检查一段时间除了最大匹配,也可以直接贪心,从左到右考虑每一天,给每一天选择可选的中右端点最小的一个。那么 \([a,b],[a,c]\) 会在第 \(a\) 天同时加入,一定先选择 \([a,b]\),就可以把 \([a,c]\) 放到下一天再加入。

这样优化之后,所有区间的左端点就互不相同了。那么它有什么用?回到 Hall 定理,此时我们可以证明只考虑连续区间即可。假设有一个集合 \(T\) 不合法且不连续,我们把中间缺失的部分都补上,仍然是不合法的。只考虑一个局部,如果原来 \(T\) 中连续两个元素是 \(x,y\),把 \(x+1\cdots y-1\) 补上,新产生的相邻点只能是 \([x+1,y-1]\) 的子区间,而每个左端点只有一个区间,所以增加的邻点数目不超过增加的点数。

还可以再简单一些!我们把前面的优化倒过来再做一次,所有区间的右端点也互不相同了。此时,用 Hall 定理的判定只需要检查整个时间区间。因为如果一个连续区间不合法,把区间的右端点或左端点扩展 \(1\),同样只会增加一个区间。优化可以用一个堆完成,最后再用一个双指针计算就可以了。复杂度 \(O(n\log n)\)

AC link.


全局简评:B,D,E 都是构造题,其中 B,E 是人类智慧,D 是细节分析。A,C 是比较平凡的简单题。F 是真正的好题。


CF1943

CF1943A

给定一个长为 \(n\) 的序列 \(a\)。Alice 和 Bob 进行博弈,他们初始有一个空序列 \(c\),Alice 每次操作选一个 \(a\) 中元素加入 \(c\) 并从 \(a\) 中删掉它,Bob 每次操作选一个 \(a\) 中元素从 \(a\) 中删掉。Alice 先手。Alice 的目标是最大化 \(\text{mex}(c)\),Bob 的目标则是将其最小化。假设两人都足够聪明,求最终的 \(\text{mex}\)\(n\le 2\cdot 10^5\)


简单的观察:如果 \(x\) 不出现,则答案不超过 \(x\);如果 \(x\lt y\) 都只出现一次,则答案不超过 \(y\)

假设 \(0,1,\cdots,y-1\) 中只有 \(x\) 的出现次数为 \(1\),其余都至少为 \(2\),那么 Alice 先手取到 \(x\),此后如果 Bob 取到 \(\lt y\) 的某个数,Alice 就可以取另一个这个数。这样 \(\text{mex}(c)\) 至少就是 \(y\)。所以上述两条的较小值就是答案。

AC link


CF1943B

一个字符串 \(t\) 被称为\(k-\)好,如果它存在至少一个长为 \(k\) 的子串不是回文串。设 \(f(t)\) 表示使得 \(t\)\(k-\)好的 \(k\) 的总和。给定长为 \(n\) 的字符串 \(s\)\(q\) 次询问 \(l,r\),求 \(f(s_l\cdots s_r)\)\(n,q\le 2\cdot 10^5\)


注意到\(k-\)好这个条件是非常弱的,或者说不是\(k-\)好这个条件非常强。假设 \(t\) 不是 \(k-\)好的。先考虑 \(k=t-1\),手玩一下会得到:\(k\) 为奇数时,所有奇偶性相同的位置都相同;\(k\) 为偶数时,所有位置都相同。所以当且仅当 \(t\) 是全相同时,偶数 \(k\) 不是\(k-\)好;当且仅当 \(t\) 不是两种字符交替时,奇数 \(k\gt 1\) 不是\(k-\)好。注意 \(k=1\)\(k=|t|\) 要特判。然后就随便做了。

AC link.


CF1943C

给定一棵 \(n\) 个点的树,初始所有点均为白色。每一次操作可以选择一个点 \(v\) 和一个数 \(d\in[0,n-1]\),把所有距离 \(v\) 等于 \(d\) 的点 \(u\) 染为黑色。构造一种方案,用最小次数的操作将所有点染黑。\(n\le 2\cdot 10^3\)


考虑一条长为 \(m\) 的链应该怎么做。观察所有奇数位置的点和所有偶数位置的点,每一次操作最多将两个奇偶性相同的点染为黑色。所以 \(m=2k+1\) 时需要 \(k+1\) 步,\(m=4k\) 时需要 \(2k\) 步,\(m=4k+2\) 时需要 \(2k+2\) 步。让所有操作都在链的中点或中间两个点上进行,然后直接拍到直径上就可以了。

AC link.


CF1943D1,D2

一个长为 \(m\) 的非负整数数列被称为好的,当且仅当 \(b\) 可以通过有限次下述操作变成全为 \(0\):选择两个下标 \(l,r(1\le l\lt r\le m)\),对所有满足 \(l\le i\le r\)\(i\),将 \(b_i\) 减掉 \(1\)。给定 \(n,k\) 和质数 \(p\),求 \((k+1)^n\)\([0,k]\) 内长为 \(n\) 的数列有多少个是好的。答案对 \(p\) 取模。D1 \(k\le n\le 400\),D2 \(k\le n\le 3000\)


当然考虑如何刻画“好的”数列。显然如果有 \(a_i\gt a_{i-1}+a_{i+1}\) 则不合法。这个条件是否充要呢?归纳易证是的。

那有一个暴力的 DP:\(dp_{i,j,k}\) 表示 \(a_i=j,a_{i-1}=k\) 的方案数。转移是 \(dp_{i-1,k,\ge k-j}\to dp_{i,j,k}\)。前缀和优化一下可以做到 \(O(n^3)\)

如何优化?考虑容斥。如果位置 \(i_1,i_2,\cdots,i_s\) 不合法,也就是 \(a_{i_j}\gt a_{i_j-1}+a_{i_j+1}\)。那么不会有连续两个位置同时不合法。可以分成各个连续段考虑。如果 \(2,4,\cdots,2s\) 不合法,那么 \(2s+1\) 个项有多少个取法?可以直接 DP,\(f_{i,j}\) 表示 \(2i-1\) 这个位置取 \(j\) 的方案数。转移是 \((k-x-y)f_{i,x}\to f_{i+1,y}\),要求 \(x\lt k-y\)。那么计算一下 \(xf_{i,x}\) 的前缀和与 \(f_{i,x}\) 的前缀和即可。

这样之后,设 \(dp_{i}\) 表示考虑前 \(i\) 项,第 \(i\) 项不合法的容斥系数。转移就是枚举连续段,设当前连续段为 \([j,i]\),那么 \(j-1,j-2\) 都合法,于是有 \((\sum f_{(i-j)/2,x})k^{j-s-3}dp_{s\le j-3}\to dp_{i}\)。注意端点情况需要特判一下。同样用前缀和优化,然后就 \(O(n^2)\) 了。

AC link.


CF1943E1,E2

给定一个长为 \(n\) 的序列 \(a\)。Alice 和 Bob 博弈,他们初始有一个空序列 \(c\),Alice 每次操作选择一个 \(a\) 中的元素加入 \(c\) 中并从 \(a\) 中将其删去,Bob 每次操作选择至多 \(k\)\(a\) 中元素删去。Alice 先手。Alice 的目标是最大化 \(\text{mex}(c)\),Bob 则是将其最小化。假设两人都足够聪明,求最终的 \(\text{mex}(c)\)

序列用 \(m+1\) 个正整数 \(f_0,f_1,\cdots,f_m\) 给出,表示有 \(f_i\)\(i\)

E1 \(m\le 50,\sum m\le 1000\),E2 \(m,\sum m\le 2\cdot 10^5\)\(k,f_i\le 10^9\)


考虑是否有 \(ans\ge i\)。Alice 的策略是选择 \(\lt i\) 的,还未选择的数中,出现次数最小的一个。那么将所有 \(f_{j\lt i}\) 从小到大排序。

注意到 Bob 没有必要改变 \(f\) 的顺序:将每次删 \(k\) 个变为 \(k\) 次删 \(1\) 个,那么仅当 \(f_x=f_y\) 时选择靠后的一个会改变顺序,但是可以选择靠前的一个。

如果 Bob 获胜,枚举 Alice 取不到的元素。Bob 的策略就是在不改变顺序的前提下尽可能地减少这个元素的次数。二分答案,然后直接模拟这个过程,复杂度大概是 \(O(m^3\log m)\),可以通过 E1。

考虑如何优化这个过程。观察到,如果 Bob 为了保证顺序不变而减少 Alice 下一步删除的数,就说明剩下的数都几乎相等了(差不超过 \(1\))。这个时候可以计算出一个 Bob 能赢的总和上界。而此前的部分双方互不影响,是容易计算的。

具体的,假设 \(f\) 排序之后得到 \(a_1,a_2,\cdots,a_n\),并且 Bob 选定 \(a_n\)。我们要找到最大的 \(i\),使得 Alice 删除 \(a_1,a_2,\cdots,a_i\) 的时候,它们都没有被减少过,也就是说 \(\sum_{j=i+1}^{n}(a_j-a_i)\ge (i-1)k\)\(i\) 对这个条件显然是具有两段性的。相应地有 \(\sum_{j=i+2}^{n}(a_j-a_{i+1})\lt ik\),也就是删除 \(i+1\) 之前已经减少到了所有数差不超过 \(1\),就可以用预处理的结果 \(O(1)\) 判断了。实际上因为要考虑多个 \(n\)\(i\) 是可以双指针求的。

预处理的部分,就是假设 \(\sum_{i=1}^{n} a_{i}=s\)\(a_i\) 的极差不超过 \(1\),求 Bob 能够在 \(a_n\) 上获胜的最小的 \(s\)。其实就很简单,可以递归计算,设 \(s(n-1)=q(n-1)+r\),那么第一步被删除的大小就是 \(q\),于是 \(s(n)=qn+r+k\)。初始值是 \(s(2)=2k\)。这样之后复杂度被优化到 \(O(m\log^2 m)\),瓶颈在二分后的排序,足以通过 E2。E2 比 E1 还好写

AC link


F 太抽象了,看不懂。


全局简评:ABC三个简单题好像不太对,缺乏层次感。D是 classical 的 DP。E 是非常好的博弈题,难度不算太高。F 有点牛了。


CF1936

CF1936A

交互题。交互库有一个 \(0,1,\cdots,n-1\) 的排列 \(p_0,\cdots, p_{n-1}\)。可以做的询问是给出四个下标 \(a,b,c,d\),交互库返回 \(p_a\mid p_b\)\(p_c\mid p_d\) (按位或)的大小关系。请用不超过 \(3n\) 次询问找到两个下标 \(i,j\) 使得 \(p_i\oplus p_j\) 最大(按位异或)。\(n\le 10^4\),交互库不是自适应的。


\(\ge n\) 的最小 \(2\) 的幂是 \(2^m\),则最大值当然就是 \(2^m-1\)

首先 \(n-1\) 次操作找到 \(p_i=n-1\)。然后来找 \(2^m-n\)

那么找到所有 \(p_j\mid p_i\) 是最大值的 \(j\),再在这些 \(p_j\) 里面找到最小值。\(3n\) 次足矣。

AC link


CF1936B

一排 \(n\) 个格子,第 \(i\) 个格子写有 >< 之一的字符 \(s_i\)。一个小球在某个格子中。如果小球所在的格子写有 <,那么它花费一秒移动到左边的相邻格子,否则移动到右边。移动之后这个格子的字符翻转。对 \(i=1,2,\cdots,n\),求初始在第 \(i\) 个格子的小球需要多少时间离开这一排格子。\(n\le 5\cdot 10^5\)


如果位置 \(i\) 初始是 <,设 \(i\) 左边的 > 从右到左下标依次是 \(a_1,\cdots,a_s\),右边的 < 从左到右依次是 \(b_1,\cdots,b_t\)

  • 如果 \(s\le t\),那么球从左边跑出去,时间是 \((i-a_1)+(b_1-a_1)+(b_1-a_2)+\cdots +(b_s-a_s)+b_s\),化简一下就是 \(2\sum_{i=1}^{s}b_i-2\sum_{i=1}^{s}a_i+i\)
  • 如果 \(s\gt t\),那么球从右边跑出去,时间是 \((i-a_1)+(b_1-a_1)+\cdots +(b_t-a_{t+1})+(n-a_{t+1})\),化简后是 \(2\sum_{i=1}^{t}b_i-2\sum_{i=1}^{t+1}a_i+n+i\)

初始是 > 的部分 reverse 一下就可以了。那么只用开两棵线段树维护一下这两个东西就可以了。

AC link.


CF1936C

\(n\) 只神奇宝贝,每只神奇宝贝有 \(m\) 个属性,第 \(i\) 只的第 \(j\) 个属性记为 \(a_{i,j}\)。现在有一个决斗场,初始时第 \(1\) 只神奇宝贝在场上。你可以以任意顺序做任意次如下两种操作之一:

  • 选择 \(i\in[1,n],j\in[1,m],k\gt 0\),将 \(a_{i,j}\) 增加 \(k\),代价为 \(k\)
  • 选择 \(i\in[1,n],j\in[1,m]\),让第 \(i\) 只神奇宝贝以第 \(j\) 种属性与当前场上的神奇宝贝决斗。该属性数值更大的一方将胜出,胜者留在场上。该操作的代价为 \(c_i\)

求让第 \(n\) 只神奇宝贝(作为胜者)留在场上的最小代价。\(2\le n,\sum nm\le 4\cdot 10^5,1\le a_{i,j},c_i\le 10^9\)


显然每一次决斗都会把一只新的神奇宝贝推上场。设推上场的编号依次是 \(b_0=1,b_1,\cdots,b_t=n\),那么在决斗之前,我们会让下一只的某个属性增加一些以使它获胜。这个增加量当然就是 \(\max(0,\min(a_{b_{i-1},j}-a_{b_i,j}))\)。然后就可以以此建图跑最短路,\(u\)\(v\) 连边权为 \(c_v+\max(0,\min(a_{u,j}-a_{v,j}))\) 的边。这样直接做,复杂度是 \(O(n^2\log n)\) 的。

考虑拆点,点 \(u\) 拆成 \(m\) 个点 \((u,j)\)。从 \((u,j)\)\((v,j)\) 连边,边权为 \(\max(0,a_{u,j}-a_{v,j})\)。再放一个中转点 \(u\),从 \((u,j)\)\(u\) 连边 \(0\),从 \(u\)\((u,j)\) 连边 \(c_u\)。上面的连边就只需要在排序后相邻的 \(a_{u,j}\)\(a_{v,j}\) 之间连边了。复杂度 \(O(nm\log (nm))\)。图的点数是 \(n(m+1)\),边数是 \(2(n-1)m+2nm\)

AC link。怎么难度 A>B>C 的啊。


CF1936D

给定两个长为 \(n\) 的序列 \(a,b\) 和一个固定的整数 \(v\)。一个区间被称为好的,当 \(b_l\mid b_{l+1}\mid\cdots\mid b_r\ge v\)(按位或)。这个区间的价值是 \(\max(a_l,a_{l+1},\cdots,a_{r})\)。现有 \(q\) 次以下两类操作之一:

  • 给定 \(i,x\),将 \(b_i\) 修改为 \(x\)
  • 给定 \(l,r\),求 \([l,r]\) 好的子区间中的最小价值。如果不存在输出 \(-1\)

\(n,q\le 2\cdot 10^5\)\(a_i,b_i,v\le 10^9\)


直接上线段树。对每个区间,除了记录其好的子区间的最小价值,还要记录前缀按位或和后缀或的情况。这里总共只有 \(O(\log V)\) 种情况,所以暴力记录就可以了。merge 的部分是容易的。复杂度是两只 \(\log\)

[AC link](Submission #261989366 - Codeforces).


posted @ 2024-04-29 15:47  by_chance  阅读(32)  评论(0编辑  收藏  举报