集训内容总结 day2:数据结构
内容:点分治、点分树;LCT;链分治;数据结构辅助建图、数据结构优化算法
搜得到的题不写题面了。有些题没会,是空着的。
P6109
考虑一维使用猫树,另一维使用线段树维护。变成查询线段树某个区间的历史和。
P11343
模拟 dijkstra:找出最小点 + 增广
增广相当于点分树子树内对一个一次函数取 max
可以每个点子树维护一个凸包用来求最小值(?
P8987
全局加一次函数和全局取 min。把全局加一次函数改到取 min 上,变成全局与一次函数取 min。
如果被取 min 影响了就丢到另一个地方维护。这个直接线段树维护修改到的点。接下来是找什么时候点会被丢到线段树上。整体二分即可。
P8990
考虑所有边,如果父亲点亮儿子不点亮说明这个时刻不合法,如果父亲不亮儿子亮了会产生贡献。
先考虑如何判时间合不合法,合法相当于未点亮节点构成连通块。即未被点亮点减去两端都不亮的点等于一。
ABC414G
线段树优化建图做完了。
QOJ9634
我擦,这么牛。
01 操作分别相当于 0 连续段往左,1 连续段往右。用平衡树维护连续段的相撞和其它情况。
似乎很难写,嘟嘟嘟。
QOJ4815
点分治,考虑包含 \(x,u\) 的答案,相当于要选 \(x\) 到 \(u\) 的链。从 \(x\) 开始先序 / 后序分别 dp 就能求出的答案。由于 \(<k\) 的子树可以丢掉,复杂度为 \(O(nk\log\frac{n}{k})\)。
QOJ8240
直接维护每个点会一直跳到哪里(相当于中间的重复部分跳过)。
查询时只有最后一个跳可能跳过头,直接做即可。
P8265
呜呜呜不会 LCT。
QOJ9419
呜呜呜不会 LCT。
GYM105667C
dp,对于 \(x\) 相当于找深度比其深且与其不直接相连的点中 \(f(y)+dis(x,y)\) 最小的点。
点分治,考虑直接记录 \(dis(y,rt)\),然后按深度排序的线段树上记录 \(dis(x,rt)\) 在 \(O(1)\) 种情况下的答案(所有 \(dis\) 都能选,不选 \(dis=0\),不选 \(dis\le 1\))。
QOJ2064
相当于查询是否存在一条路径通往 \(x\) 且边的标号递减且均小于 \(qid\)。
考虑点分治。对于分治中心 \(x\),先算出每个点最早什么时候到达 \(x\)。然后按到达时间从早到晚扫描线,从 \(x\) 出发到达其他点的时间会不断变晚,但整体的变化量是 \(O(m)\) 的(仅在某个边的可达状态改变时才会改变)。
QOJ7884
连通块太不牛了,不如拆成若干条不交的链。就变成在图上选若干条不交链,贡献是两个端点的最小值。
直接树形 dp 即可,\(f_{i,j}\) 表示钦定端点的值,\(g_i\) 表示子树内整体的答案。推出转移方程后发现可以线段树合并。
P4220
第一棵树上做边分治,就能确定每个点的额外点权。然后相当于另外两个图的虚树继续做。对于第二个图还是边分治,这样跑应该可以做到 \(O(n\log^2 n)\)。
如何做 \(O(n\log n)\):第二棵树考虑枚举 lca,则此时相当于求第二棵树的某个子树在第三棵树上的直径。直径的合并可以 \(O(1)\),所以后面的部分都是 \(O(1)\) 的。