3月CWOI杂题
C0199 【2022 online 提高组】真题
没有改错 qaq 。
B 【2022 online 提高组】讨论
思考这样一个暴力:枚举所有会 \(i\) 这道题的人,把他们按 \(k\) 从小到大排序,可以发现这时他们两两之间一定满足有交集的条件。此时,我们只用检查相邻的两个人间是否能产生讨论即可:假如有 \(x,y,z\) 三人满足 \(k_x\le k_y\le k_z\),且 \(x,y\) 和 \(y,z\) 之间都不会讨论,那么有 \(s_x\subseteq s_y\subseteq s_z\),即 \(x\) 包含于 \(z\),所以他们也不会产生讨论。
考虑优化这个暴力。我们把所有人按照 \(k\) 值从小到大排序,假设当前枚举到了 \(now\) 这个人,记 \(lst_i\) 表示在 \(now\) 之前最后一个会 \(i\) 这道题的人,检查是否有讨论产生就可以遍历 \(s_{now}\),与每道题 \(j\) 的 \(lst_j\) 比较即可。但是判断包含关系还是很困难。我们记 \(cnt_i\) 表示 \(i\) 与 \(now\) 两个人都会的题目的数量,在遍历 \(s_{now}\) 的时候可以顺便求出 \(cnt_j\)。这样,我们判断是否包含就可以判断 \(cnt_{lst_j}\) 是否小于 \(k_{lst_j}\)。
C 【2022 online 提高组】如何正确地排序
正难则反,总贡献减去不会成为 \(\min/\max\) 的数。 \(B_i+B_j\) 不会产生贡献的条件就是存在 \(A_i+A_j,C_i+C_j\) 满足 \(\begin{cases}A_i+A_j\le B_i+B_j\\B_i+B_j\le C_i+C_j\end{cases}\),移项可得 \(\begin{cases}A_i-B_i\le B_j-A_j\\B_i-C_i\le C_j-B_j\end{cases}\)。两边的项都只和 \(i,j\) 有关系,可以直接算出来。枚举 \(A,B,C\),这就是一个二维数点。注意相等会算两遍,我们可以钦定行数大的更大。因为有负数,要开两倍空间。
C0204 【0311 C组】模拟测试
简单的就一笔带过。
A 【0305 C组】树上的数
暴力 \(\mathcal{O}(n^2)\) 做法很简单,发现一个点如果置为 0,那么我们就不需要继续访问它的子树了。复杂度优化为 \(\mathcal{O}(n)\)。
B 【0305 C组】时代的眼泪
考虑先求出以 1 为根的答案再换根,显然固定根节点时答案可以 \(\mathcal{O}(n\log n)\) 求。令节点 \(u\) 的答案为 \(ans_u\),则 \(ans_u=ans_{fa}+\sum\limits_{i=1}^n(w_i<w_u)-\sum\limits_{j}(w_j<w_u)-\sum\limits_{k}(w_k<w_{fa})\)。其中 \(j,k\) 是 \(u\) 子树内的点且不包含 \(u\)。
解释一下:换根的时候要加上子树外 \(<w_u\) 的点,减去子树内 \(<w_{fa}\) 的点,化简就是上式。总时间复杂度 \(\mathcal{O}(n\log n)\)。略微卡常。有一个小优化:\(ans_1\) 等于每个点的上式中第三部分之和。
C 【0305 C组】传统艺能
首先在没有修改的时有基础 dp:定义 \(f_i\) 表示 \([l,i]\) 中本质不同子序列个数(包含空子序列),\(lst_{A/B/C}\) 表示上一次出现 \(A/B/C\) 的位置,转移就是 \(f_i=2\times f_{i-1}-f_{lst_{s_i}}\),其中 \(f_{l-1}=0\),答案就是 \(f_r-1\)。发现线段树维护矩阵即可维护修改/区间查询。更具体地说,维护矩阵 \(\begin{bmatrix}f_i&f_{lst_A}&f_{lst_B}&f_{lst_C}\end{bmatrix}\)。以 \(s_i=A\) 为例,转移的时候乘上 \(\begin{bmatrix}2&1&0&0\\-1&0&0&0\\0&0&1&0\\0&0&0&1\end{bmatrix}\) 转移,其他时候同理。
D 【0305 C组】铺设道路
先把区间减的操作转化成差分数组上的操作。记差分数组为 \(c\),则每次选择相当于选 \(l,r\in[1,n+1]\),令 \(c_l\leftarrow c_l-1,c_r\leftarrow c_r+1\),代价为 \((r-l)^2\),目标是把 \(c_1,c_2\dots c_{n+1}\) 都变成 0。显然最小时间是我们不浪费每一次操作,相当于每次都会让一个 \(c_i<0\) 的 \(i\) 加 1,那么最小时间就是 \(\sum\limits_{i=1}^{n+1}\max(0,-c_i)\)。
思考怎么求最小/最大消耗。以最小为例,对于每个 \(c_i<0\) 的 \(i\),考虑贪心地选取最远的 \(c_j>0\) 的 \(j\) 并与之匹配,最大就是选最近。证明这是最小消耗很简单:假如有 \(a,b,c,d\) 满足 \(a<b<c<d\) 且 \(c_a,c_b>0,c_c,c_d<0\),那么有显然有 \((a-c)^2+(b-d)^2>(a-d)^2+(b-c)^2\)。证明可以构造出方案也很简单:根据查分的定义有 \(\sum\limits_{i=1}^mc_i=a_m\),故任意 m 都有 \(\sum\limits_{i=1}^mc_i\ge0\),即不会出现负的比正的多的情况。维护用 deque 即可。
C0209 【0321 C组】模拟测试
A 【0405 C组】旅行规划
观察可知答案是 \(w\) 之和。
B 【0405 C组】括号
有结论:
-
括号只会加在负号后面,因为加在正号后面没有意义;
-
最优解最多需要两层括号,因为只需要两个负号就可以让后缀全部变成正的:

枚举加第一层括号的位置,前面后面的和都可以直接算出来,代价就是当前位置和下一个负号之间的正数。
C 【0405 C组】杨辉三角
瞪眼得到当 \(k\le\left\lfloor\frac{n}{2}\right\rfloor\) 时先向下走再右下走最优,反之先右下再向下最优。因为杨辉三角的对称性,第二种情况可以转化成前者。答案就是 \(n-k+\sum\limits_{i=0}^k\dbinom{n-i}{k-i}=n-k+\dbinom{n+1}{k}\)。因为模数 \(p\le10000\) 且为质数,可以用 Lucas 定理计算组合数。直接在线预处理会超时,可以离线下来或者对所有可能的质数都预处理一遍。
D 【0405 C组】蘑菇
期望就等于总的贡献再除去概率,可以最后考虑分母。连通块大小之积的组合意义就是求在每个块中选一个点的方案数,定义 \(f_{u,0/1}\) 表示 \(u\) 所在的连通块中还没选/选了点的方案数,枚举是否断边即可转移。
C0212 【0326 C组】模拟测试
A 【0429 C组】数列
模拟。
B 【0429 C组】索引
因为严格递增,\(a_i-i\) 不降,可以二分,BIT 维护差分序列。
C 【0429 C组】奇数
莫队。
D 【0429 C组】解谜
瞪眼得到结论。
C0214 【0331 C组】模拟测试
题可以在 luogu/usaco 上找到(P6278,P6279,P6280)。
B 【0331 C组】最喜欢的颜色
题意:\(n\) 头牛都有一种颜色 \(c_i\in[1,n]\)。存在 \(m\) 对关系形如 \((a,b)\) 表示奶牛 \(b\) 仰慕奶牛 \(a\)(可能 \(a=b\)),如果 \(x,y\) 都仰慕一头颜色相同的奶牛,那么他们颜色相同。求给每头牛分配颜色的满足颜色种类最多的字典序最小的方案。\(n,m\le2\times10^5\)。
这个关系就是把一个点的儿子全部合并,并查集启发式合并即可。
C 【0331 C组】锻炼
题意:对于一个初始为 \({1,2\dots n}\) 的序列 \(x\),求所有存在一个长为 \(n\) 的排列 \(a\),至少需要进行恰好 \(k\) 步变换才能回到原序列的所有 \(k\) 的和。\(n\le10^4\),答案对 \([10^8,10^9+7]\) 以内的质数 \(m\) 取模。这里,我们定义一步变换为令所有的 \(x_i\leftarrow x_{a_i}\)。
发现 \(k\) 就是所有环大小的 \(\text{lcm}\),环的和为 \(n\)。因为不够的位置我们可以填 1 凑数,可以只看大小之和 \(\le n\),且每个环的大小是 \(p^c\) 的形式(p 是质数)。定义 \(f_{i,j}\) 表示前 \(i\) 个质数,环的大小之和为 \(j\) 的所有能凑出的 \(k\) 之和。转移就是枚举当前填什么。

浙公网安备 33010602011771号