NOIP2024 赛前训练
10.13
正睿十连测 day6
场况
预期 100 + 20 + 40 + 0 = 160。
实际 60 + 20 + 20 + 0 = 100。
rk 165.
T1 状态设计有点漏洞,挂了一个点,但是由于邪恶的 subtask 直接挂了 40 分。
T3 不知道怎么挂的,但我也不知道我写的是什么。
题解
T1:给定序列 \(a\),可以删除任意个长度为 \(2\) 的幂的区间,但删除的区间长度必须互不相同,最大化最终序列的最大子段和。\(n\le 1000\)。
注意到区间长度仅有 \(\log n\) 种,考虑进行状压。
设 \(f_{i,S}\) 表示处理到 \(i\),已经用过的区间长度集合为 \(S\),最大子段和的最大值。转移分为当前位置删与不删,有转移:
时间复杂度 \(O(n^2\log n)\)。
T2:圆盘不全在第一根柱子上的汉诺塔问题。\(n\le 10^6\)。
记 \(f(i,j)\) 表示将 \(1\sim i\) 的圆盘放到第 \(j\) 根柱子上的答案。
若 \(i\) 初始就在 \(j\),则 \(f(i,j)=f(i-1,j)\);否则,需要先将 \(1\sim i-1\) 移到另一个中转柱上再进行操作,即 \(f(i,j)=f(i-1,6-j-a_i)+1+2^{i-1}-1=f(i-1,6-j-a_i)+2^{i-1}\)。
时间复杂度 \(O(n)\)。
T3:有 \(n\) 种硬币,第 \(i\) 种的面值为 \(i\),个数为 \(a_i\)。求用这些硬币可以凑出多少种金额。\(n\le 100, a_i\le 10^9\)。
设 \(s\) 为总面值,\(f_i\) 为 \(i\) 能否被凑出来。
结论一:\(f\) 是左右对称的。
证明:若 \(f_i\) 可被凑出,那剩下的硬币可凑出 \(f_{s-i}\);反之亦然。
结论二:记 \(p\) 为最大的 \(a\) 的下标。\(f\) 在 \([\frac{n^3}2, s-\frac{n^3}2]\) 有周期 \(p\)。
证明:设 \(x+p\le s-\frac{n^3}2, f_x=1, f_{x+p}=0\),则显然 \(x\) 用尽了所有的 \(p\)。假设其他面值的硬币个数都 \(\lt p\),则剩余总面值 \(\lt \frac{n(n+1)}2\times(p-1)\lt \frac{n^3}2\),故 \(x+p\gt s-\frac{n^3}2\),与前面矛盾。所以存在一个 \(q\) 使得剩余的 \(q\) 的个数 \(\ge p\)。于是我们构造方案:在 \(x\) 的基础上少用 \(q-1\) 个 \(p\),多用 \(p\) 个 \(q\),即可凑出 \(x+p\)。以上是对上界的证明,反过来也可以证出下界。
根据以上结论,我们直接做多重背包算出 \(f\) 的前 \(O(n^3)\) 个点值,即可获知所有点值。
时间复杂度 \(O(\frac{n^4\log A}\omega)\)。
T4:神秘构造题。我不打算补了。
10.14
正睿 20 连测 day1
场况
预期 100 + 20 + [10,65] + 45 = [175, 230]。
实际 100 + 35 + 75 + 100 = 310。
rk 15.
T4 \(O(nq)\) 暴力草过 \(10^5\),T2 T3 暴力也都获得了高于预期的分数。数据怎么造的啊???
今天这场把昨天的下分抵消了,这是好的。
题解
T1:水题,略。
T2:给定原始串 \(s\) 和目标串 \(t\),删除 \(s_i\) 的代价为 \(w_i\),且每次只能删除当前某个字符第一次或最后一次出现的位置,求将 \(s\) 变为 \(t\) 的最小代价。\(|s|,|t|\le 2\times 10^5\)。
好难好难啊。
转化为所有 \(w_i\) 的和减去最大保留权值和。
先考虑朴素 dp:设 \(f_{i,j}\) 表示 \(s[1,i]\) 匹配 \(t[1,j]\) 的答案。
若 \(s_i=t_j\),则可以保留,\(f_{i+1,j+1}\gets f_{i,j}+w_i\)。
记 \(L_c, R_c\) 分别为字符 \(c\) 在串 \(t\) 中首次出现和最后一次出现的位置。若 \(j\not\in (L_{s_i},R_{s_i}]\),则 \(s_i\) 可以删掉,\(f_{i+1,j}\gets f_{i,j}\)。
考虑优化。发现第二种转移的条件是一个区间,且区间总数是 \(O(\Sigma)\) 的,所以可以按 \(L,R\) 将 \(t\) 分成若干段,每段内通过 KMP 进行快速转移。
时间复杂度 \(O(n\Sigma)\)。
T3:给定一棵树,点有点权,对每个 \(x\in[0,\sum a_i]\) 求出权值和为 \(x\) 的独立集个数。\(n\le 100, \sum a_i\le 10^5\)。
直接树上背包是 \(O(nV^2)\) 的。但其实如果每次只转移有值的点,随机数据下是跑的很快的。
发现复杂度瓶颈在于背包合并。于是我们需要找到一种只有加点而没有背包合并的 dp 方式。
考虑建出点分树,这样树高就是 \(\log n\) 的,于是可以状压记独立集信息,即它祖先中哪些点被选了。这样每次转移仅是往背包中加入当前点,按点分树 dfs 序进行 dp 即可。
时间复杂度 \(O(n^2V)\),看起来不能过但其实挺快。似乎还有一种 \(O(n^{\log_2 3}V)\) 的树剖做法,其实与之类似。
T4:维护一棵边有颜色的树,支持修改某条边的颜色、查询一条链上是否不存在重复的颜色。强制在线,\(n,q\le 10^5\)。
注意到链上数颜色是树分块模板题,本题应该是弱于该题的。
一步重要的转化:可重集 \(S\) 中不存在重复元素,当且仅当 \(S\) 中出现奇数次的元素个数等于 \(|S|\)。
“奇数次”这个东西的性质是非常好的,可以用 bitset 维护,且可以异或差分,所以只要对每个关键点维护它到根的 bitset 即可。
时间复杂度大约是根号的。
10.15
正睿 20 连测 day2
场况
预期 [60,90] + 20 + 0 + [44,72] = [124, 182]。
实际 100 + 20 + 8 + 100 = 228。
rk 57.
再次暴力过 T4,令人忍俊不禁。
T1 我写的看起来复杂度就很假啊,我也不知道事实上对不对。
题解
T1:唐题,不太想写。
T2:给定一张带边权的无向图,将它黑白染色,记 \(f(i)\) 为 \(i\) 到与它最近的异色点的距离,最小化 \(\max f(i)\)。\(n,m\le 10^6\)。
首先这个距离一定不会超过一条边。
考虑只保留与每个点相连的边权最小的边,容易证明得到的新图是二分图。
直接二分图染色,答案即新图中最大的边权。
复杂度线性。
T3:依次给出若干条偏序关系,对每个元素求出至少需要前多少条偏序关系才能确定它的排名。\(n\le 2\times 10^5, m\le 10^6\)。
首先考虑一个点的拓扑序何时是唯一确定的。发现如果在拓扑排序时该点从入队到出队的过程中,队列中始终只有它一个点,那么它就是前面所有点的后继,且是后面所有点的前驱,故它的拓扑序是确定的。
这个条件实际上等价于,不存在一个点的所有连边在拓扑序中都跨过它。(其实可以这样理解:如果存在一个这样的点,那么它们之间的大小关系就无法确定。)
进一步地,该条件等价于 \(\forall i\lt x, minnxt_i\le x\) 且 \(\forall i\gt x, maxpre_i\ge x\)。
用线段树动态维护满足上述条件的点的个数,若等于 \(n-1\) 则可确定 \(x\) 的位置。
时间复杂度 \(O(n\log n)\)。
T4:维护一棵带点权的树,支持三种操作:将某个点子树内与它距离 \(=k\) 的点的点权增加 \(s\)、将某个点子树内与它距离 \(\le k\) 的点的点权增加 \(s\)、将某个点的子树内所有点的点权增加 \(s\)。每次操作后输出所有被操作的点的点权最大值。\(n,m\le 2\times 10^5, k\le 10\)。
只有操作 1,2 或只有操作 3 都是容易的。
我们以操作 3 的做法为主,对于操作 1,2 暴力做(注意不要枚举无用的点),就可以快速通过本题且获得最优解!!!!!
正解好像是对每个点维护其子树内深度为 \(k\) 的节点信息,这样每次操作仅涉及 \(k\) 个点。
update: 被 hack 了呜呜呜。准备写一个 KDT 做法。
将 dfn 作为一维,深度作为另一维,就是 KDT 板子题。跑得飞快啊。
update:哎哟怎么 KDT 也被卡了,素质真差吧。。。
10.16
正睿 20 连测 day3
场况
预期 100 + 100 + 25 + 20 = 245。
实际 60 + 0 + 25 + 20 = 105。
rk 118.
T1 数组开小,T2 忘删调试,成为全场最搞笑选手了。。。
题解
玉玉了,不想写题解。
但是 T1 T2 确实挺简单的,T3 T4 也确实挺不想补的。
其实是写了 T2 题解的:https://www.luogu.com.cn/article/0ceqc36e
10.17
正睿 20 连测 day4
场况
预期 20 + ? + 10 + 0 = [30, ?)。
实际 20 + 20 + 10 + 0 = 50。
rk 90.
没啥好说的,我确实一个题都不会。
题解
T1:
T2:给定一个 \(n\times n\) 的矩阵和一些可填数的格子,请在这些格子中填入非负整数,要求每行和每列的最大值分别等于给定的限制值,最小化所有填入的非负整数之和。\(n\le 2500\)。
先把每行每列的限制值全都加进答案,再考虑扣除掉不必要的。
不必要的部分实际上就是将行作为左部点、列作为右部点,限制值相等的连边,做一个二分图最大匹配。
T3:
T4:P9052 [PA2021] Areny,目前不打算补。
10.18
校内训练 20241018
场况
预期 100 + 100 + 100 + 0 = 300。
实际 100 + 100 + 100 + 0 = 300。
怎么 T2 T3 都是数据结构典题?
怎么 T2 < T3 < T1 < T4?
T4 是插头 dp,这下真的知识盲区了。
题解
T1:给定一个 \(01\) 串,一次操作可以将一个 \(0110\) 子串变成 \(1001\),可以进行任意次操作,最大化最长的 \(1\) 连续段长度。\(n\le 5\times 10^5\)。
对于每个极长的 \(1\) 连续段,它最多往左边拓展一位,往右拓展一位。
以往左拓展为例,若它左边形如 \(\dots 011010\dots 10\),则可以拓展。右边同理。
时间复杂度依实现可以是 \(O(n\log n)\) 或 \(O(n)\)。
T2:给定一个序列,多次查询某个区间内最大的 \(x\),使得该区间内至少有 \(x\) 个不小于 \(x\) 的数。\(n,q,a_i\le 2\times 10^5\)。
整体二分板子题。或者你要 二分 + 主席树 也行。
时间复杂度 \(O(n\log^2 n)\)。
T3:维护一棵树,支持修改边权和查询直径长度。强制在线。\(n,q\le 10^5\)。
这不是经典题 Dynamic Diameter?
做法有一车啊。
T4:给定一个 \(n\times m\) 的网格图,相邻格子间有连边,求其最小生成树数量。\(n\le 3\times 10^4, m\le 6\)。
10.20
正睿十连测 day7
场况
预期 100 + 100 + 20 + 0 = 220。
实际 100 + 100 + 20 + 0 = 220。
rk 74.
搬了一车 ucup 原题,最后 unr 了,蚌。
题解
T4:求所有长度为 \(n\),值域为 \([1,m]\) 的序列的众数出现次数之和。\(n\le 2000, m\le 10^9\)。
若能对 \(k\in[1,n+1]\) 求出 \(f_k\) 表示不存在一个数出现次数 \(\ge k\) 的序列个数,那么统计最终答案是容易的。
设 \(g_{i,j}\) 表示填了 \(i\) 个数,已钦定 \(j\) 个数出现次数 \(\ge k\) 时的方案数,则容易由 \(g\) 通过容斥得到 \(f_k\)。
\(g\) 的转移就显得颇具技巧性了:考虑将每个钦定的数拎出 \(k\) 个单独考虑,其他随便填。则转移分两种:
- 正常填一个数,不进行钦定:\((m-j)g_{i,j}\to g_{i+1,j}\)。
- 新钦定一个数,一次性填上 \(k\) 个该数:\(\dbinom{n-i-1}{k-1}(m-j)g_{i,j}\to g_{i+k,j+1}\),其中那个组合数表示这 \(k\) 个数中第一个数必须填在当前第一个未填的位置上,剩余 \(n-i-1\) 个位置选出 \(k-1\) 个给其他数。
由于对于一个 \(k\),\(g\) 的第二维最大只有 \(\dfrac n k\),所以时间复杂度是 \(O(n^2\ln n)\)。
10.21
正睿 20 连测 day5
场况
预期 100 + 70 + 50 + 0 = 220。
实际 90 + 70 + 50 + 0 = 210。
rk 83.
T1 没开 long long 挂了 10 分,搞笑了。
我怎么 rating 都已经烂成这样了还能下分的,唉唉。
题解
T1:简单题,略。
T2:给定长度为 \(n\) 的序列 \(a\)。对于一个长度为 \(n\) 的序列 \(b\),其权值为其所有排列情况中,\(\sum [b_i\lt a_i]\) 之和。求所有长度为 \(n\) 且 \(\sum b_i=m\) 的序列 \(b\) 的权值的最小值。\(n\le 1000, m\le 5000, 0\le a_i\le m\)。
定义 \(w_i=\sum_{j=1}^n [a_j\gt i]\),序列 \(b\) 的权值转化为 \((n-1)!\sum w_{b_i}\)。于是本题转化为一个最优化背包问题。
由于是最优化而不是计数问题,我们并不关心 \(b\) 具体是什么顺序排列的。考虑钦定 \(b\) 是降序排序的,那么 \(b_i\le \dfrac j i\),\(j\) 为当前背包内 \(b_i\) 之和。
这样一来,\(f_{i,j}\) 的转移只需枚举 \([0,\frac j i]\)。
时间复杂度 \(O(m^2\ln n)\)。
T3:有两个长为 \(n\) 的序列 \(a,b\),元素均在 \([0,m]\) 中随机生成,求 \(\sum a_i=\sum b_i\) 的概率。\(T,n,m\le 2000\)。
考虑对问题形式进行转化。
首先显然可转化为,一个长为 \(2n\) 的序列,前 \(n\) 个元素在 \([0,m]\) 随机生成,后 \(n\) 个元素在 \([-m,0]\) 随机生成,求该序列和为 \(0\) 的概率。
进一步地,将后半段序列都加上 \(m\),转化为:一个长为 \(2n\) 的序列,每个元素在 \([0,m]\) 随机生成,求序列和为 \(nm\) 的概率。
考虑计算方案数,除以总方案数即为概率。至于如何求方案数,这是个容斥经典题,考虑钦定 \(i\) 个元素 \(\gt m\),答案即:
于是可线性回答每一组询问。
时间复杂度 \(O(Tn)\)。
T4:
10.22
正睿 20 连测 day6
场况
预期 100 + 40 + 10 + 30 = 180。
实际 100 + 40 + 10 + 30 = 180。
rk 48.
总算是没有挂分。
久违的上分场,虽然上得不多。
被 T1 硬控 2h,导致 T4 80 分点分树暴力没敢写。
题解
T1:维护一个平面上的点集,支持插入、删除、查询所有点对间斜率绝对值的最大值。\(n,m\le 2\times 10^5\)。
脑筋急转弯题。
结论:将点按横坐标排序后,最大值一定出现在相邻两点间。这个画个图就很容易证明。
有了这个结论之后,直接用 set 维护一坨东西即可。
时间复杂度 \(O(n\log n)\)。
T2:\(n\) 堆石子,每堆有三个权值 \(a,b,c\),两个玩家轮流进行操作,每次操作可选择一堆三个权值均不为 \(0\) 的石子,将其任意两个权值减去任意值(需保证减完后权值非负)。不能操作者输。问先手还是后手必胜。\(n\le 10^5, a,b,c\le 10^9\)。
可以证明 \(SG(a,b,c)\) 等于这堆石子的操作次数上限,即
其实我也不知道怎么证。
但是考场上一车打表找规律哥过了啊。
T3:
T4:静态邻域数颜色:给定一棵树,多次询问,给定 \(u,k\),求距 \(u\) 不超过 \(k\) 的点中出现了多少种颜色。\(n,q\le 2\times 10^5\)。
这题正解好像是虚树之类的的东西,可以做到 \(O(n\log^2 n)\)。
但是这太困难了,我觉得我会写 80 分就已经很好了。
首先是一档链的部分分,这就是序列上的静态区间数颜色,二维数点即可。时间复杂度 \(O(n\log n)\)。
对于树的情况,我们考虑建出点分树,把每个询问挂到点分树上它的所有祖先上,然后对每个点用 bitset 计算它的子树对询问的贡献。
时间复杂度 \(O(\frac{nq\log n}\omega)\)。可以通过 \(n\le 5\times 10^4\) 的数据。
把上面两档拼起来就有 80 分了。这应该是考场上很有性价比的得分。
10.23
正睿 20 连测 day7
场况
预期 100 + 0 + [43, 66] + 18 = [161, 184]。
实际 100 + 0 + 43 + 18 = 161。
rk 38.
被 T3 T4 暴力随机区分了。
有暴力老哥 T3 66,T4 54 啊,为什么我 T 了。
部分分差评。
题解
T1:给定一个序列,将它划分成恰好 \(k\) 段,最大化将第 \(i\) 段的每个元素值乘上 \(i\) 后的元素和。\(k\le n\le 3\times 10^5\)。
发现操作相当于选恰好 \(k\) 个后缀,使选出的后缀和之和最大。
直接将后缀和排序,选后缀 \([1,n]\) 和其它的前 \(k-1\) 大值即可。
复杂度 \(O(n\log n)\)。
T2:
T3:给定一张 DAG,多次给定 \(s,t,l,r\),问若只保留编号在 \([l,r]\) 的边,能否从 \(s\) 到达 \(t\)。\(n,q\le 5\times 10^4, m\le 10^5\)。
设 \(f(u,i)\) 表示在第 \(i\) 个询问的条件下能否到达 \(u\),\(g(i,j)\) 表示第 \(i\) 条边在第 \(j\) 个询问中是否保留。
对于边 \((u_i,v_i)\),有转移:
由于是 DAG,按拓扑序进行转移即可。
空间优化:将询问分成若干组,每组分别压位优化进行 dp。
时间复杂度:\(O(\frac{(n+m)q}\omega)\)。
T4:
10.24
正睿 20 连测 day8
场况
预期 100 + 10 + 0 + 10 = 120。
实际 100 + 10 + 20 + 10 = 140。
rk 51.
好难啊。出题人怎么还说这场是信心赛。。。
题解
T1:给定一个序列,你可以选择一个区间,将区间中的数都加上一个绝对值不超过 \(L\) 的数,求至多操作一次后序列严格 LIS 的最大值。\(n\le 2\times 10^5\)。
选择一个后缀加上一个正数或选择一个前缀加上一个负数,一定是不劣的。实际上这两种情况的做法相同。
求出前缀和后缀 LIS,统计答案时进行合并即可。
时间复杂度 \(O(n\log n)\)。
T2:有一个初始长为 \(n\) 的序列,每轮游戏 Alice 和 Bob 各选择一个元素,若他们选择了同一个元素,则将其从序列中删除,否则游戏结束,Alice 得分为他选择的元素的值。若序列被删空,则游戏结束,Alice 得分为 \(0\)。Alice 想要最大化得分,Bob 想要最小化 Alice 的得分,求 Alice 的最大期望得分。\(n\le 23\)。
由于是同时操作,操作时不知道对方的操作,所以这是不完全信息博弈。
对于这种博弈形式,需要将博弈中的不完全信息通过概率来确定。如在本题中,Alice 和 Bob 的决策分布的概率都是确定的。
既然操作的概率分布确定,那我们需要做的就是求解贝叶斯均衡(可以认为是纳什均衡在不完全信息博弈中的拓展)。
若每个元素权值为 \(a_i\),删除 \(i\) 后的最大期望得分为 \(b_i\),Bob 的概率分布为 \(p_i\),则答案为:
记答案为 \(k\),则有
观察 \(p_i\) 的限制,有 \(0\le p_i\le 1\),故 \(a_i\gt k\ge b_i\) 或 \(a_i\le k\le b_i\)。
我们将 \(a_i\) 降序排序,从前往后做,则当出现 \(a_i\le k\le s\) 时,Bob 为了让得分最小化,一定会令 \(p_i=0\),也即 \(k=a_i\)。
据此对序列元素删除情况进行状压 dp 即可,\(b_i\) 即 \(f_{S\setminus\{i\}}\)。
时间复杂度 \(O(n2^n)\)。
T3:有一个 \(n\) 个点的环,点有点权,值域 \([1,m]\)。对于每个 \(x\in[1,m]\),一次操作可以选择三个相邻的点 \(a,b,c\),若 \(b\lt x \land (a\ge x\lor c\ge x)\),\(b\gets \max(a,c)\);若 \(b\gt x\land (a\le x\lor c\le x)\),\(b\gets\min(a,c)\)。对每个 \(x\) 求出将所有点权变为 \(x\) 的最小操作次数或报告无解。\(n,m\le 3\times 10^5\)。
先考虑对于一个 \(x\) 怎么做。首先如果没有点权值为 \(x\) 则无解。
将点权小于 \(x\) 的记为 \(-1\),等于 \(x\) 的记为 \(0\),大于 \(x\) 的记为 \(1\),则每次操作相当于选择一个 \(-1\) 变为 \(\max(left,right)\),或选择一个 \(1\) 变为 \(\min(left,right)\)。
最优操作方案一定是找到 \(0\) 然后往旁边染色。但是如果出现形如 \(0,-1,1\) 或 \(0,1,-1\) 这种情况,则无法一次将中间的数变为 \(0\)。
有结论:对于每个形如 \(-1,1,-1,1,\dots\) 的极长连续段,它对答案的额外贡献为 \(\lfloor\frac{len}2\rfloor\)。即选择 \(-1,1\) 中数量较少的那一种,全都变为另一种。
故答案为 \(n-cnt_x+\sum\lfloor\frac{len}2\rfloor\)。
接下来考虑对所有 \(x\) 求出答案。\(x\to x+1\) 的过程中,会发生一些 \(1\) 变为 \(0\),一些 \(0\) 变为 \(-1\)。考虑使用线段树维护这个单点修改,以及求 \(\sum\lfloor\frac{len}2\rfloor\)。单点修改总次数是 \(O(n)\) 的。
时间复杂度 \(O(n\log n)\)。
T4:求满足如下条件的长度为 \(n\),值域 \([1,m]\) 的序列 \(a\) 个数:\(\exists i\in[1,n),\min_{j=1}^i a_j = \max_{j=i+1}^n a_j\)。\(n\le 400, m\le 10^9\)。
由于存在性的条件不易刻画,我们考虑求不满足该条件的序列数量。
由于值域过大,考虑求出 \(g_i\) 表示恰好用了 \(i\) 个数的不满足条件的序列个数(\(i\in[1,n]\)),则容易据此算出答案。
“恰好”仍然不好处理。进一步地,考虑求 \(f_{i,j}\) 表示长度为 \(i\),值域 \([1,j]\) 的不满足条件的序列数量,则容易由 \(f_{n,i}\) 通过二项式反演得到 \(g_i\)。
接下来考虑 \(f\) 的转移。
对于 \(f_{i,j}\),考虑用总方案数减去合法的方案数。枚举第一个合法位置 \(k\) 以及合法的值 \(t\),则 \([1,k]\) 也是一个不合法序列,值域 \([t,j]\) 且必有 \(t\),方案数 \(f_{k,j-t+1}-f_{k,j-t}\);\((k,i]\) 可在 \([1,t]\) 中任取,但必有 \(t\),方案数 \(t^{i-k}-(t-1)^{i-k}\)。
于是得到转移:
转换枚举顺序(交换两维),可以将上面的转移用前缀和优化到单次 \(O(n)\)。
故时间复杂度 \(O(n^3)\)。
10.25
校内训练 20241025
场况
预期 100 + 100 + 100 + 0 = 300。
实际 100 + 100 + 100 + 0 = 300。
T3 一开始被卡常了,但是出题人同意我把时限开成 3s,了,好欸。
std 最大点 >1.9s,时限开 2s 还是太没素质了,不是吗。
题解
T1:略。
T2:对于集合 \(S\subseteq [1,n]\cap\mathbb Z\),设 \(x=\max_{i\in S}i\),则 \(S\) 的权值为 \(\sum_{i=x-|S|+1}^x a_i\)。求所有可能的 \(S\) 的权值的异或和。\(n\le 2\times 10^5\)。
枚举区间右端点 \(r\) 和长度 \(k+1\),答案为
经典结论:\(\binom n m\equiv 1\pmod 2\),当且仅当 \(m\) 在二进制表示下是 \(n\) 的子集。
参见 ZR 20 day4 C。
所以直接枚举 \(r\) 后暴力枚举 \(r\) 的子集即可。
时间复杂度 \(O(3^{\lfloor\log_2 n\rfloor})\)。
T3:有长度为 \(n\) 的序列 \(X,Y\),每个操作可能是 \(X\) 单点修或 \(Y\) 后缀加。每次操作后给定 \(k\),求 \(\min_{i=1}^n kX_i+Y_i\)。\(n,q\le 10^5\)。
这真不是一眼分块维护凸包吗?
具体地,记答案为 \(b\),则有 \(kX_i-b=-Y_i\),于是维护 \((X_i,-Y_i)\) 构成的上凸包即可。\(X\) 的单点修可以暴力重构凸包,\(Y\) 的后缀加直接散块暴力重构,整块打标记即可。
时间复杂度是 \(O(q(B+\frac n B)\log B)\) 或 \(O\left(q\left(B+\frac{n\log B}B\right)\right)\) 的。
经过我小小的卡常,已经跑进 1s 了啊!
10.27
正睿十连测 day8
场况
预期 30 + 40 + 0 + 0 = 70。
实际 30 + 40 + 0 + 0 = 70。
rk 51.
T1 放博弈论,T3 放交互???
一车不可做题啊。
题解
CF2027
ABCD 都是容易的。
E1/E2:
10.28
正睿 20 连测 day9
场况
预期 0 + 40 + 60 + 20 = 120。
实际 0 + 40 + 60 + 20 = 120。
rk 44.
我草我怎么不会 T1 啊?
题解
T1:给定平面上若干个点,求将它们连成一个简单多边形(即线段间除了端点外不相交)。\(n\le 500\)。
找到最靠左和最靠右的点,在它们之间连一条辅助线,从最左点开始先从左到右连这条线下方的点,到达最右点后从右到左连这条线上方的点。
时间复杂度 \(O(n\log n)\)。
T2:
T3:
T4:不打算补。
10.29
正睿 20 连测 day10
场况
预期 100 + 40 + 0 + 20 = 160。
实际 100 + 70 + 0 + 20 = 190。
rk 66.
出题人精心构造所有大样例使得所有假做法都能通过所有大样例。
T2 我还以为我赛时的思路没有前途,然而有老哥写出来了。不过还是 std 做法更厉害一些。
题解
T1:略。
T2:给定一个序列,求它有多少个子区间满足:可以被分解成若干个 \(1,2,3,\dots\) 的子序列。\(n\le 10^6,a_i\le n\)。
对于一个固定的 \(l\),其对应的合法 \(r\) 一定是 \([l,n]\) 的一个前缀。
考虑对每个 \(l\) 求出最小的不合法的 \(r\)。
我们称一个元素“有前途”,当且仅当当前存在一个 \(a_i-1\) 作为它的前驱。
那么最小不合法 \(r\) 就是当前最小的没有前途的元素。
考虑从后往前扫,维护一个没有前途的元素组成的队列,以及每个值的还没找到前驱的集合。
扫到 \(a_i\) 时,若还存在未被匹配的 \(a_i+1\),则将其标记为有前途,并从没前途的队列中删除;
若 \(a_i\gt 1\),将其加入队列。
则 \(i\) 对应的最小不合法元素即队尾。
时间复杂度 \(O(n)\)。
T3:有一张 \(m\) 层的图,每层有 \(n\) 个点,仅相邻两层之间有连边。有 \(n\) 条不相交的、从第一层到第 \(m\) 层的未知路径。给定第一层的一个点 \(s\) 和第 \(m\) 层的一个点 \(t\),求所有可能在它们之间的路径上的点。\(n\le 20, m\le 1000, |E|\le 5000\)。
首先发现路径的每一段相互独立。check 一条边是否可行时,只需将其删去后对其连接的两层点跑二分图最大匹配,看是否有完美匹配即可。
从 \(s\) 正向做一遍,再从 \(t\) 反向做一遍,取交集即可。
时间复杂度 \(O(n^2(m+|E|))\)。
T4:不打算补。
10.30
正睿 20 连测 day11
场况
几乎罚坐一整场,就不放成绩了吧。。。
怎么有老哥选择以不报名来避免下分啊?
题解
T1:给定一张 \(n\) 个点 \(m\) 条边的无向图,每条边有颜色 \(c\),第 \(k\) 次经过颜色为 \(c\) 的边时需支付费用 \(kX_c\)。对每个 \(u\in[2,n]\),在走 \(1\rightsquigarrow u\) 的最短路的前提下最小化支付的费用。\(n\le 50, c\le m\)。
这个条件十分不好刻画,考虑暴力怎么做。
既然是在最短路的前提下,那我们直接建出最短路 DAG,然后在这个 DAG 上暴搜更新答案。
下面证明这个暴搜实际上复杂度是对的。
由于边权均为 \(1\),所以这个最短路 DAG 一定可以被分为若干层,使得所有所有连边都在相邻两层之间。
设它被分为了 \(x\) 层,则每层有 \(\frac n x\) 个点,图上的路径总数至多有 \((\frac n x)^x\) 条,这个值在 \(x=\frac n e\approx\frac n 3\) 时最大。
故时间复杂度 \(O(3^{\frac n 3})\)。
T2:给定常数 \(p,q\),我们称一个集合 \(S\) 是好的,当且仅当 \(p\sum_{x\in S}x\ge q|S|\max_{x\in S}x\)。给定一个集合 \(S\),要保留尽量多的元素使得这个集合是好的,求哪些元素在所有保留元素数量最多的方案中都不会被保留。\(|S|\le 5\times 10^5,p\gt q\ge 0\)。
将集合中的元素排序,先考虑求出最多能保留多少个元素。
首先这个答案显然具有单调性,故可以二分。
check 时,考虑枚举最大元素,那么此时剩下的元素一定是选得越大越好,所以最优的选择方式一定是排序后的一段连续区间。
于是就可以做到 \(O(n)\) check 了。
求出最多能保留的数量 \(sz\) 后,我们考虑计算哪些元素可能被保留。
对于一段合法区间 \([R-sz+1,R]\),我们若要把其中一个元素换成更小的数,那一定是把最小的 \(R-sz+1\) 拿去换。
发现一个元素能否被换进合法区间也是具有单调性的,故可以在 \([1,R-sz+1]\) 中二分出最小的可以被放进合法区间里的 \(L\)。
对于每个 \(R\) 求出其对应 \(L\),并把 \([L,R]\) 标记为可能被保留。最后未被标记的就是不可能被保留的元素了。
时间复杂度 \(O(n\log n)\)。
T3:有一个 \(n\times n\) 的网格,格子 \((x,y)\) 的权值为 \((n^2)^{a_{x,y}}\)。你需要从 \((1,1)\) 走到 \((n,n)\),每次只能向右或向下走一格,并最大化经过的路径上的格子的权值和。每次询问给出一个矩形,你需要在不走这个矩形里的格子的情况下求出答案,询问之间相互独立。\(n\le 400, q\le 2\times 10^5, 1\le a\le n^2\)。
我们先考虑值域正常的话怎么做。
首先预处理出从起点出发的答案 \(f\) 和从终点出发的答案 \(g\)。则经过格子 \((x,y)\) 的答案就是 \(f+g\)。
发现在网格图中挖掉一个子矩形后,路径必须经过这个子矩形左下方的一个前缀或它右上方的一个后缀。
于是我们再预处理出每一行答案的前缀最大值和后缀最大值,每次询问即可 \(O(1)\) 回答。
时间复杂度 \(O(n^2+q)\)。
接下来考虑如何处理这么大的值域。
考虑利用指数函数的性质,将 dp 数组中的每个值表示成 \(\sum (n^2)^{x_i}\),那么比大小即找到最大的 \(x_i\) 不相等的 \(i\),比较大小即可。
考虑优化这个过程。可以用主席树维护 dp 值以及区间 \(x_i\) 的哈希值,则 dp 过程中需要用到的比大小和加法两个操作分别可以线段树二分和单点加。
所以我们以将每个 \(O(1)\) 操作变成 \(O(\log n)\) 的代价,处理了大值域的问题。
故总时间复杂度 \(O((n^2+q)\log n)\)。
T4:不打算补。
10.31
正睿 20 连测 day12
场况
预期 100 + [20,?) + 0 + 20 = [140, ?)。
实际 100 + 40 + 0 + 20 = 160。
rk 57.
T2 写的假做法本来过了 60,结果后面又拼了一个暴力上去,暴力忘开 long long 直接 60 -> 40 /ll/ll/ll
题解
T1:给定一个 \(n\) 个点的环,点有点权。Alice 和 Bob 分别选择一个点,记为 \(i,j\),且 \(i\neq j\),环上从 \(i\) 开始沿顺时针方向直到 \(j\) 前驱的所有点归 Alice 所有,其他点归 Bob 所有。求编号最小的 \(i\) 使得 Alice 选了 \(i\) 后,无论 Bob 怎么选,Alice 拥有的点的权值平均数都不小于 Bob 拥有的点的权值平均数。\(n\le 5\times 10^5\)。
首先可以转化为 Alice 的点的权值平均数不小于所有点的权值平均数。
对于环的处理,可以复制一遍数组。故下面只考虑 \(i\lt j\) 的情况。
记所有点权和为 \(sum\),\(a\) 的前缀和为 \(s\),则:
即
可以使用单调队列维护左边的值。
时间复杂度 \(O(n)\)。
T2:\(n\) 个物品,每个物品有两个权值 \(a_i,b_i\)。初始每个物品的权值都为 \(a_i\),你可以选择不超过 \(k\) 个物品,将其权值改为 \(b_i\)。求在总权值不超过 \(t\) 的情况下最多能选择多少物品。\(k\le n\le 2\times 10^5, 1\le t\le 10^{18}, 1\le b_i\le a_i\le 10^{12}\)。
哎哟怎么又是贪心题。
先考虑选 \(k\) 个数。那么显然是选前 \(k\) 小的 \(b_i\) 最优。
然后我们考虑加数。每次我们加入产生代价最小的元素。
有两种情况:
- 加入的数不改权值,则产生代价为 \(a_i\)。
- 加入的数改权值,则需要选一个之前改过权值的数,把它的权值改回来。那么显然是选 \(a-b\) 最小的那个最优。产生代价为 \(b_i+\min\{a-b\}\)。
这个贪心过程需要维护三个堆:未加入的 \(a_i\)、未加入的 \(b_i\)、已加入且改了权值的 \(a_i-b_i\)。删除操作打个懒标记即可。
时间复杂度 \(O(n\log n)\)。
T3:
T4:一个初始为 \(\{1,2,3,\dots,n\}\) 的集合,每次操作从中随机选择一个数,并将其倍数都从集合中删除。问将集合删空的期望操作次数。\(n\le 10^{10}\)。
相当于每次操作随机选择一个数,但如果它的约数已被删过,则这次操作不计入次数。
所以当且仅当 \(x\) 比它的其它约数都先被删除时,它才会对答案产生贡献。
即 \(x\) 的期望贡献为 \(f(x)=\frac 1{d(x)}\)。
最终答案即为 \(\sum_{i=1}^n f(i)\)。显然 \(f(x)\) 是积性函数,Min-25 筛即可。
时间复杂度 \(O(n^{1-\epsilon})\)。
11.1
校内训练 20241101
场况
预期 100 + 15 + 100 + 45 = 260。
实际 100 + 5 + 100 + 0 = 205。
T2 写的爆搜怎么连最低档分都过不去?
T4 开了 1e8 的 ll 数组导致全都 MLE 了。
题解
T1:给定一棵带边权的数,求有多少个无序三元组 \((x,y,z)\) 使得 \(dis(x,y),dis(x,z),dis(y,z)\) 可以构成一个三角形。\(n\le 3\times 10^5\)。
诈骗题。我被硬控 1h /ll/ll/ll
发现边权其实是没用的。可以构成三角形当且仅当三个点不在同一条路径上。
随便 dfs 一遍统计答案即可。
时间复杂度 \(O(n)\)。
T2:有一个 \(n\) 个点的环,有一个人初始在点 \(1\),接下来的 \(m\) 秒中,每秒他可以选择向左移动一步、向右移动一步、访问一次当前节点。其中,第 \(i\) 次访问第 \(j\) 个点可以获得 \(max(0,a_j-i\times b_j)\) 的收益。求最大总收益。\(n\le 200, m\le 1000\)。
首先,我们一定是一次性收取完某个点的收益,不会分成多次收取。
所以最优方案一定是先往一个方向走,并收取经过的点的收益;然后原路返回,再去收取另一个方向的收益。
于是我们只需预处理出 \(f_{i,j}\) 表示收完了 \(1\) 到 \(i\) 的收益,用了 \(j\) 秒的答案,以及 \(g_{i,j}\) 表示收完了 \(n\) 到 \(i\) 的收益,用了 \(j\) 秒的答案。
记 \(w_{i,j}\) 表示访问了 \(j\) 次点 \(i\) 得到的收益,则有:
\(g\) 的转移是类似的。
这样做的复杂度是 \(O(nm^2)\) 的,足以通过本题。
但事实上,这个 dp 是具有决策单调性的。
证明:记 \(W(k,j)\) 表示由 \(k\) 转移到 \(j\) 的贡献,则 \(W(k,j)=w_{i,j+1-k}, W(k+1,j-1)=w_{i,j-k-1}, W(k,j-1)=w_{i,j-k} W(k+1,j)=w_{i,j-k}\),于是 \(W(k,j-1)+W(k+1,j)-W(k,j)-W(k+1,j-1)=w_{i,j-k}-w_{i,j-k-1}-(w_{i,j+1-k}-w_{i,j-k})\),右边显然是等于 \(b_i\) 或 \(0\) 的,所以满足四边形不等式。
于是分治优化即可做到 \(O(nm\log m)\)。
T3:求有多少个长度为 \(m\),值域 \([1,n]\) 的整数序列,满足 \(i\) 的出现次数不小于 \(a_i\)。\(n,a_i\le 30, m\le 10^9\)。
发现 \(a_i\) 很小,所以不满足条件才是更容易处理的。
考虑容斥,记 \(f_{i,j}\) 表示钦定了 \(i\) 个不合法的,总共用了 \(j\) 个位置,有转移:
答案即 \(\sum_{i=0}^n (-1)^i\sum_{j}\binom m j f_{i,j}(n-i)^{m-j}\)。
若认为 \(n,a_i\) 同阶,则时间复杂度 \(O(n^5)\)。
T4:
11.3
正睿十连测 day9
场况
预期 100 + 0 + 100 + 0 = 200。
实际 100 + 0 + 100 + 0 = 200。
rk 45.
笑点解析:睡到快过了半场才起床。
T1 怎么大于 T3???
题解
T1:
T2:
T3:
T4:
11.4
正睿 20 连测 day13
场况
预期 20 + 100 + 20 + 10 = 150。
实际 0 + 100 + 20 + 10 = 130。
rk 28.
T1 怎么暴力挂了???
题解
T1:给定一棵树,其中有些边已经被定向。对于每个点,有一些入度是合法的。求字典序最小的合法边定向方案。\(n\le 5\times 10^5\)。
对每个节点维护其可能的入度区间,记为 \([L_u,R_u]\)。如果 \([L_u,R_u]\) 没有合法入度,则无解;如果 \([L_u,R_u]\) 有多于一个合法入度则一定存在合法方案。
所以我们现在考虑只有一个合法入度的情况。如果这个合法入度恰好就是 \(L_u\),则只能增加一个出度;如果这个合法入度是 \(R_u\),则只能增加一个入度。
据此递归做下去即可。
所以先加入已经定向的边,按上述方法迭代更新即可判断是否无解。
然后按编号顺序考虑每条边,若它还为被定向,则贪心地将其定向为 0 然后迭代更新即可。
由于迭代更新过程中每个点可能的入度区间是不断减小的,而所有点的入度之和是 \(O(n)\) 的,所以时间复杂度 \(O(n)\)。
T2:有一个 \(n\times n\) 的矩阵,\((i,j)\) 上的数为 \(\min(i,j)\)。给定 \(M\),求使得 \(n\times n\) 的矩阵中所有数之和模 \(M\) 等于 \(0\) 的最小正整数 \(n\)。\(M\le 10^{12}\)。
矩阵中所有数之和为 \(\dfrac{n(n+1)(2n+1)}6\)。所以式子变为:
先考虑 \(n(n+1)(2n+1)\equiv 0\pmod{p^k}\)(其中 \(p\) 是质数)的解是什么。由于 \(n,n+1,2n+1\) 两两互质,所以 \(n,n+1,2n+1\) 中有且仅有一个是 \(p^k\) 的倍数。故解集为 \(\{0,p^k-1,\frac{p^k-1}2\}\)。
将 \(6M\) 分解质因子,枚举每个质因子取哪个解,最后 CRT 合并答案。
时间复杂度 \(O(\sqrt M + 3^{\omega(M)}\omega(M))\)。
T3:给定一张无向图,要求支持区间邻域加与查询区间邻域和两种操作。\(n,m,q\le 2\times 10^5\)。
将每个点的邻域按顺序拼起来,可以得到一个长度为 \(2m\) 的序列 \(a\)。
则问题变为,序列上每个元素有一个颜色,每种颜色有一个权值,要求支持对序列中某个区间的所有颜色的权值加上某个值(出现多次则需加多次),以及查询区间所有颜色的权值之和。
考虑分块。分别统计修改散块对询问整块的贡献、整块对散/整块的贡献、散块对散块的贡献即可。
由于卡空间,需要把询问离线下来分别计算每一块的贡献。
时间复杂度 \(O((m+q)\sqrt m)\)。
T4:不打算补。
11.5
正睿 20 连测 day14
场况
预期 100 + 30 + 55 + 0 = 185。
实际 100 + 30 + 55 + 0 = 185。
rk 23.
出题人说 T1 < T4 < T3 < T2,谔谔谔谔。
题解
T1:简单题,略。
T2:不打算补。
T3:有 \(n\) 座城堡排成一行,第 \(i\) 座的坐标为 \(x_i\)。每座城堡有一个通讯半径 \(h_i\),如果你想从左边攻击它,那就必须先攻击所有坐标在 \((x_i-h_i,x_i]\) 的城堡;右边同理。现在给定了每座城堡能否从左边/右边攻击,多次询问,每次给定一个区间,求如果只能攻击这个区间内的城堡,那么最多能攻击多少座城堡。\(n,q\le 2\times 10^5\)。
对于每一座城堡 \(i\),存在一个分界点 \(L_i\),使得所有 \(l\le L_i\),城堡 \(i\) 都可以被从左边攻击,反之则不行。
考虑整体二分,求出所有 \(L_i\)。
考察 \(l=mid+1\) 时哪些城堡可被攻击。首先若 \(x_i\le mid\),则显然是归入左区间。否则我们维护一个栈,存当前不能从左边被攻击的城堡。每次新加入一个城堡时,先从栈顶开始找到离它最近的城堡 \(j\) 满足 \(j\) 若要从右边被攻击则必须先攻击 \(i\),则若 \(i\) 从左边被攻击不依赖于 \(j\),那么 \(i\) 就可以从左边被攻击,归入右区间,否则将 \(i\) 加入栈中并归入左区间。
以上是处理从左边攻击的情况,将序列反转后再做一遍即可获得 \(R_i\)。
接下来考虑处理询问,显然答案即满足 \(l\le L_i\le i\le r\lor l\le i\le R_i\le r\) 的 \(i\) 的个数。这个二维数点一下,然后扣掉重复计算的部分即可。
时间复杂度 \(O(n\log n)\)。
T4:有一个质点,从原点开始以 \(1\) 单位长度每秒的初速度沿数轴正方向运动。你需要支持三种操作:在 \(t\) 秒时让质点速度减半、查询质点到达 \(x\) 时的时间(取模)、回到第 \(k\) 次操作后的状态。\(q\le 2\times 10^5\)。
首先将速度减半转化为剩余距离翻倍、若没有减速则每秒剩余距离减一。
考虑以时间为下标建立线段树,维护区间的一个三元组 \((k,s,r)\),表示区间内有 \(k\) 次减速,至少要剩 \(s\) 的距离才能完整通过该区间、通过后出来的剩余距离为 \(r\)。三元组的合并只需对左边的 \(r\) 是否大于右边的 \(s\) 进行分讨即可。
对于查询操作,线段树上二分即可。即若剩余距离可以走到右子树那就去右子树,否则去左子树。
对于操作三,我们将线段树可持久化一下即可。
另外还有一个细节,就是关于取模。我们计算过程中涉及比大小,所以不能直接取模。可以考虑同时维护数的真实值对 \(10^{18}\) 取 \(\min\) 的结果。
时间复杂度 \(O(q\log n)\)。
11.6
正睿 20 连测 day15
场况
预期 100 + 0 + 40 + 0 = 140。
实际 100 + 0 + 40 + 0 = 140。
rk 43.
怎么又是草八牛场,我直接罚坐!
题解
T1:求将 \(n\times n\) 的棋盘黑白染色,使得每行和每列都恰好有两个黑色格子的方案数。\(n\le 10^7\)。
std 是神秘容斥做法。我不会。
先考虑朴素 dp。我们逐行考虑,记 \(f_{i,j}\) 表示考虑了前 \(i\) 行,有 \(j\) 列目前没有黑色格子。
发现有一个黑色格子的列数可以通过 \(i,j,n\) 确定,直接转移即可做到 \(O(n^2)\)。
但这看起来没什么前途。
考虑重构问题:有三个堆和 \(n\) 个不同物品,初始时物品都在第一堆,每次可以选择两个物品,将它们各自移到下一堆。问有多少种操作序列能操作恰好 \(n\) 次将所有物品移到第三堆。
考察最后一个被移到第三堆里的物品 \(x\)。由于一次要操作两个物品,所以我们再给它拉一个垫背的,记作 \(y\)。
- 若 \(y\) 此时在第一堆,那么皆大欢喜,把 \(x,y\) 一起移动两次就能到第三堆了。我们可以把这两次移动插到之前 \(n-2\) 次操作形成的 \(n-1\) 个空隙里。由于整个过程中 \(x,y\) 都是一起行动的,并不区分,所以方案数 \(\binom n 2(n-1)f(n-2)\)。
- 若 \(y\) 此时在第二堆,那么如果没有 \(x\),一定还有一个 \(z\) 把 \(y\) 带到了第二堆,下一个操作就本该是 \(y,z\) 一起移动到第三堆了。而现在多了一个 \(x\),就需要先让 \(x,z\) 一起往右一格,把 \(z\) 归位,然后再让 \(x,y\) 一起移动一次到第三堆。这个过程中 \(x,y\) 是区分的,且 \(y,z\) 原本是绑定的,所以新操作的位置没得选,方案数 \(n(n-1)f(n-1)\)。
所以可以得到一个很好看的递推式:
时间复杂度 \(O(n)\)。
T2:给定一棵树,有 \(m\) 条给定了起点的链,你需要为这些链分别确定一个终点,使得树上每条边被这些链覆盖次数的奇偶性满足给定限制,并最小化链的长度之和。边带权。\(n,m\le 5000\)。
利用奇偶性的性质,我们可以把每条链链拆成两条到根的链,这样就不必为每个起点确定终点了。
先考虑如果我们选定了 \(m\) 个终点,怎样匹配才能使总长度最小。
对每条边 \((u,v)\) 计算贡献。显然在 \(v\) 子树内的起点和终点尽量两两匹配最优,不会产生贡献,所以贡献为 \(v\) 子树内起点数量与终点数量之差的绝对值。
对每条边覆盖次数奇偶性的限制,亦可转化为子树内起点与终点数量之差的绝对值的奇偶性限制。
记 \(f_{u,i}\) 表示 \(u\) 子树内,起点与终点数量之差为 \(j\) 时的答案。
类似树上背包地直接转移是三次方的。
考虑对 \(i\) 的范围只开必要的部分,精细实现一下,复杂度优化到 \(O(n^2)\)。
T3:给定一张无向图,保证每条边两端点编号之差 \(\le 13\),问有多少个点集的导出子图是连通的,答案对 \(2\) 取模。\(n\le 50\)。
记 \(f(S)\) 表示点集 \(S\) 的导出子图的连通块数,则答案即 \(\sum_S [f(S)=1]\bmod 2\)。
这个东西肯定没法直接做。考虑找一个组合意义比较好的东西来替换这个式子。
注意到 \(\sum_S 2^{f(S)}\equiv 2\sum_S[f(S)=1]\pmod 4\),我们只需考虑计算 \(\sum_S 2^{f(S)}\)。
考察这个式子的组合意义:将图染成白红蓝三种颜色,要求红点和蓝点不能相邻的方案数。即白色表示不在 \(S\) 内,同一个连通块染成同一种颜色。
利用边的两端点编号之差不超过 \(13\) 这个性质,直接三进制状压与 \(i\) 相邻的点的染色情况,枚举 \(i\) 染什么色进行转移即可。
时间复杂度 \(O(n3^{13})\)。
T4:不打算补。
11.7
正睿 20 连测 day16
场况
预期 100 + 0 + 20 + 25 = 145。
实际 100 + 0 + 20 + 0 = 120。
rk 42.
T4 怎么读错题了???
题解
T1:有 \(n\) 个数字,每次可以选择两个数字 \(x,y\) 进行合并,变成 \(K-x-y\)。\(q\) 次询问,每次给定 \(K\),最大化 \(n-1\) 次操作后剩下的一个元素大小。\(n,q\le 3\times 10^5\)。
将合并过程建出一棵树,若令根节点深度为 \(0\),则深度为奇数的节点贡献系数为 \(-1\),深度为偶数的节点贡献系数为 \(1\)。叶子节点的贡献是 \(a_i\) 的贡献,非叶节点贡献是 \(K\) 的贡献。
考虑如果确定了有 \(t\) 个贡献为 \(1\) 的非叶节点,则有 \(n-1-t\) 个贡献为 \(-1\) 的非叶节点。
假设有 \(x\) 个深度为奇数的叶子,因为这是一棵完整二叉树,所以我们考察每个非叶节点与其孩子的对应关系,可以得到 \(2t=n-1-t+n-x\),即 \(x=2n-1-3t\)。
既然我们确定了 \(x\),为了使答案最大,一定是选前 \(x\) 大的 \(a_i\) 作为奇数深度的叶子。
记 \(s_i\) 为 \(a\) 升序排序后的前缀和,则对于一个确定的 \(t\),其对应答案为 \(f(t)=(2t-n+1)K+s_n-2s_{3t-n+1}\)。
由于 \(a\) 升序,所以 \(s\) 是下凸的,所以 \(f(t)\) 是上凸的,直接三分求出最大值即可。
时间复杂度 \(O(n\log n)\)。
T2:给定一个序列 \(a\),每次可以花费 \(C\) 的代价随机抽取一个元素,你可以选择保留它并结束游戏,或者丢弃它。\(q\) 次询问,每次给定 \(C\),求最大期望收益。\(n\le 2\times 10^5,q\le 100\)。
每次抽取时设定一个阈值 \(p_i\),如果抽到了前 \(p_i\) 大的元素则结束游戏,否则丢弃它。
随着抽取次数的增加,丢弃的元素也越来越多,期望收益越来越大,所以阈值 \(p_i\) 单调不增。
将 \(a\) 升序排序,设 \(f_i\) 表示倒着考虑到 \(i\) 时的最大期望收益。初始显然有 \(f_n=a_n-C\)。
考虑转移。枚举 \(p_i\),\(f_i=\max_j \frac{s[j,n]}{n-i+1}+\frac{j-i}{n-i+1}f_{i+1}-C\)。
这个式子显然是取最小的 \(j\) 使得 \(a_j\ge f_{i+1}\) 最优。
由于有 \(p_i\) 单调不增的结论,可以直接双指针优化到线性。
时间复杂度 \(O(qn)\)。
T3:给定一棵树并指定它的 dfs 序,多次询问,每次给出 dfs 序上的 \(k\) 个两两不交的区间,求这些区间的并集的导出子图的连通块数量。强制在线。\(n,q,\sum k\le 5\times 10^5\)。
先考虑如果只有一个区间该怎么做。显然 dfs 序的一个区间由若干个子树构成。记 \(nxt_i\) 表示 dfs 序上 \(i\) 后面第一个不在 \(i\) 子树内的位置。那么我们从区间左端点开始一直往右跳,看跳了几次跳出区间即可。这个过程可以倍增优化,所以我们可以 \(O(\log n)\) 求出一个区间的答案。
再考虑处理多个区间。我们需要扣掉算重的部分。考虑维护一个栈,表示当前需要扣掉的区间。每次从取栈顶的区间扣掉它带来的算重的部分,直到栈顶区间的右端点不小于当前区间右端点时,所有算重的部分都已经扣掉了。最后再往栈中加入当前区间带来的需要扣掉的部分即可。
时间复杂度 \(O(\sum k\log n)\)。
T4:给定正整数 \(n\),求构造一张边数尽量多的简单图,使得每条边恰好属于一个三元环。
题解的构造方式看不懂捏。
但是直接嗯随机生成三角形,判一下合不合法即可过题 /cy
11.10
正睿十连测 day10
场况
预期 100 + 8 + 0 + 32 = 140。
实际 100 + 4 + 5 + 32 = 141。
rk 47.
T2 没输出操作数量挂了 4 分 /ll
题解
T1:简单经典题。略。
T2:不打算补。
T3:
T4:区间所有子区间的最大子段和之和。\(n,q\le 2.5\times 10^5\)。
11.11
正睿 20 连测 day17
场况
预期 100 + 20 + 10 + 10 = 140。
实际 100 + 20 + 0 + 10 = 130。
rk 38.
题解
T1:挺唐的题。略。
T2:给定 \(n\) 个字符串 \(s_i\) 和 \(m\) 个字符串 \(t_i\),求有多少二元组 \((i,j)\) 使得字符串 \(s_i+t_j\) 存在长为 \(k\) 的 border。\(n,m\le 10^6\)。
对 \(s,t\) 长度是否小于 \(k\) 进行分讨即可。map + 哈希统计答案。
巨大难写难调史题。。。
记串长之和为 \(S\),时间复杂度 \(O(S\log S)\)。
T3:不打算补。
T4:不打算补。
11.12
正睿 20 连测 day18
场况
题解
T1:
T2:
T3:
T4:
11.13
正睿 20 连测 day19
场况
预期 100 + 8 + 19 + 20 = 147。
实际 100 + 8 + 19 + 10 = 137。
rk 19.
打成这样也能 rk 19,搞笑了。
题解
T1:比较容易,略。
T2:
T3:不打算补。
T4:不打算补。
11.14
正睿 20 连测 day20
场况
预期 100 + 100 + 30 + 0 = 230。
实际 100 + 100 + 30 + 0 = 230。
rk 52.
T1 T2 都是最后 1h 过的,大家觉得呢。
导致 T4 暴力没时间写了 /ll
输麻了,怎么大家全都会三个题?
题解
T1:给定两个 01 串 \(s,t\),每次操作可以选择 \(s\) 的一个子序列并将其循环左移一位。问至少操作多少次能使 \(s,t\) 相同。\(n\le 10^6\)。
发现当子序列是 01 交替时,可以做到此次操作对每个位置都有用。
进一步地,我们把 \(s,t\) 不同的位置拎出来,将需要把 0 改成 1 的称为 A,需要把 1 改成 0 的称为 B,则最优策略是每次选择一个长度为偶数的 AB 交替子序列进行操作。
直接贪心地做就好了。
时间复杂度 \(O(n\log n)\) 或 \(O(n)\)。
T2:简单 dp 题,直接写出朴素 dp 式子然后单调队列优化即可。略。
T3:给定两个长度为 \(n\) 的序列 \(a,b\) 及正整数 \(k\),将 \(a\) 任意重排,最小化 \(\sum\lceil\frac{\max(0,b-a)}k\rceil\)。\(n\le 10^5\)。
上取整的性质没有下取整好(例如已知 \(a+b\le c\) 可以得出 \(\lfloor\frac a k\rfloor+\lfloor\frac b k\rfloor\le \lfloor\frac c k\rfloor\),但无法得出上取整的类似结论),所以考虑先把 \(b_i\) 都加上 \(k-1\) 转成下取整。
将 \(a\) 和 \(b\) 合在一起从小到大排序,考虑贪心地匹配。
对 \(a,b\) 各维护一个还为匹配的集合。
扫到一个 \(a\) 时,若前面有未匹配的 \(b\),则随便选一个匹配就好了,因为这带来的代价为 \(0\)。否则将其放入未匹配的 \(a\) 的集合。
扫到一个 \(b\) 时,如果前面没有未匹配的 \(a\),则将其放入未匹配的 \(b\) 集合;否则从未匹配的 \(a\) 中找一个 \((b-a)\bmod k\) 最大的 \(a\) 进行匹配。
感性上理解这样是最优的,严谨证明可以调整法。其实也挺好证的。
时间复杂度 \(O(n\log n)\)。
T4:不打算补。
11.15
校内训练 20241115
场况
预期 100 + 16 + 23 + 0 = 139。
实际 100 + 16 + 26 + 0 = 142。
史中史。。。
5.0 7.5 8.0 9.0,std 加起来 30+KB,大家觉得呢。
题解
T1 是容易的,T2 T3 T4 是不可做的。所以全都略。/cy
11.17
正睿十连测 day11
场况
预期 100 + [85,100] + 100 + 28 = [313,328]。
实际 100 + 50 + 100 + 28 = 278。
rk 18.
吗的,T2 dsu on tree 写挂了 /ll/ll/ll
树上 mex 不会线性,就像,中间忘了,他整个人的层次就卡在这里了,只能度过一个相对失败的人生。
题解
T1:给定一个序列,有一个区间,初始为 \([1,n]\),需要进行 \(k\) 次操作,每次操作将区间改为它的一个子区间(可以为自身)。求所有情况下最后区间中的数之和的和。\(n\le 5\times 10^5\)。
对每个数计算贡献次数。等价于选 \(k\) 个包含 \(i\) 的区间,容易发现左右端点相互独立。
考虑计算左端点个数。相当于有 \(i\) 种物品,每种可以无限选,总共要选 \(k\) 个的方案,即 \(\binom{i+k-1}{i-1}\)。
右端点同理。\(k\) 比较大,可以转成下降幂来求组合数。
时间复杂度 \(O(n)\)。
T2:求树的每一棵子树的点权 mex。\(n\le 2\times 10^6\)。
dsu on tree、线段树合并、区间 mex 等等方法都容易做到 \(O(n\log n)\),但无法通过此题。
首先显然有 \(f_{fa}\ge f_u\)。dfs 时先令 \(f_u\gets\max f_v\),然后暴力更新 \(f_u\),暴力更新的总次数是 \(O(n)\) 的。
现在我们只需要支持 \(O(1)\) 查询颜色 \(c\) 是否在 \(u\) 的子树内出现过。
其实只需要维护每种颜色最后一次出现的 \(dfn\),若大于等于 \(dfn_u\) 则在 \(u\) 的子树内出现过。
时间复杂度 \(O(n)\)。
T3:给定 \((0,0)\sim(n+1,n+1)\) 的网格图,其中 \((1,1)\sim (n,n)\) 的每个格子都有一个颜色,对每种颜色求出若将这种颜色的所有格子都设为障碍,那么从 \((0,0)\) 走到 \((n+1,n+1)\) 的方案数是多少。\(n\le 500\)。
假设当前颜色有 \(m\) 个格子,那么有一种 \(O(m^2)\) 求出答案的做法(Grid 2),以及一种 \(O(n^2)\) 的暴力。
考虑对于 \(m\ge n\) 的颜色使用暴力,其余使用 \(O(m^2)\) 的做法。
\(m\ge n\) 的颜色至多 \(n\) 种,所以复杂度 \(O(n^3)\)。
\(m\lt n\) 的部分,由于 \(\sum m^2\lt\sum nm=n\sum m\le n\times n^2\),所以复杂度也是 \(O(n^3)\)。
所以时间复杂度 \(O(n^3)\)。
T4:不打算补。
11.18
校内训练 20241118
场况
预期 100 + 0 + 0 + 0 = 100。
实际 90 + 0 + 0 + 0 = 90。
题解
T1:谔谔题。在 yzoj 上写了题解。
T2:给定一个括号序列,求有多少个下标集合使得只交换集合中的下标上的元素可以使序列变为合法括号序列。\(n\le 3000\)。
假如给定了集合,那么把左括号尽量往前放一定不劣。于是交换后的集合中的元素一定是一段左括号加上一段右括号。
将左括号视为 \(1\),右括号视为 \(-1\),设 \(f_{i,j}\) 表示考虑到 \(i\),当前选进集合的全都定为左括号,和为 \(j\) 时的方案数。
类似地,将左括号视为 \(-1\),右括号视为 \(1\),设 \(g_{i,j}\) 表示倒着考虑到 \(i\),当前选进集合的全为右括号,和为 \(j\) 时的方案数。
\(f,g\) 可以 \(O(n^2)\) dp。
统计答案时枚举集合中第一个右括号在哪里,合并 \(f,g\) 即可。
总时间复杂度 \(O(n^2)\)。
T3:给定一棵奇数个节点的树,一些节点上有棋子,每次一颗棋子可以移动到与它相邻的一个没有棋子的点上,代价为经过的边的边权。求最小的代价使得整棵树上只存在一条边使得它的一端点有棋子且另一端点没有。\(q\) 次修改某条边的边权,需要在每次修改后求出答案。\(n,q\le 4\times 10^5\)。
把有棋子的点视为黑点,没有的视为白点,则需要使黑点构成一个连通块。
连通块是不好处理的。考虑节点个数为奇数这个条件怎么用。
不妨设黑点个数小于白点个数(否则交换颜色),找出树的重心作为根,则黑点必然在一棵子树内。
一棵子树 \(sub(u)\) 的答案,即为子树内白点移动到 \(u\) 的代价加上子树外黑点移动到 \(u\) 的代价。
设共有 \(k\) 个黑点,\(u\) 子树内有 \(c_u\) 个黑点,考虑边 \((fa_x,x)\) 的权值加上 \(y\) 带来的影响。
- 对于 \(x\) 子树内的 \(u\),\(x\) 子树外的黑点移动到 \(u\) 的代价增加,所以 \(u\) 的答案增加 \(y\times(k-c_x)\)。
- 对于 \(x\) 的祖先 \(u\),\(x\) 子树内的白点移动到 \(u\) 的代价增加,所以 \(u\) 的答案增加 \(y\times(sz_x-c_x)\)。
- 对于其它的 \(u\),\(x\) 子树内的黑点移动到 \(u\) 的代价增加,所以 \(u\) 的答案增加 \(y\times c_x\)。
容易发现只有大小为 \(k\) 的子树才可能成为答案,而 \(x\) 的祖先中至多只有一个点满足这个条件,所以我们对每个点预处理出这个符合条件的祖先,那么就只需要支持区间加与全局最小值,线段树维护即可。
时间复杂度 \(O(n\log n)\)。
T4:不打算补。
正睿 20 连测附送赛 day1
题解
11.19
校内训练 20241119
场况
预期 100 + 100 + 20 + 30 = 250。
实际 100 + 100 + 20 + 30 = 250。
题解
T1:给定 \(1\sim n\) 的排列,每次操作可以选择一个位置 \(i\),交换 \(i,i+1\) 上的数。求最少操作次数使得除了 \(n\) 外不存在一个前缀是一个排列。如有多种操作方案,求出字典序最小的一种。\(n\le 10^5\)。
考察一次操作带来的影响,可以发现它至多使 \([1,i]\) 这个前缀由不合法变为合法。所以操作数下界即为初始不合法前缀数。
考虑如何达到这个下界。发现如果前缀 \([1,i]\) 构成排列,那么 \(i+1\) 位置上的数必然大于 \(i\),所以交换 \(i,i+1\) 必然能使 \([1,i]\) 变为合法的。
所以直接从前往后做,发现一个不合法前缀就直接进行操作即可。
时间复杂度 \(O(n)\)。
T2:简单题,感觉比 T1 简单。略。
T3:求有多少个序列 \(a[0,n+1]\),满足 \(a_0=a_{n+1}=0 \land a_i\ge 0\land \sum_{i=1}^{n+1}\max(0,a_i-a_{i-1})=m\)。\(n,m\le 2\times 10^5\)。
考虑对 \(a\) 进行差分,得到序列 \(b[1,n+1]\),则需要满足 \(\sum b_i=0\land \sum |b_i|=2m\land\forall i\in[1,n+1], \sum_{j=1}^ib_j\ge 0\)。
有一个叫 Raney 引理的东西:对于一个和为 \(1\) 的整数序列,它恰有一种循环移位使得所有前缀和都大于 \(0\)。
证明:找到原序列前缀和的最后一个最小值,将其作为循环移位的起点。则由于原序列和为 \(1\),所以其它的前缀和最小值都加上了 \(1\),也就都变成正的了,而非前缀和最小值的位置就更大了。而如果我们选的不是这个位置,则必然存在一个位置的前缀和 \(\le 0\)。
于是我们可以考虑将 \(b_1\) 加一,那我们就只需统计长为 \(n+1\) 且和为 \(1\) 且绝对值之和为 \(2m+1\) 的序列个数,最后除以 \(n+1\) 即为答案。
考虑枚举负数的个数,可以得到负数的绝对值之和为 \(m\),其他数之和为 \(m+1\),利用插板法可以得到答案为:
时间复杂度 \(O(n)\)。
T4:不打算补。

正如 ioi
浙公网安备 33010602011771号