7.17 做题记录

发布时间 2023-07-17 20:23:31作者: Rain__Song

CF643G Choosing Ads

\(p > 50\) 是经典的摩尔投票法,每次删掉两个不同的数,最后剩下的即为答案。

\(k = \left\lfloor \frac{100}{p} \right\rfloor\),每次删除 \(k+1\) 个数,可以证明最后对的数会留下来,使用线段树 \(O(k ^ 2)\) 合并区间,总时间复杂度 \(O(n \log n \times k^2)\)

总结:

  • 严格众数及其扩展可以直接上摩尔投票
  • 一些常见做法的扩展形式也许是对的

P8990 [北大集训 2021] 小明的树

白点给出了对子树的约束,带修使得我们很难刻画白点的限制,于是考虑黑点,一棵树是美丽的,当且仅当每个黑点没有白点祖先,即黑点连通。

\(b_i\) 为点 \(i\) 被点亮的时刻,\(c_i\)\(i\) 时刻黑点联通块数量,初始 \(c_i = i\),我们有结论:联通块数 \(= |V| - |E|\),现在只需要统计每个时刻两端都是黑点的边数。

做补集转化,统计每个时刻两端颜色不同的边的数量,设为 \(v_i\),一条边两端颜色不同的时刻是 \(\min(b_u, b_v) \to \max(b_u, b_v) - 1\),答案即为所有 \(c_i = 1\)\(v\) 之和,使用线段树维护区间 \(\min\) 及数量,权值,时间复杂度 \(O(n \log n)\)

总结:

  • 二要素问题的补集转化,视角切换(也可以扩展到多个)

P6775 [NOI2020] 制作菜品

题目中的菜品 - 原料构成一组类似匹配的关系,在 \(m\) 远大于 \(n\) 时我们有把小的原料匹配菜品的贪心,这样就可以转化到 \(n,m\) 接近的情况。

  • \(m = n - 1\)

考虑归纳,取剩余质量最小的食材,如果质量 \(\geq k\),那么一定有 \(m⩾n\),那么我们把这道菜全部用这个食材做,那么 \(m\) 减小 \(1\),依旧满足 \(m\geq n−1\);如果质量 \(<k\),我们再取质量最大的菜,不难证明两种菜的质量加起来一定 \(\geq k\),这样就相当于把第一种菜用掉,然后剩余要做的菜 \(−1\),即 \(m,n\) 均减小 \(1\),规约到 \(n=2\),一定有解,数据结构维护贪心,复杂度 \(O(n \log n)\)

  • \(m > n - 1\)

不难通过一开始的贪心策略归约到上述情况。

  • \(m = n - 2\)

这里有一个图论上的观察,对每种原料建图,如果两种原料在一道菜里同时选用则连一条边,至多 \(n-2\) 条边,于是至少有两个联通块,即划分成两个 \(m = n - 1\) 的子问题,设每种食材的权值为 \(d_i −k\),那么就相当于问有没有一个子集的权值和为 \(−k\),这是一个可行性背包,可以使用

\(\text{std :: bitset}\) 优化,时间复杂度 \(O(\frac{n ^ 2k}{\omega})\)

总结:

  • 类似隐式匹配可以考虑建图 / 贪心
  • 从特殊情况入手,或者将其他情况规约

[AGC030D] Inversion Sum

因为 \(n\) 很小,考虑直接枚举位置对 \((i, j)\)\(1 \le i,j \le n\))以统计逆序对。

考虑一个概率 dp:令 \(f_{i,j}\)\(1 \le i, j \le n\))为当前时刻,\(a_i \le a_j\) 的概率,最后所有 \(i < j\)\(f_{i,j}\) 之和 \(\times 2^q\) 即为答案。

每次操作只有 \(i,j\) 至少有一个等于 \(x_i,y_i\) 的位置会发生改变,暴力转移,时间复杂度 \(O(n^2)\)

总结:

  • 考虑 dp 状态记录 \(i,j\) 能否表出答案

P8860 动态图连通性

\(m=q\),且 \(x_1\sim x_n\) 构成一个排列,不难发现该问题等价于原问题。

考虑实际上我们最后只会保留一条从 \(1\)\(n\) 的路径,也就是说我们只需要求出这条路径是由哪几个点组成的即可,我们设一条路径上第 \(i\) 条边的边权为 \(2^i\),即字典序最短路问题。

使用主席树维护哈希值,线段树二分以实现 Dijkstra 的比较,时间复杂度 \(O(n \log n \log m)\)

总结:

  • 判定条件可能和答案 / 性质的形式对应

CF704B Ant Man

\(a_i=a_i+x_i,b_i=b_i-x_i,c_i=c_i+x_i,d_i=d_i-x_i\) ,则

\[w(i,j)=\begin{cases}d_i+a_j,i <j\\c_i+b_j,i>j\end{cases} \]

只需要确定每个 \(i\) 的出边,入边。

这是一个经典的连续段 dp,设 \(f_{i,j}\) 表示加入前 \(i\) 大的数,有 \(j\) 条链的答案,讨论 \(i\) 的出入边转移,时间复杂度 \(O(n^2)\)

总结:

CF1774G Segment Covering

题目中要求的是一个偶数减去奇数的形式,这启发我们如果有什么性质能让两种分别为奇偶的方案配对,那这两种方案就没有贡献。

区间问题可以先考虑相交包含关系,如果区间 \(a\) 包含 \(b\),那么删去 \(a\) 对答案是没有影响的,这是因为如果选了 \(a\),选不选 \(b\) 的两种方案抵消了。

删去包含其他区间的区间后按左端点排序,此时右端点也有序,考虑三个区间 \(x,y,z\),其中 \(l_x < l_y < l_z < r_x\),如果 \(x,z\) 的并包含了 \(y\),可以删去 \(z\),理由同上。

对于一组询问,我们找到最左的两条线段,依次找到第一条左端点大于其右端点的线段,最后总的线段个奇偶性即为答案,这个过程可以用倍增优化。

实现上注意判断边界情况,复杂度 \(O(n \log n)\)

总结 :

  • 奇偶相减的形式除了 \(\text{LGV}\) 还可以考虑找性质配对方案。
  • 区间问题可以先考虑相交包含关系