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\)。显然策略应该是每次写下一种当前最少的数。二分最后的最小值即可。
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\) 计算即可。
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})\)。
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)\) 的。
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\)。这只要对基环树做一些基本的处理就可以了。
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。
代码参考了官方题解。
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\) 或只有一堆就必胜。
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\) 的部分。
CF1965C
给定一个 \(01\) 串,将它的每一位依次写在一个纸带上。可以在任意位置翻折。一组翻折是合法的,如果同一个位置的字符相同,注意只在完成翻折之后检查。求最小长度。\(n\le 2\cdot 10^5\)。
刻画最终的纸带:假装有一个光标,扫描整个序列,遇到一个字符可以左移光标或者右移光标。如果经过的位置已经存在字符,则两个字符需要相等;如果经过的位置不存在字符,则添加这个字符。
最终的序列一定是 \(01\) 交替。那么直接贪心就可以了。
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
中减去,会多减掉一些,同样找到多减掉的最大的区间和,一定是一个后半段的前缀和。找到它的位置,把这个数删掉就可以了。
CF1965E
有 \(n\times m\) 个单位立方体落在空间内 \((1,1,1)\) 到 \((n,m,1)\) 的范围内,每个单位立方体染了 \(k\) 中颜色之一。现在要在空间内再放置一些单位立方体,满足每个立方体的三维坐标都是不超过 \(10^6\) 的正整数,使得同种立方体构成一个连通块。构造一种使用不超过 \(4\cdot 10^5\) 个立方体的方案,或判断无解。\(n,m,k\le 50\)。
人类智慧题。考虑先把立方体分开一些,那么就往上拉,让每两行之间空出一行。接着在各个高度的空行放上不同的颜色,就连通了所有颜色。当然这只是简要思路。估计没几个人看得懂吧。
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)\)。
全局简评: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\)。所以上述两条的较小值就是答案。
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|\) 要特判。然后就随便做了。
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\) 步。让所有操作都在链的中点或中间两个点上进行,然后直接拍到直径上就可以了。
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)\) 了。
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 还好写
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\) 次足矣。
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 一下就可以了。那么只用开两棵线段树维护一下这两个东西就可以了。
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).
CF1936E
给定一个长为 \(n\) 的排列 \(p\),计数满足下面条件的,长为 \(n\) 的排列 \(q\):对任何 \(1\le i\lt n\),\(\max(q_1,q_2,\cdots,q_i)\neq \max(p_1,p_2,\cdots,p_i)\)。答案对 \(998244353\) 取模。\(n\le 2\cdot 10^5\)。
\(dp_{i,j}\) 表示已经确定前 \(i\) 位,当前的最大值为 \(j\)。
\(dp_{i,j}\to dp_{i+1,k},k\ge j\);\((j-i)dp_{i,j}\to dp_{i+1,j}\)。和 \(\max p_{1\cdots i}\) 相等的位置不转移。这样轻松做到 \(O(n^2)\)。
但是这个东西看起来很没有前途。
考虑容斥。\(dp_i\) 表示前 \(i-1\) 个前缀最大值都不同,第 \(i\) 个前缀最大值相同的方案数。
设 \(\max_{j=1}^{i}p_j=s_i\)。总数是 \(C_{s_i-1}^{i-1}\cdot i!=\frac{i\cdot (s_i-1)!}{(s_i-i)!}\)。容斥掉第一次相同在 \(j\) 出现的方案数。如果 \(s_j=s_i\),则这 \(i-j\) 个位置有 \(\frac{(s_i-j)!}{(s_i-i)!}\) 种方案,否则有 \(C_{s_i-j-1}^{i-j-1}\cdot (i-j)!=\frac{(i-j)(s_i-j-1)!}{(s_i-i)!}\) 种。这样也是 \(O(n^2)\)。
设 \(p_i\) 表示最小的 \(j\),使得 \(s_j=s_i\)。 经过一些转化得到
\(dp_i=\frac{i\cdot (s_i-1)!}{(s_i-i)!}-\sum_{j=1}^{i-1}(\frac{(s_i-j)!}{(s_i-i)!}-\frac{(s_i-j-1)!}{(s_i-i-1)!})dp_j-\sum_{j=p_i}^{i-1}\frac{(s_j-j-1)!}{(s_i-i-1)!}dp_j\)
第一项不用管,最后一项可以简单前缀和优化,中间的项用分治 NTT 解决。复杂度两只 $\log $。
F 怎么是计算几何啊?难过。
全局简评:感觉难度 D>A>E>B>C,但是 D 可能又是我蠢了。太抽象了。题目都比较平凡吧。
CF1924
CF1924A
给定一个字符串 \(s\) 和两个整数 \(n,k\)。判断是否所有由前 \(k\) 个小写字母构成的,长为 \(n\) 的字符串都是 \(s\) 的某个子序列。如果不是,找到一个不满足条件的字符串。\(1\le n,k\le 26,|s|\le 10^3,\sum m,\sum n\le 10^6\)。
贪心地找:第一次出现最晚的字符;在此之后第一次出现最晚的字符;以此类推。如果能找到的长度 \(\ge n\) 那么就满足条件,否则不满足。
CF1924B
一个序列上有 \(n\) 个点,点 \(x_i\) 上放置着 \(v_i\) 这个数。位置 \(p\) 的权值是 \(p\) 左边(含)第一个数乘以 \(p\) 到右边(含)第一个数的距离,也就是说放有数的位置权值是 \(0\)。现在有 \(q\) 次两类操作之一,或者在某个还没有放置数的位置放一个数,或者询问一段区间的权值之和。\(n,q\le 3\cdot 10^5,1\le x_i\le n,1\le v_i\le 10^7\)。保证初始时在 \(1,n\) 位置有数。
用一个 set 维护所有数,用一个线段树维护每个数右边的部分的和。剩下的操作都是 trivial 的。
CF1924C
一张正方形的纸,每一次操作把四个角折到中心点,得到一个新的正方形。进行 \(n\) 次操作后展开,求凸出来的折痕长度之和与凹进去的折痕长度之和的比值。答案可以表示成 \(A+B\sqrt 2,A,B\in \Q\),输出 \(B\) 对 \(999999893\) 取模的结果。\(n\le 10^9\)。
设 \(n\) 次操作,凹进去的长度和为 \(p_n\),凸出来的长度和为 \(q_n\)。列出递推式:
然后直接算就完了。
神秘的模数原来是为了保证分母一定有逆元吗,他温我哭。
CF1924D
求有多少个由 \(n\) 个左括号,\(m\) 个右括号组成的序列,其最长的合法括号子序列长度恰为 \(2k\)。答案对 \(10^9+7\) 取模。\(n,m,k\le 2000,T\le 3000\)。
一个合法的括号序列可以分成若干段,每一段也都是合法的括号序列
这些段之间构成若干个缝隙,这些缝隙内就可以插入剩下的括号,必须先插左括号再插右括号
设分为 \(j\) 段,长为 \(2i\) 的合法括号序列有 \(f_{i,j}\) 个,有 \(O(n^3)\) 的简单递推
\(f_{i,j}=\sum_{t=j-1}^{i-1}f_{t,j-1}f_{i-t,1},f_{i,1}=\frac{(2i-2)!}{i!(i-1)!}\)
发现 \(f_{i,j}=f_{i+1,j+1}-f_{i+1,j+2}\),然后就 \(O(n^2)\) 了。可以找到组合意义。
单次询问是 \(O(n)\) 的,设 \(n_1=n-k,m_1=m-k\),则答案是 \(\sum_{i=1}^{k}f_{k,i}C_{i+n_1+m_1}^{n_1+m_1-1}\)。
CF1924E
初始有一张 \(n\times m\) 的网格纸。每一次等概率选择一条平行于边界的格线,将纸片剪开,然后留下左下方的一片。求使得留下纸片的面积严格小于 \(k\) 的期望操作次数。答案对 \(10^9+7\) 取模。
\(1\le \sum n,\sum m\le 10^6,2\le k\le 10^{12},T\le 57000\)。
根据期望的线性性,只用计算每条直线被选择的概率。考虑所有网格线的一个排列表示顺序,那么 \(x=i\) 被选择但不是最后一个被选,当且仅当 \(x=1,2,\cdots,i-1\) 和 \(y=1,2,\cdots,\lfloor\frac{k-1}{i}\rfloor\) 都在这条直线后面。特别地,如果要求所有 \(y\) 都在它后面,那么可以确定如果选择了这条线,就一定是最后一条,所以跳过。预处理逆元之后 \(O(n+m)\)。
CF1924F
交互题。一个长为 \(n\) 的序列,\(n-1\) 个位置为 \(1\),剩下一个位置为 \(0\)。每次可以询问一个区间 \([l,r]\),交互库会返回 \(r-l\) 或 \(r-l+1\) 之一。保证交互库不会连续三次返回询问区间的和,或者连续三次不返回询问区间的和。请使用不超过 \(\lceil\log_{1.116}n\rceil-1\) 次询问,给出一个大小不超过 \(2\) 的集合,其中包含了 \(0\) 的位置。
\(T\le 2048,n\le 10^5\)。交互库是自适应的。
考虑把整个序列分为三块 \(A,B,C\)。按照如下操作询问:
- 询问 \(A\cup B\),询问 \(A\)。
- 如果前两次询问回答相同,询问 \(A\cup B\cup C\),可以直接确定 \(A\) 和 \(C\) 之一是没有 \(0\) 的。
- 如果前两次询问回答不同,再询问 \(A\cup B\)。如果和第一次回答相同,那么可以确定 \(B\) 是没有 \(0\) 的。
- 如果第三次和第一次回答不同,再询问 \(A\cup B\cup C\),可以确定 \(A\) 和 \(C\) 之一是没有 \(0\) 的。
回答指的是 \(0\) 是否在区间内。这样就用 \(\le 4\) 次操作把三块分成了两块。
然后考虑一个合适的分比,令 \(|A|:|B|:|C|=x:1-2x:x\)。可能会使用 \(3\) 步变成 \(2x\),或 \(4\) 步变成 \(1-x\)。于是选择 \((2x)^4=(1-x)^3\) 的解 \(x\)。更精确一些可以 DP,转移点在 \(0.36\) 附近。
全局简评:有点难评。感觉质量很差,是目前为止见过质量最差的一场。