Solution Set - 加训 CF!
加训一些 CF 题,这里写一些简要题解,可能是草稿。暂定只做 Div.1 的题。斜体的标题表示太菜了不会做。
CF1967
CF1967A
有 aiai 张写有 ii 的卡片和 kk 张空卡片,可以在每张空卡片上写 1⋯n1⋯n 的数字,然后把所有卡片排成一列。问最后的排列中最多有多少个子区间是 1,2,⋯,n1,2,⋯,n 的排列。n≤2⋅105n≤2⋅105。
设有 xx 种卡片的出现次数最少,次数为 yy,则最大值是 ny−x+1ny−x+1。显然策略应该是每次写下一种当前最少的数。二分最后的最小值即可。
CF1967B1
给定 n,mn,m,求有多少对 1≤a≤n,1≤b≤m1≤a≤n,1≤b≤m,满足 a+b∣b⋅gcd(a,b)a+b∣b⋅gcd(a,b)。n,m≤2⋅106n,m≤2⋅106。
设 gcd(a,b)=d,a=dx,b=dygcd(a,b)=d,a=dx,b=dy,则 dy∣x+ydy∣x+y,y∣xy∣x,而 (x,y)=1(x,y)=1,所以 y=1y=1,也就有 b∣ab∣a。进一步,a≡−b(modb2)a≡−b(modb2)。于是直接枚举 bb 计算即可。
CF1967B2
给定 n,mn,m,求有多少对 1≤a≤n,1≤b≤m1≤a≤n,1≤b≤m,满足 b⋅gcd(a,b)∣a+bb⋅gcd(a,b)∣a+b。n,m≤2⋅106n,m≤2⋅106。
设 gcd(a,b)=d,a=dx,b=dygcd(a,b)=d,a=dx,b=dy,则 x+y∣dyx+y∣dy。约掉右边的 yy,可以发现 x+y∣dx+y∣d,则 x,y≤x+y≤dx,y≤x+y≤d。那么 x≤√n,y≤√mx≤√n,y≤√m。直接枚举 x,yx,y,根据 dd 的范围计算即可。复杂度就是 O(√nm)O(√nm)。
CF1967C
将一个数组变成它求树状数组 mod998244353mod998244353 之后的结果,称为一次变换。给定一个长为 nn 的数组进行 kk 次变换之后的结果,构造原数组。n≤2⋅105n≤2⋅105。
考虑初始数组中的第 ii 个数对各个位置的贡献,会发现贡献到 i→i+lowbit(i)→⋯i→i+lowbit(i)→⋯ 这样一条链上,每次可以沿着这条链走任意多步。那么贡献到走 mm 步之后的方案数等价于 kk 个非负整数和为 mm 的方案数,也就是 Cmm+k−1Cmm+k−1。那么直接枚举点对点的贡献即可,预处理组合数后,复杂度是 O(nlogn)O(nlogn) 的。
CF1967D
给定一个 [1,m][1,m] 内长为 nn 的数列 aa,和一个 [1,m][1,m] 内长为 mm 的序列 bb。每次可以选择一个集合 SS,然后对所有 i∈Si∈S,将 aiai 变为 baibai。求至少要多少次操作才能使序列 aa 单调不减,或报告无解。n,m≤106n,m≤106。
显然 i→bii→bi 构成一个内向树森林,问题可以重新叙述为:每个数 aiai 可以在这个森林上走若干步,求使得 aa 单调不减时,操作次数最大值的最小值。考虑二分答案,维护一个指针表示上一个数的最小值,不断尝试增加,那问题就转化为判断从 uu 走 xx 步是否会经过 vv。这只要对基环树做一些基本的处理就可以了。
CF1967E1,E2
给定 n,m,b0n,m,b0,考虑所有在 [1,m][1,m] 内,长为 nn 的序列 a1,⋯,ana1,⋯,an,求有多少个这样的序列 aa,使得存在一个非负整数序列 bb,使得对 1≤i≤n1≤i≤n,有 bi≠ai,|bi−bi−1|=1bi≠ai,|bi−bi−1|=1。E1 n,m,k≤2⋅105n,m,k≤2⋅105,E2 ∑n,∑m,∑k≤107∑n,∑m,∑k≤107。
考虑固定的 aa 如何构造 bb。显然的贪心策略是让每个 bb 都尽可能的大。那么就可以设 dpi,jdpi,j 表示按照上述方法构造出的 bi=jbi=j 的方案数。转移是 dpi−1,j→dpi,j−1,(m−1)dpi−1,j→dpi,j+1dpi−1,j→dpi,j−1,(m−1)dpi−1,j→dpi,j+1,答案是 ∑ni=1dpi,mmn−i+∑mj=0dpn,j∑ni=1dpi,mmn−i+∑mj=0dpn,j。这样暴力的复杂度是 O(nm)O(nm) 的。
这个 DP 是格路计数的形式。观察一下模型,要从 (0,b0)(0,b0) 开始走,每次往右上方走一步或者往右下方走一步,求(除端点)不经过 y=−1y=−1 和 y=my=m 到达 (≤n,m)(≤n,m) 和 (n,<m)(n,<m) 的方案数。那么这就是一个反射容斥的模型,可以旋转 45\degree45\degree 后平移转化为反射容斥的模板。我们总共有 n+mn+m 个 ≤n≤n 步的反射容斥,复杂度就是 O(n2m+m)O(n2m+m)。可以结合前面的暴力进行根号分治,通过 E1。
继续优化这个容斥。用 XX 表示碰到直线 y=my=m,YY 表示碰到直线 y=−1y=−1,需要统计的就是碰撞序列为空或者以 XX 开头的路径。考虑路径终点在 (n,x)(n,x) 的方案,如果不考虑其他限制,路径数目是 C(x−b+n)/2nC(x−b+n)/2n。然后反射容斥,注意 x≥0x≥0 和 x<0x<0 的容斥是不同的, 前者可以写成 f(∅)−f(Y)+f(XY)−f(YXY)+⋯f(∅)−f(Y)+f(XY)−f(YXY)+⋯,后者则写成 f(X)−f(YX)+f(XYX)−⋯f(X)−f(YX)+f(XYX)−⋯。
我们将 ≥0≥0 的点和 <0<0 的点分别放在一起容斥,会发现每次对称后都是一段连续的 CknCkn,所以用差分统计每个 CknCkn 的系数 ckck 即可。这里的修改是对某个区间 [l,r][l,r],给 cici 增加 (m−1)i+d(m−1)i+d ,因为要考虑往右上走一步的系数是 m−1m−1,而在反射过程中系数是不变的。考虑差分 ci−(m−1)ci−1ci−(m−1)ci−1 ,然后就做到线性了,最终通过 E2。
代码参考了官方题解。
F 题就不做了。
全局总评:这场是打了的。题目还不错,A,B1,B2,C 是简单题,同时能看出一定层次;D 做法好像平凡但其实没有那么好想;E 是相当有趣的题目。
CF1965
CF1965A
nn 堆石子,每次选择一个不超过最小非空堆大小的正整数 kk,从每一堆中移走 kk 个石子。变成博弈,两个人轮流操作,不能操作者(面对 nn 个空堆)判负。问谁有必胜策略。n≤2⋅105n≤2⋅105。
首先相同大小的堆是没有用的。只有一个堆是必败态;两个堆时,较小的一个大小为 11 是必败态,>1>1 是必胜态;三个堆 x<y<zx<y<z 时,如果 y−x=1y−x=1,那么是必胜态;否则,如果 x=1x=1,是必败态;如果 x>1x>1,是必胜态。不妨模拟,如果最小堆大小为 11 就不断操作下去,如果不为 11 或只有一堆就必胜。
CF1965B
构造一个长度不超过 2525 的非负整数序列 aa,使得 aa 没有子序列和为 kk,且有子序列和为 v,∀v≤n,v≠kv,∀v≤n,v≠k。
可以证明一定有解。n≤106n≤106。
扣掉 kk 的最高二进制位 2b2b,给出其它位,那就只差所有含有这个位的数需要被构造。给出 k−2bk−2b,满足了这个位上不超过 kk 的部分。给出 k+1k+1,满足了这个位上超过 kk 的部分。给出 k+2b+1k+2b+1,满足了这个位上等于 kk 的部分。
CF1965C
给定一个 0101 串,将它的每一位依次写在一个纸带上。可以在任意位置翻折。一组翻折是合法的,如果同一个位置的字符相同,注意只在完成翻折之后检查。求最小长度。n≤2⋅105n≤2⋅105。
刻画最终的纸带:假装有一个光标,扫描整个序列,遇到一个字符可以左移光标或者右移光标。如果经过的位置已经存在字符,则两个字符需要相等;如果经过的位置不存在字符,则添加这个字符。
最终的序列一定是 0101 交替。那么直接贪心就可以了。
CF1965D
给定一个大小为 n(n+1)2−1n(n+1)2−1 的可重集,请求出一个回文序列,使得它的所有区间和构成的可重集包含给定集合。保证有解。3≤n≤10003≤n≤1000。
考虑回文串中那些独特的和,也就是那些关于中心对称的区间。这些区间的和是互不相同(严格递增)的,于是只有这 k=[n+12]k=[n+12] 个和出现奇数次,其余和都出现偶数次。用 map
找出给定集合中的所有出现奇数次的和,这种和的数目是 k−1k−1 或 k+1k+1。
如果是 k−1k−1,先按照这些和构造出长度为 n−2n−2 的序列,然后要把某个数拆成两个,或者在两端再增加一个数。把当前所有区间和从 map
中减去,找到剩下来的最大值,这个最大值一定是一个后半段的前缀和,暴力找到它应该在的位置即可。
如果是 k+1k+1,先尝试按照这些和构造出长度为 n+2n+2 的序列,可能因为奇偶性而不成功。如果不成功,只有唯一一个数奇偶性不同,直接把它删掉。如果成功了,要合并某两个相邻的数。同样的把当前所有区间和从 map
中减去,会多减掉一些,同样找到多减掉的最大的区间和,一定是一个后半段的前缀和。找到它的位置,把这个数删掉就可以了。
CF1965E
有 n×mn×m 个单位立方体落在空间内 (1,1,1)(1,1,1) 到 (n,m,1)(n,m,1) 的范围内,每个单位立方体染了 kk 中颜色之一。现在要在空间内再放置一些单位立方体,满足每个立方体的三维坐标都是不超过 106106 的正整数,使得同种立方体构成一个连通块。构造一种使用不超过 4⋅1054⋅105 个立方体的方案,或判断无解。n,m,k≤50n,m,k≤50。
人类智慧题。考虑先把立方体分开一些,那么就往上拉,让每两行之间空出一行。接着在各个高度的空行放上不同的颜色,就连通了所有颜色。当然这只是简要思路。估计没几个人看得懂吧。
CF1965F
现在要举办一场会议,会议的每一天需要有一位学者作报告,且一位学者不能报告两次。有 nn 位学者,第 ii 位学者只能在第 lili 到 riri 天作报告。如果连续的若干天中每一天都能有学者作报告,那么就可以在这些日子举办会议。对 k=1,2,⋯,nk=1,2,⋯,n,求有多少种选择 kk 天举办会议的方案。n,li,ri≤2⋅105n,li,ri≤2⋅105。
对于固定的一段时间,判定问题可以看作是二分图匹配,每个学者和每一天分别看作左部和右部的点,学者向它能作报告的天连边。一段时间合法当且仅当取出对应的右部点和所有左部点时,最大匹配是右部的完美匹配。
可以使用 Hall 定理检查。需要满足,对任何 xx 个右部点,与它们中至少一个相邻的左部点都有 ≥x≥x 个。应该如何取这 xx 个右部点?只考虑连续区间大概是不对的。举例而言,3/1 3/2 2/2 23/1 3/2 2/2 2 是一个 hack,考虑 1,31,3 两个右部点会发现不合法,但是连续区间都是合法的。
考虑打补丁。假设左部两个学者对应的左端点是一样的,设它们的区间分别为 [a,b],[a,c],b≤c[a,b],[a,c],b≤c。此时,如果将 [a,c][a,c] 换成 [a+1,c][a+1,c],答案不会变化。可以这样理解:检查一段时间除了最大匹配,也可以直接贪心,从左到右考虑每一天,给每一天选择可选的中右端点最小的一个。那么 [a,b],[a,c][a,b],[a,c] 会在第 aa 天同时加入,一定先选择 [a,b][a,b],就可以把 [a,c][a,c] 放到下一天再加入。
这样优化之后,所有区间的左端点就互不相同了。那么它有什么用?回到 Hall 定理,此时我们可以证明只考虑连续区间即可。假设有一个集合 TT 不合法且不连续,我们把中间缺失的部分都补上,仍然是不合法的。只考虑一个局部,如果原来 TT 中连续两个元素是 x,yx,y,把 x+1⋯y−1x+1⋯y−1 补上,新产生的相邻点只能是 [x+1,y−1][x+1,y−1] 的子区间,而每个左端点只有一个区间,所以增加的邻点数目不超过增加的点数。
还可以再简单一些!我们把前面的优化倒过来再做一次,所有区间的右端点也互不相同了。此时,用 Hall 定理的判定只需要检查整个时间区间。因为如果一个连续区间不合法,把区间的右端点或左端点扩展 11,同样只会增加一个区间。优化可以用一个堆完成,最后再用一个双指针计算就可以了。复杂度 O(nlogn)O(nlogn)。
全局简评:B,D,E 都是构造题,其中 B,E 是人类智慧,D 是细节分析。A,C 是比较平凡的简单题。F 是真正的好题。
CF1943
CF1943A
给定一个长为 nn 的序列 aa。Alice 和 Bob 进行博弈,他们初始有一个空序列 cc,Alice 每次操作选一个 aa 中元素加入 cc 并从 aa 中删掉它,Bob 每次操作选一个 aa 中元素从 aa 中删掉。Alice 先手。Alice 的目标是最大化 mex(c)mex(c),Bob 的目标则是将其最小化。假设两人都足够聪明,求最终的 mexmex。n≤2⋅105n≤2⋅105。
简单的观察:如果 xx 不出现,则答案不超过 xx;如果 x<yx<y 都只出现一次,则答案不超过 yy。
假设 0,1,⋯,y−10,1,⋯,y−1 中只有 xx 的出现次数为 11,其余都至少为 22,那么 Alice 先手取到 xx,此后如果 Bob 取到 <y<y 的某个数,Alice 就可以取另一个这个数。这样 mex(c)mex(c) 至少就是 yy。所以上述两条的较小值就是答案。
CF1943B
一个字符串 tt 被称为k−k−好,如果它存在至少一个长为 kk 的子串不是回文串。设 f(t)f(t) 表示使得 tt 是k−k−好的 kk 的总和。给定长为 nn 的字符串 ss,qq 次询问 l,rl,r,求 f(sl⋯sr)f(sl⋯sr)。n,q≤2⋅105n,q≤2⋅105。
注意到k−k−好这个条件是非常弱的,或者说不是k−k−好这个条件非常强。假设 tt 不是 k−k−好的。先考虑 k=t−1k=t−1,手玩一下会得到:kk 为奇数时,所有奇偶性相同的位置都相同;kk 为偶数时,所有位置都相同。所以当且仅当 tt 是全相同时,偶数 kk 不是k−k−好;当且仅当 tt 不是两种字符交替时,奇数 k>1k>1 不是k−k−好。注意 k=1k=1 和 k=|t|k=|t| 要特判。然后就随便做了。
CF1943C
给定一棵 nn 个点的树,初始所有点均为白色。每一次操作可以选择一个点 vv 和一个数 d∈[0,n−1]d∈[0,n−1],把所有距离 vv 等于 dd 的点 uu 染为黑色。构造一种方案,用最小次数的操作将所有点染黑。n≤2⋅103n≤2⋅103。
考虑一条长为 mm 的链应该怎么做。观察所有奇数位置的点和所有偶数位置的点,每一次操作最多将两个奇偶性相同的点染为黑色。所以 m=2k+1m=2k+1 时需要 k+1k+1 步,m=4km=4k 时需要 2k2k 步,m=4k+2m=4k+2 时需要 2k+22k+2 步。让所有操作都在链的中点或中间两个点上进行,然后直接拍到直径上就可以了。
CF1943D1,D2
一个长为 mm 的非负整数数列被称为好的,当且仅当 bb 可以通过有限次下述操作变成全为 00:选择两个下标 l,r(1≤l<r≤m)l,r(1≤l<r≤m),对所有满足 l≤i≤rl≤i≤r 的 ii,将 bibi 减掉 11。给定 n,kn,k 和质数 pp,求 (k+1)n(k+1)n 个 [0,k][0,k] 内长为 nn 的数列有多少个是好的。答案对 pp 取模。D1 k≤n≤400k≤n≤400,D2 k≤n≤3000k≤n≤3000。
当然考虑如何刻画“好的”数列。显然如果有 ai>ai−1+ai+1ai>ai−1+ai+1 则不合法。这个条件是否充要呢?归纳易证是的。
那有一个暴力的 DP:dpi,j,kdpi,j,k 表示 ai=j,ai−1=kai=j,ai−1=k 的方案数。转移是 dpi−1,k,≥k−j→dpi,j,kdpi−1,k,≥k−j→dpi,j,k。前缀和优化一下可以做到 O(n3)O(n3)。
如何优化?考虑容斥。如果位置 i1,i2,⋯,isi1,i2,⋯,is 不合法,也就是 aij>aij−1+aij+1aij>aij−1+aij+1。那么不会有连续两个位置同时不合法。可以分成各个连续段考虑。如果 2,4,⋯,2s2,4,⋯,2s 不合法,那么 2s+12s+1 个项有多少个取法?可以直接 DP,fi,jfi,j 表示 2i−12i−1 这个位置取 jj 的方案数。转移是 (k−x−y)fi,x→fi+1,y(k−x−y)fi,x→fi+1,y,要求 x<k−yx<k−y。那么计算一下 xfi,xxfi,x 的前缀和与 fi,xfi,x 的前缀和即可。
这样之后,设 dpidpi 表示考虑前 ii 项,第 ii 项不合法的容斥系数。转移就是枚举连续段,设当前连续段为 [j,i][j,i],那么 j−1,j−2j−1,j−2 都合法,于是有 (∑f(i−j)/2,x)kj−s−3dps≤j−3→dpi(∑f(i−j)/2,x)kj−s−3dps≤j−3→dpi。注意端点情况需要特判一下。同样用前缀和优化,然后就 O(n2)O(n2) 了。
CF1943E1,E2
给定一个长为 nn 的序列 aa。Alice 和 Bob 博弈,他们初始有一个空序列 cc,Alice 每次操作选择一个 aa 中的元素加入 cc 中并从 aa 中将其删去,Bob 每次操作选择至多 kk 个 aa 中元素删去。Alice 先手。Alice 的目标是最大化 mex(c)mex(c),Bob 则是将其最小化。假设两人都足够聪明,求最终的 mex(c)mex(c)。
序列用 m+1m+1 个正整数 f0,f1,⋯,fmf0,f1,⋯,fm 给出,表示有 fifi 个 ii。
E1 m≤50,∑m≤1000m≤50,∑m≤1000,E2 m,∑m≤2⋅105m,∑m≤2⋅105。k,fi≤109k,fi≤109。
考虑是否有 ans≥ians≥i。Alice 的策略是选择 <i<i 的,还未选择的数中,出现次数最小的一个。那么将所有 fj<ifj<i 从小到大排序。
注意到 Bob 没有必要改变 ff 的顺序:将每次删 kk 个变为 kk 次删 11 个,那么仅当 fx=fyfx=fy 时选择靠后的一个会改变顺序,但是可以选择靠前的一个。
如果 Bob 获胜,枚举 Alice 取不到的元素。Bob 的策略就是在不改变顺序的前提下尽可能地减少这个元素的次数。二分答案,然后直接模拟这个过程,复杂度大概是 O(m3logm)O(m3logm),可以通过 E1。
考虑如何优化这个过程。观察到,如果 Bob 为了保证顺序不变而减少 Alice 下一步删除的数,就说明剩下的数都几乎相等了(差不超过 11)。这个时候可以计算出一个 Bob 能赢的总和上界。而此前的部分双方互不影响,是容易计算的。
具体的,假设 ff 排序之后得到 a1,a2,⋯,ana1,a2,⋯,an,并且 Bob 选定 anan。我们要找到最大的 ii,使得 Alice 删除 a1,a2,⋯,aia1,a2,⋯,ai 的时候,它们都没有被减少过,也就是说 ∑nj=i+1(aj−ai)≥(i−1)k∑nj=i+1(aj−ai)≥(i−1)k。ii 对这个条件显然是具有两段性的。相应地有 ∑nj=i+2(aj−ai+1)<ik∑nj=i+2(aj−ai+1)<ik,也就是删除 i+1i+1 之前已经减少到了所有数差不超过 11,就可以用预处理的结果 O(1)O(1) 判断了。实际上因为要考虑多个 nn,ii 是可以双指针求的。
预处理的部分,就是假设 ∑ni=1ai=s∑ni=1ai=s 且 aiai 的极差不超过 11,求 Bob 能够在 anan 上获胜的最小的 ss。其实就很简单,可以递归计算,设 s(n−1)=q(n−1)+rs(n−1)=q(n−1)+r,那么第一步被删除的大小就是 qq,于是 s(n)=qn+r+ks(n)=qn+r+k。初始值是 s(2)=2ks(2)=2k。这样之后复杂度被优化到 O(mlog2m)O(mlog2m),瓶颈在二分后的排序,足以通过 E2。E2 比 E1 还好写
F 太抽象了,看不懂。
全局简评:ABC三个简单题好像不太对,缺乏层次感。D是 classical 的 DP。E 是非常好的博弈题,难度不算太高。F 有点牛了。
CF1936
CF1936A
交互题。交互库有一个 0,1,⋯,n−10,1,⋯,n−1 的排列 p0,⋯,pn−1p0,⋯,pn−1。可以做的询问是给出四个下标 a,b,c,da,b,c,d,交互库返回 pa∣pbpa∣pb 与 pc∣pdpc∣pd (按位或)的大小关系。请用不超过 3n3n 次询问找到两个下标 i,ji,j 使得 pi⊕pjpi⊕pj 最大(按位异或)。n≤104n≤104,交互库不是自适应的。
设 ≥n≥n 的最小 22 的幂是 2m2m,则最大值当然就是 2m−12m−1。
首先 n−1n−1 次操作找到 pi=n−1pi=n−1。然后来找 2m−n2m−n。
那么找到所有 pj∣pipj∣pi 是最大值的 jj,再在这些 pjpj 里面找到最小值。3n3n 次足矣。
CF1936B
一排 nn 个格子,第 ii 个格子写有 >
和 <
之一的字符 sisi。一个小球在某个格子中。如果小球所在的格子写有 <
,那么它花费一秒移动到左边的相邻格子,否则移动到右边。移动之后这个格子的字符翻转。对 i=1,2,⋯,ni=1,2,⋯,n,求初始在第 ii 个格子的小球需要多少时间离开这一排格子。n≤5⋅105n≤5⋅105。
如果位置 ii 初始是 <
,设 ii 左边的 >
从右到左下标依次是 a1,⋯,asa1,⋯,as,右边的 <
从左到右依次是 b1,⋯,btb1,⋯,bt。
- 如果 s≤ts≤t,那么球从左边跑出去,时间是 (i−a1)+(b1−a1)+(b1−a2)+⋯+(bs−as)+bs(i−a1)+(b1−a1)+(b1−a2)+⋯+(bs−as)+bs,化简一下就是 2∑si=1bi−2∑si=1ai+i2∑si=1bi−2∑si=1ai+i。
- 如果 s>ts>t,那么球从右边跑出去,时间是 (i−a1)+(b1−a1)+⋯+(bt−at+1)+(n−at+1)(i−a1)+(b1−a1)+⋯+(bt−at+1)+(n−at+1),化简后是 2∑ti=1bi−2∑t+1i=1ai+n+i2∑ti=1bi−2∑t+1i=1ai+n+i。
初始是 >
的部分 reverse 一下就可以了。那么只用开两棵线段树维护一下这两个东西就可以了。
CF1936C
有 nn 只神奇宝贝,每只神奇宝贝有 mm 个属性,第 ii 只的第 jj 个属性记为 ai,jai,j。现在有一个决斗场,初始时第 11 只神奇宝贝在场上。你可以以任意顺序做任意次如下两种操作之一:
- 选择 i∈[1,n],j∈[1,m],k>0i∈[1,n],j∈[1,m],k>0,将 ai,jai,j 增加 kk,代价为 kk。
- 选择 i∈[1,n],j∈[1,m]i∈[1,n],j∈[1,m],让第 ii 只神奇宝贝以第 jj 种属性与当前场上的神奇宝贝决斗。该属性数值更大的一方将胜出,胜者留在场上。该操作的代价为 cici。
求让第 nn 只神奇宝贝(作为胜者)留在场上的最小代价。2≤n,∑nm≤4⋅105,1≤ai,j,ci≤1092≤n,∑nm≤4⋅105,1≤ai,j,ci≤109。
显然每一次决斗都会把一只新的神奇宝贝推上场。设推上场的编号依次是 b0=1,b1,⋯,bt=nb0=1,b1,⋯,bt=n,那么在决斗之前,我们会让下一只的某个属性增加一些以使它获胜。这个增加量当然就是 max(0,min(abi−1,j−abi,j))max(0,min(abi−1,j−abi,j))。然后就可以以此建图跑最短路,uu 向 vv 连边权为 cv+max(0,min(au,j−av,j))cv+max(0,min(au,j−av,j)) 的边。这样直接做,复杂度是 O(n2logn)O(n2logn) 的。
考虑拆点,点 uu 拆成 mm 个点 (u,j)(u,j)。从 (u,j)(u,j) 向 (v,j)(v,j) 连边,边权为 max(0,au,j−av,j)max(0,au,j−av,j)。再放一个中转点 uu,从 (u,j)(u,j) 向 uu 连边 00,从 uu 向 (u,j)(u,j) 连边 cucu。上面的连边就只需要在排序后相邻的 au,jau,j 和 av,jav,j 之间连边了。复杂度 O(nmlog(nm))O(nmlog(nm))。图的点数是 n(m+1)n(m+1),边数是 2(n−1)m+2nm2(n−1)m+2nm。
AC link。怎么难度 A>B>C 的啊。
CF1936D
给定两个长为 nn 的序列 a,ba,b 和一个固定的整数 vv。一个区间被称为好的,当 bl∣bl+1∣⋯∣br≥vbl∣bl+1∣⋯∣br≥v(按位或)。这个区间的价值是 max(al,al+1,⋯,ar)max(al,al+1,⋯,ar)。现有 qq 次以下两类操作之一:
- 给定 i,xi,x,将 bibi 修改为 xx;
- 给定 l,rl,r,求 [l,r][l,r] 好的子区间中的最小价值。如果不存在输出 −1−1。
n,q≤2⋅105n,q≤2⋅105,ai,bi,v≤109ai,bi,v≤109。
直接上线段树。对每个区间,除了记录其好的子区间的最小价值,还要记录前缀按位或和后缀或的情况。这里总共只有 O(logV)O(logV) 种情况,所以暴力记录就可以了。merge 的部分是容易的。复杂度是两只 loglog。
[AC link](Submission #261989366 - Codeforces).
CF1936E
给定一个长为 nn 的排列 pp,计数满足下面条件的,长为 nn 的排列 qq:对任何 1≤i<n1≤i<n,max(q1,q2,⋯,qi)≠max(p1,p2,⋯,pi)max(q1,q2,⋯,qi)≠max(p1,p2,⋯,pi)。答案对 998244353998244353 取模。n≤2⋅105n≤2⋅105。
dpi,jdpi,j 表示已经确定前 ii 位,当前的最大值为 jj。
dpi,j→dpi+1,k,k≥jdpi,j→dpi+1,k,k≥j;(j−i)dpi,j→dpi+1,j(j−i)dpi,j→dpi+1,j。和 maxp1⋯imaxp1⋯i 相等的位置不转移。这样轻松做到 O(n2)O(n2)。
但是这个东西看起来很没有前途。
考虑容斥。dpidpi 表示前 i−1i−1 个前缀最大值都不同,第 ii 个前缀最大值相同的方案数。
设 maxij=1pj=simaxij=1pj=si。总数是 Ci−1si−1⋅i!=i⋅(si−1)!(si−i)!Ci−1si−1⋅i!=i⋅(si−1)!(si−i)!。容斥掉第一次相同在 jj 出现的方案数。如果 sj=sisj=si,则这 i−ji−j 个位置有 (si−j)!(si−i)!(si−j)!(si−i)! 种方案,否则有 Ci−j−1si−j−1⋅(i−j)!=(i−j)(si−j−1)!(si−i)!Ci−j−1si−j−1⋅(i−j)!=(i−j)(si−j−1)!(si−i)! 种。这样也是 O(n2)O(n2)。
设 pipi 表示最小的 jj,使得 sj=sisj=si。 经过一些转化得到
dpi=i⋅(si−1)!(si−i)!−∑i−1j=1((si−j)!(si−i)!−(si−j−1)!(si−i−1)!)dpj−∑i−1j=pi(sj−j−1)!(si−i−1)!dpjdpi=i⋅(si−1)!(si−i)!−∑i−1j=1((si−j)!(si−i)!−(si−j−1)!(si−i−1)!)dpj−∑i−1j=pi(sj−j−1)!(si−i−1)!dpj
第一项不用管,最后一项可以简单前缀和优化,中间的项用分治 NTT 解决。复杂度两只 loglog。
F 怎么是计算几何啊?难过。
全局简评:感觉难度 D>A>E>B>C,但是 D 可能又是我蠢了。太抽象了。题目都比较平凡吧。
CF1924
CF1924A
给定一个字符串 ss 和两个整数 n,kn,k。判断是否所有由前 kk 个小写字母构成的,长为 nn 的字符串都是 ss 的某个子序列。如果不是,找到一个不满足条件的字符串。1≤n,k≤26,|s|≤103,∑m,∑n≤1061≤n,k≤26,|s|≤103,∑m,∑n≤106。
贪心地找:第一次出现最晚的字符;在此之后第一次出现最晚的字符;以此类推。如果能找到的长度 ≥n≥n 那么就满足条件,否则不满足。
CF1924B
一个序列上有 nn 个点,点 xixi 上放置着 vivi 这个数。位置 pp 的权值是 pp 左边(含)第一个数乘以 pp 到右边(含)第一个数的距离,也就是说放有数的位置权值是 00。现在有 qq 次两类操作之一,或者在某个还没有放置数的位置放一个数,或者询问一段区间的权值之和。n,q≤3⋅105,1≤xi≤n,1≤vi≤107n,q≤3⋅105,1≤xi≤n,1≤vi≤107。保证初始时在 1,n1,n 位置有数。
用一个 set 维护所有数,用一个线段树维护每个数右边的部分的和。剩下的操作都是 trivial 的。
CF1924C
一张正方形的纸,每一次操作把四个角折到中心点,得到一个新的正方形。进行 nn 次操作后展开,求凸出来的折痕长度之和与凹进去的折痕长度之和的比值。答案可以表示成 A+B√2,A,B∈QA+B√2,A,B∈Q,输出 BB 对 999999893999999893 取模的结果。n≤109n≤109。
设 nn 次操作,凹进去的长度和为 pnpn,凸出来的长度和为 qnqn。列出递推式:
然后直接算就完了。
神秘的模数原来是为了保证分母一定有逆元吗,他温我哭。
CF1924D
求有多少个由 n 个左括号,m 个右括号组成的序列,其最长的合法括号子序列长度恰为 2k。答案对 109+7 取模。n,m,k≤2000,T≤3000。
一个合法的括号序列可以分成若干段,每一段也都是合法的括号序列
这些段之间构成若干个缝隙,这些缝隙内就可以插入剩下的括号,必须先插左括号再插右括号
设分为 j 段,长为 2i 的合法括号序列有 fi,j 个,有 O(n3) 的简单递推
fi,j=∑i−1t=j−1ft,j−1fi−t,1,fi,1=(2i−2)!i!(i−1)!
发现 fi,j=fi+1,j+1−fi+1,j+2,然后就 O(n2) 了。可以找到组合意义。
单次询问是 O(n) 的,设 n1=n−k,m1=m−k,则答案是 ∑ki=1fk,iCn1+m1−1i+n1+m1。
CF1924E
初始有一张 n×m 的网格纸。每一次等概率选择一条平行于边界的格线,将纸片剪开,然后留下左下方的一片。求使得留下纸片的面积严格小于 k 的期望操作次数。答案对 109+7 取模。
1≤∑n,∑m≤106,2≤k≤1012,T≤57000。
根据期望的线性性,只用计算每条直线被选择的概率。考虑所有网格线的一个排列表示顺序,那么 x=i 被选择但不是最后一个被选,当且仅当 x=1,2,⋯,i−1 和 y=1,2,⋯,⌊k−1i⌋ 都在这条直线后面。特别地,如果要求所有 y 都在它后面,那么可以确定如果选择了这条线,就一定是最后一条,所以跳过。预处理逆元之后 O(n+m)。
CF1924F
交互题。一个长为 n 的序列,n−1 个位置为 1,剩下一个位置为 0。每次可以询问一个区间 [l,r],交互库会返回 r−l 或 r−l+1 之一。保证交互库不会连续三次返回询问区间的和,或者连续三次不返回询问区间的和。请使用不超过 ⌈log1.116n⌉−1 次询问,给出一个大小不超过 2 的集合,其中包含了 0 的位置。
T≤2048,n≤105。交互库是自适应的。
考虑把整个序列分为三块 A,B,C。按照如下操作询问:
- 询问 A∪B,询问 A。
- 如果前两次询问回答相同,询问 A∪B∪C,可以直接确定 A 和 C 之一是没有 0 的。
- 如果前两次询问回答不同,再询问 A∪B。如果和第一次回答相同,那么可以确定 B 是没有 0 的。
- 如果第三次和第一次回答不同,再询问 A∪B∪C,可以确定 A 和 C 之一是没有 0 的。
回答指的是 0 是否在区间内。这样就用 ≤4 次操作把三块分成了两块。
然后考虑一个合适的分比,令 |A|:|B|:|C|=x:1−2x:x。可能会使用 3 步变成 2x,或 4 步变成 1−x。于是选择 (2x)4=(1−x)3 的解 x。更精确一些可以 DP,转移点在 0.36 附近。
全局简评:有点难评。感觉质量很差,是目前为止见过质量最差的一场。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具