CF 杂题乱做 #2
CF 杂题乱做 #2
今天只有残留的躯壳
迎接光辉岁月
风雨中抱紧自由
Problem A. CF2191D2 Sub-RBS
先考虑 D1。枚举 \(s,t\) 第一个不相同的位置 \(p\),那么 \(s_i=)\),\(t_i=(\)。设当前 \(t\) 有 \(x\) 个未匹配左括号,那么就需要在 \(p\) 后面找出 \(x\) 个右括号。显然这些右括号越靠后越优。
设第一个右括号位置为 \(q\),那么还要从 \([p+1,q-1]\) 中找出一个最长的子序列,使得拼上它依然是合法括号串。由于 \(s\) 本身是合法的,\([p+1,q-1]\) 必定可行(相当于 \(p\) 前面删除了 \(y\) 个右括号,\(q\) 后面删除了 \(y\) 个左括号,剩下部分仍然合法)。枚举 \(p\) 算答案即可。
再考虑 D2。可以发现,若 \(p\) 前面删除了 \(>1\) 个右括号一定不优,否则只删除最后一个一定不劣。进一步地,可以发现,若 \(t\) 合法且包含 \()((\) 作为子序列,则答案为 \(|t|-2\),否则为 \(0\)。以此做 dp 即可。
Note:对 RBS 的理解不够深刻。
Problem B. CF2191E Comparable Permutations
若 \(p\) 已知,那么枚举 \(p,q\) 第一个、最后一个不相同的位置,设为 \(i,j\)。那么需要 \(q_i>p_i,q_j>p_j\)。将 \([i,j]\) 中最小的比 \(p_i\) 大的元素放到 \(i\),其余升序排列即可。容易看出 \(i,j\) 合法的充要条件为 \(p_i,p_j\ne \max_{i\le k\le j} a_k\)。
我们希望 \(i\) 尽量靠后,在此基础上 \(j\) 尽量靠后。从后向前枚举 \(i\)。维护 \([i,n]\) 的单调递增栈,找到最后一个不在栈内的位置 \(j\),合法当且仅当 \(j\) 在栈的次顶元素之后。继续发现,若次顶元素不是 \(i+1\) 那么 \(i\) 一定不优,若 \(i+2\) 在栈内一定不优。 也就是说,\(i\) 就是最后一个满足 \(a_i<a_{i+1},a_{i+1}>a_{i+2}\) 的位置。
\(n\) 次询问找到 \(i\),后面的元素一定先递减再递增,可以 \(n\) 次操作排序,然后再 \(n\) 次操作找到第一个比 \(p_i\) 大的 \(j\),共 \(3n\) 次操作。
Note:寻找最优解结构,及时排除不优选项。
Problem C. CF2191F Prufer Vertex
\(P(T)\) 就是从 \(n\) 到 \(n-1\) 路径上第二个节点。
首先判掉 \(n,n-1\) 在一个连通块里的情况。
枚举 \(v\),若 \(n,v\) 不连通就用一条边连起来。然后来算 \(n-1\) 连到 \(v\) 子树内的方案数。设 \(n\) 所在连通块为 \(C\)。首先把 \(C\) 之外的该连的连,然后把得到的新连通块直接连到 \(C\) 上。可以发现,\(n-1\) 所在的连通块连到哪一个点上方案数都相同。所以设 \(v\) 子树集合为 \(S\),合法方案占总方案的 \(\frac{|S|}{|C|}\)。
分讨 \(v,n-1\) 是否连通,算出总方案数,乘上 \(\frac{|S|}{|C|}\) 即可。
Note:没发现 \(C\) 中点的对称性。
Problem D. CF2191G Median Permutation
牛题。
若 \(f(p)_i=f(p)_j\),那么 \(|i-j|\le 2\)。对所有不合法情况讨论:
-
\(f(p)_{i-1}=f(p)_{i+1}=i\)。此时 \([i-2,i+2]\) 这 \(5\) 个元素构成一个 W 形或 M 形。
假设 \(p_{i-2},p_{i+2}>p_i\),要想合法,\(p_{i-1},p_{i+1}>p_i\)。所以 \(i\) 不会出现在 \(f(p)\) 里,即 \(p_i=1\)。
若 \(p_{i-2},p_{i+1}<p_i\),合法则 \(p_i=n\)。
-
\(f(p)_{i-1}=f(p)_i\)。此时 \([i-2,i+1]\) 四个元素构成 ^ 或 v 形。
假设 \(p_{i-2}<p_{i}\)。若 \(p_{i-1}<p_{i+1}\) 必定合法;否则,只有 \(\left<1,4,2,3\right>,\left<3,2,4,1\right>\) 合法,即 \(p_{i-1}>p_{i-2}\land p_{i+1}>p_i\) 或 \(p_{i-1}<p_{i-2}\land p_{i+1}<p_i\)。
继续得出结论:
-
对奇偶下标进行分类,每一类都是单峰或单谷。
-
设 \(p_x=1\)。若 \(x\) 为奇数,必定有 \(p_1<p_2\),否则 \(p_1>p_2\)。
-
若 \(n-x+1\) 为奇数,必定有 \(p_n<p_{n-1}\),否则 \(p_n>p_{n-1}\)。
这样就可以拆出两条 从 \(1\) 开始、从 \(n\) 结束、元素递增 的链(下标不一定单调)。向链里填数的过程可以看做在二维格点上走,有若干条必须经过的边,二项式系数计算即可。
Note:分讨出不合法的情况,却没有看到深层的性质。没有想到按奇偶性讨论。
Problem E. CF2187B Shortest Statement Ever
判掉 \(X \& Y=0\) 的情况。
记 \(X\& Y\) 的最高位为 \(2^b\)。拆开绝对值:
-
\(p\le X\land q\le Y\)。此时要最大化 \(p+q\)。将 \(p\) 的 \(2^b\) 位设为 \(0\),低位全 \(1\),\(q\) 的 \(2^b\) 位设为 \(1\),低位全 \(0\) 即可。
-
\(p\ge X\land q\le Y\)。找到一位 \(>2^b\) 的 \(X\) 为 \(0\) 的位 \(2^c\),将其设为 \(1\),低位全设 \(0\)。此时 \(q\) 可以不变。
-
\(p\le X\land q\ge Y\),对称。
-
\(p\ge X \land q\ge Y\),需要分别找。
直接枚举是 \(O(\log^2 V)\) 的。
第四种情况一定不优于二、三:较低的那个可以不变。降为 \(O(\log V)\)。
二、三只有 \(2^{b}\) 上面第一个为 \(0\) 的有用:变更更高的位代价一定 \(\ge 2^{b+1}\),而第一种代价一定 \(\le 2^{b+1}\)。
只有三种情况,\(O(1)\)。
Problem F. CF2187D Cool Problem
???
只有正负号不一样,所以
只需求出 \(c_n\) 的所有取值。\(c_n=ax+by\),其中 \(b\in\{0,1\}\)。bitset 优化。
Note:\(x=\frac{x+y}{2}+\frac{x-y}{2},y=\frac{x+y}2-\frac{x-y}{2}\);同构。
Problem G. CF2187E Doors and Keys
这个人会因为要拿钥匙而回去,不太好处理。
改变贡献计算方式,考虑穿过某道门多少次。若携带 \(j\) 个钥匙穿过,那么产生 \(\max(1,2j-1)\) 的代价。
所以我们可以把钥匙一次性都带到身上。设 \(f_{i,j}\) 为走到 \(i\),身上有 \(j\) 个钥匙的最小代价,转移平凡。
继续观察,若身上携带 \(j\) 个钥匙,则要消耗 \(2j-1,2j-3,\cdots\) 的代价,这也意味着身上不会携带超过 \(\sqrt{\max(a_i)}\) 个钥匙,否则不如等着门开。降为 \(O(n\sqrt{a_i})\)。
Note:拆贡献;等差数列与根号。
Problem H. CF2187F1 Al Fine
首先重标号把 \(a\) 变为 \(\{1,2,3,\cdots,n\}\)。
Dfs 序,可以用来刻画子树。若 \(a[l,r]\) 对应一棵子树,那么需要存在 \(b\) 的一个区间 \([L,R]\),使得 \(b_L=\min_{i=L}^R b_i=l\),且 \(\max_{i=L}^R b_i-\min_{i=L}^R b_i=r-l=R-L\)。
也就是说,\(b[L,R]\) 能够对应一棵子树,当且仅当 \(b_L=\min_{i=L}^R b_i,\max_{i=L}^R b_i-\min_{i=L}^R b_i=R-L\)。
对于一个 \(L\),我们希望其对应的 \(R\) 尽量大。与其把右边一段另化为若干棵子树,不如直接包含进来。令 \(f_L\) 表示最大合法 \(R\),所有的 \([i,f_i]\) 一定要么相离,要么包含,用栈模拟一下 dfs 过程即可求最大深度。
接下来求 \(f_L\)。注意到 \((\max_{i=L}^R b_i-\min_{i=L}^R b_i)-(R-L)\ge 0\),线段树+单调栈维护这个,区间查询最后一个 \(0\) 的位置即可。
Note:dfs 序与子树。
Problem I. CF2176F Omega Numbers
一开始还在想 \(\omega(xy)\) 就是把两个质因子集合取并,然后由于可能的元素有很多,所以没法直接做。没发现 \(|A_i \cap A_j|=\omega(\gcd(a_i,a_j))\)。
观察 1:\(\omega(xy)=\omega(x)+\omega(y)-\omega(\gcd(x,y))\)。
观察 2:\(\omega(a_i)\le 6\)。
所以只需要对于每个 \(c,d\) 求出 \(\omega(a_i)+\omega(a_j)=c\) 而且 \(\gcd(a_i,a_j)=d\) 的 \(i,j\) 对数即可。
\(\gcd(a_i,a_j)=d\) 不好做,但是 \(d\mid \gcd(a_i,a_j)\) 是好做的,只需 \(d\mid a_i \land d \mid a_j\)。可以狄利克雷后缀和求出。然后再做一次狄利克雷差分计算最终答案。
Problem J. CF1536E Omkar and Forest
???
确定了 \(0\) 的位置之后,非零的值就确定了,一定是到最近的 \(0\) 的距离(考虑它从 \(0\) 一路增长过来的过程)。
由于不可能全为 \(0\),所以答案为 \(2^{c_\#}-[c_\#=nm]\)。
Problem K. CF2193H Remove the Grail Tree
首先把所有的 \(a_i\) 变为 \(a_i \bmod 2\)。设 \(b_i\) 为 \(i\) 和其邻居的 \(a\) 异或和,那么 \(i\) 可删除当且仅当 \(b_i=1\)。删除 \(i\) 后,若 \(a_i=1\),那么翻转所有邻居的 \(b_x\),否则没有影响。
执行树形 dp 来判定是否有解。每个点有三种状态:\(0\) 表示无解,\(1\) 表示必须先于父亲删除,\(2\) 表示必须后于父亲删除,\(3\) 表示都可以。
只需对先于父亲、后于父亲判定是否可行即可。可行当且仅当 \(b'_x=1\),或者存在一个儿子 \(y\) 满足 \(f_y=3\land a_y=1\)。
最后做一遍拓扑排序求最终操作序列就做完了。
Problem L. CF2084E Blossom
把贡献拆给每个子区间,再把 \({\rm mex}(l,r)\) 拆为 \(\sum_{v\ge 0} [{\rm mex}(l,r)> v]\)。
枚举 \(v\),这要求 \([0,v]\) 都要出现。只有完全包含已经出现的 \([0,v]\) 内的所有元素,\(l,r\) 才合法。对于合法的 \(l,r\),设 \(c_1\) 为 \(a[l,r]\) 内 \(-1\) 个数,\(c_2\) 为 \([0,v]\) 中未出现的个数,\(c_3\) 为序列内 \(-1\) 总个数,那么方案数为 \(\binom{c_1}{c_2}\times c_2! \times (c_3-c_2)!\)。
直接做是 \(O(n^3)\) 的。对于固定的 \(v\),其 \(c_2\) 的值是固定的,那么只需要对于每个 \(c_1\) 统计 \(l,r\) 的数量即可。\(v\) 增大,合法区间集合只会缩小,可以均摊 \(O(n^2)\) 维护。最后简单统计一下答案就行了。
拆贡献,寻找固定值、单调值。
Problem M. CF2066D2 Club of Young Aircraft Builders
考虑转化一下条件:
-
\(1\) 只能填在 \([1,c]\) 内;
-
\(2\) 只能填在 \([1,c+cnt_1]\) 内;
-
\(\cdots\)
所以 \(i\) 只能填在 \([1,c+\sum_{j<i} cnt_j]\) 内。这个条件就舒服多了。
设 \(f_{i,j}\) 为考虑完了 \(1\sim i\),填了 \(j\) 个数的方案数,转移系数是简单的二项式系数。\(O(n^2c^2)\)。
Problem N. CF2077C Binary Subsequence Value Sum
首先 \(F(v,l,r)\) 就是把 \(0\) 变为 \(-1\) 求和。
然后由于 \(xy\le (\frac {x+y} 2)^2\),所以希望两部分尽量靠近。所以序列权值为 \(\lfloor \frac {sum} 2\rfloor \lceil \frac{sum} 2 \rceil\)。
到这里我选择了直接基于这个 dp,但是会带来冗杂的奇偶性讨论,很不简洁。
当 \(sum\) 为偶时,权值为 \(\frac{sum^2}{4}\);否则为 \(\frac{sum^2-1}{4}\)。\(sum\) 为奇,当且仅当序列长度为奇。而长为奇的子序列共有 \(2^{n-1}\) 个,直接减去即可。那么接下来需要计算 \(sum^2\) 的和。
\((sum^2)=(c_1-c_0)^2=c_1^2+c_0^2-2c_0c_1\)。设序列中共有 \(x\) 个 \(0\),\(y\) 个 \(1\),那么答案为
维护 \(x,y\) 即可。

浙公网安备 33010602011771号