杂题总结
P3523 [POI 2011] DYN-Dynamite
贪心。
首先,使得最大值最小就上二分。现在问题转化为了判定是否可以选择最多 \(m\) 个点使得给出关键点到这些点的最小距离都不超过二分值 \(mid\)。下文中称关键点到选择点的最小距离超过二分值为不合法,反之为合法
因为我们关心的是距离的最大值,也就是关心某棵子树内最深不合法的关键点与最浅的选择点的距离是否合法,分别计他们的深度为 \(f_{i},g_i\) 。若 \(g_i\) 可以使得 \(f_i\) 合法,那么就不用再选择新的点;否则,若 \(f_x-dep_x<mid\),此时可以选择 \(x\) 点与 \(x\) 的若干级祖先使得其合法,显然选择点深度越小越有利于贡献,所以此时不选点 \(x\);当 \(f_x-dep_x=mid\) 时,不选 \(x\) 点 \(f_x\) 就会永远不合法,所以此时要选择 \(x\) 点,\(cnt++\)
注意特判根节点,根节点处存在不合法点就必须选!
P4785 [BalticOI 2016] 交换 (Day2)
还是贪心。
题意即为可以从小到大交换 \(a_i\) 与 \(a_{i\times 2}\),或交换 \(a_{i}\) 与 \(a_{i\times 2+1}\),这个下标非常眼(线)熟(段)啊(树),所以可以将序列放到完全二叉树上
根据“字典序最小”的贪心原则,将父子三个节点的最小值交换到父节点处;当这个最小值是从其右子节点转移来时,两个子节点的顺序是不确定的:这里不能盲目贪,因为某个较大的值可能可以交换来较小的值
怎么办呢急急急。假设子节点中权值较小的值为 $a $,可以暴力搜索 \(a\) 在左子树中会到达的位置与在右子树会到达的位置 \(p1,p2\),比靠丝将 \(a\) 换成比它大的数后这个数一定在 \(p1\) 或 \(p2\) 之后,现在要让 \(a\) 尽量靠前即可
P11820 [PA 2015] 健身房 / Siłownia
还是贪心。将 \(p\) 视作区间的颜色。
考虑没有颜色限制的做法。没有颜色限制时就维护一个集合,扫描线将所有区间按照左端点的顺序加入集合,若集合中存在一个区间的右端点恰好是当前的时间点 \(t\),那么就用该点 \(t\) 覆盖当前集合中的所有区间并清空集合。
考虑颜色的限制。对于在集合中的区间 \(i,j\) 满足 \(p_i=p_j,r_i<r_j\) 选择区间 \(i\) 一定不比区间 \(j\) 劣;若 \(p_i=p_j,r_i=r_j,l_i<l_j\) ,则必有一个区间需在 \(t-1\) 处被覆盖,直接将 \(r_i\) 修改为 \(r_i-1\) 即可。若是修改 \(r_j\) ,可能会出现 \(l_j>r_j\) 的情况导致区间不合法。
P4719 【模板】动态 DP
首先 \(O(n)\) 的 DP 是很好想的,但是它有修改操作,不可以每次都跑 DP 。怎么办呢。
注意到这里的修改只有单点修改,而每次修改只会影响被修改的点与其祖先的 DP 值。这简直和点分树一毛一样啊,点分树的高度是 \(log\) 级的所以可以暴力跳父节点,该题中原树没法暴力跳父节点,但是这种路径问题可以用树剖来维护啊
首先列出 DP 方程
我们希望树剖时可以快速从链底求得链顶的值,因为在这条链中会改变只可能是重儿子的值,所以可以把 DP 的贡献掰成轻儿子/重儿子的分开计算并用矩阵加速(此时的矩阵乘法是广义矩阵乘法)。
接下来链顶要作为轻儿子重新给其父节点贡献,修改后跳链就行了,即树剖+线段树维护 dfn 区间矩阵乘积
P4036 [JSOI2008] 火星人
二分+平衡树维护哈希值
哈希可以 \(O(1)\) 比较两个字符串是否相同,那么做法呼之欲出了,二分 LCP 的长度比较就可以做出来了
这题中有单修,也有插入,所以可以用平衡树维护哈希值
P3733 [HAOI2017] 八纵八横
线段树分治+线性基
水题。线段树分治就是在时间轴上操作,将“插入——删除”操作替代为线段树维护某个区间上的“插入——撤销”操作
用这题的做法可以在线性基中插入所有环的异或和,最后的答案就是在线性基中求最大异或和。
说到这里就完全做完了,但刚开始有点担心复杂度。每一个操作会被插入到 \(log\ Q\) 个区间中,插入的复杂度是 \(\frac{len^2}{\omega}\),总复杂度就是 \(q\ logQ\frac{len^2}{\omega}\),其实跑得飞快
CF741C Arpa’s overnight party and Mehrdad’s silent entering
“相邻三个人食物不同”不好处理,可以将问题转变为第 \(2i\) 个人和第 \(2i-1\) 个人食物不同。然后就会有很多关系 \((x,y)\) 表示 \(x,y\) 人的食物不能相同,求方案。其实到这里我还是想的是扩展域并查集,但这 duck 像 2-SAT 一样给这些关系连边,再染色。“手模后容易发现”这会建出一个二分图,直接在二分图上染色即可
这题卡住我的地方是将三个人之间的限制转变为两个人之间的限制的正确性。但其实不必纠结于此,因为它要求的是输出一个合法方案,而这样限制转化后一定存在合法方案且满足原题的限制。主要还是在想自己做完全想不到这样的转换怎么办(泪,要是还有类似“三个”的限制但无法像这题一样将其转换为二元关系怎么办(悲 但也算提供一个思路了,输出方案题可以找合法解中的“特殊解”以快速求出答案
若至错误:链前写错下标,数组开小
upd:原来这叫放缩条件啊

浙公网安备 33010602011771号