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 即可。
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\) 次操作。
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|}\) 即可。

浙公网安备 33010602011771号