[炒冷饭] CSP 前的整理总结:好(杂)题整合

把一些有趣题目整理一下。有一些之前已经整理过了。

BZOJ3956 Count

好像是存在巨大无脑数据结构解法。但是我局得这非常野蛮。

首先考虑两遍单调栈,扫出每个位置左侧 / 右侧第一个大于或等于这个位置上的元素的位置。然后我们就得到了所有合法的至多 \(2n\) 个配对。

此时我们再维护两个数组 \(l,r\)\(l_i,r_i\) 分别表示两个端点都在 \(i\) 左侧或右侧的合法配对数量。这个在单调栈扫描过程中前缀 / 后缀和即可。

牛逼操作:对于每次询问 \([ql,qr]\),我们找出区间最大值的位置 \(hp\),然后 \(ans=l_{qr}-l_{hp}+r_{ql}-r_{qh}\)

这是一道李赛题,场上无人 AC。

Luogu P3722 影魔

上面那题的强化版,然而不强制在线,所以强度大大降低力,怎么乱搞都能过。

发现 \(p1\) 就是上一个题,直接套做法。

\(p2\) 离线的话很好维护,扫描线 + 树状数组即可。如果强制在线同样可以大力无脑数据结构,但是也存在和上一个题类似的做法。但是我不会,哈哈。

杜爷好像编出来了,他甚至用 \(O(n)-O(1)~\text{RMQ}\) 拿了 Luogu 最优解。反正我是没听懂他怎么做的……

好像 LOJ 上也有几个老哥写了 \(\text{RMQ}\) 做法,回头我再研究研究……

Luogu P7816 以父之名

idea 确实是好 idea,但是搬 MO 原题的供题人多少沾点。这题甚至还卡常(对于下面这种做法),给我整无语了。

建一个虚点,和原图中所有奇度点连 \(1\) 权边。之后跑欧拉回路,到达一个点时尽量从与入边权值相同的边出去。最后每条边的方向即在 DFS 过程中经过这条边时的走向。

正确性证明:由于题目保证有解,每个点的连边中一定有奇数条 \(1\) 权边。对于有奇数条 \(2\) 权边的点,直接 DFS 显然是对的。对于有偶数条 \(2\) 权边的点,在建虚点后这类点连出的 \(1\) 权边也是偶数条,DFS 后撤走连向虚点的边显然符合题意。

CF1508C Complete the MST

构造策略:令未给定边中某一条边的边权为所有给定边的 \(\text{xor}\) 和,其余边边权全部为 \(0\)。这个很好证。

然后我们考虑如果未给定边成环,相当于那条非 \(0\) 边没啥用,直接合并 \(0\) 权联通块后 \(\text{kruskal}\) 即可。

如果不成环,那我们还得考虑一下那条非零边。\(\text{kruskal}\) 过程中记录没有用到的边,将这些边边权与非零边边权取 \(\min\) 加入答案即可。

还有个问题是 \(0\) 权联通块的合并。这是一个经典题,参见 CF920E。

Luogu P4042 骑士游戏

后效性?发现原图关系比较复杂,但是我们的决策构成一张 \(\text{DAG}\)

建反图,把初始每个元素的 \(K\) 插进一个堆里,用这个堆跑拓扑排序。

CF983E NN Country

倍增优化:\(p_{i,j}\) 表示从 \(i\)\(2^j\) 条路线能走到的最远祖先。对于每次询问令两端点均跳到最接近 \(\text{LCA}\) 的位置。下面我们要解决的问题是最后一步到底需要跳一步还是两步。

离线 \(\text{DFS}\),基于 \(\text{DFS}\) 序建主席树。问题转化为二维数点。

LOJ#2743 摩天大楼

从小到大加入每一个元素。考虑加入这个元素之前序列里有很多空位置,因此被分割成很多段。加入这个点后序列有三种变化的可能性:合并两段,新加一段,段数不变。当前元素造成的贡献要利用费用提前计算的思想进行计算。

另外注意目标序列的端点位置贡献是特殊的,需要钦定。

\(\text{DP}\) 状态:\(f_{i,s,p}\) 表示前 \(i\) 个元素,贡献为 \(s\),钦定了 \(p=0/1/2\) 个端点时的方案数。

CF13C / Luogu P4597 Sequence

\(O(n^2)\) 做法略。

结论:\(f_{i,j}\)\(i\) 固定时关于 \(j\) 下凸。一个比较感性的证明是既然当前位置和高于决策点的位置都要移动到决策点,那这玩意这显然是下凸的。严谨证明见 dwt 的博客 和他提到的 Mr_Wu 的题解。

用一个堆来模拟决策点的变化。如果当前位置大于决策点,那么当前位置会成为新的决策点。否则下一时刻决策点必定向下偏移。

posted @ 2021-10-06 16:47  LFCode  阅读(113)  评论(1编辑  收藏  举报