随机乱做计划 Part 1
对 Umnik 想题法的一个尝试。
随机挑选四个题,什么时候想出来了再更新。
由于博主水平有限,所以不会做是正常情况。
题意:
CF1479D
给一棵树,每个点有颜色 \(c_i\),多次查询,每次给定 \(u,v,l,r\),你需要给出一个颜色 \(x\),使得 \(x\) 满足:
- \(x\in [l,r]\)
- \(x\) 在 \(u\) 到 \(v\) 的路径上出现了奇数次。
你需要对于每组查询给出 \(x\),如果一组查询不存在合法的 \(x\),则输出 \(-1\)。
\(n,m\le 3\times 10^5\)
想法
判断是否存在合法颜色存在一个简单的 hash 算法,即给颜色随机赋权,然后计算异或和。
用一颗主席树维护即可。
CF1552G
给定数列长度 \(n\),操作数 \(k\)。每次操作选择若干个位置,将其升序排列。
对于第 \(i\) 次操作,给定操作的位置数 \(x_i\) 和 \(x_i\) 个位置 \(j_{i,1},j_{i,2},...,j_{i,x}\)。
求是否对于每一种初始数列,都能在 \(k\) 次操作后升序排列好。
\(n\le 40,k \le 10\)
想法
根据排序网络的经典结论,我们只需对每个 \(01\) 序列都能排序即可。
接下来就不会了,看了题解觉得很震撼。
枚举每次操作,暂时不处理没有被操作覆盖的位置。对每次操作,一次性枚举其中 \(0\) 的数量。
事实上它的复杂度不高于 \(O((\dfrac{n+k}{k})^k)\)。
(虽然实现的时候复杂度不小心假了但还是过了。
CF1566G
给定一张 \(n\) 个点 \(m\) 条边的带权无向图,现有 \(q\) 次如下两种操作:
-
0 u v
:删除边 \(\langle u,v \rangle\),保证 \(\langle u,v \rangle\) 存在; -
1 u v w
:添加边 \(\langle u, v \rangle\),边权为 \(w\),保证加边前 \(\langle u, v \rangle\) 不存在。
初始时和每次操作后,需要找出 \(4\) 个不同的点 \(a, b, c, d\),满足 \(a,b\) 联通,\(c,d\) 联通,且 \(a\) 到 \(b\) 的最短路径与 \(c\) 到 \(d\) 的最短路径权值之和最小,求出这个最小权值和。这里最短路径即指边权和最小的路径。
数据保证初始时无重边,保证任意时刻图中边数不少于 \(4\);不保证图联通。
\(n,m,q \le 10^5\)
想法
一眼大讨论,不太有意思的样子。
稍微讨论一下:
- 两条不相交的边。
- 四个点的菊花。
分别处理这两种即可。
- 两条不相交的边。
线段树分治,那么只用处理加边的情况。
容易发现只需在任意时刻保存 \(O(1)\) 条有用的边. - 四个点的菊花。
那么显然对于每个点只需保存三条最短的边。
也可以线段树分治。
看了题解,做法也差不多,但是可以不线段树分治。
做法省略了,因为实在很难写,不如线段树分治。详见提交。
CF1610G
给定一个括号串 \(S\),进行任意次操作:
- 将 \(S\) 分为三个可以为空的连续子串 \(A,B,C\),接着将 \(S\) 变为一个新串 \(A(B)C\)(即在 \(B\) 前加上左括号,在 \(B\) 后加上右括号)。
给定最终串 \(T\),求可能的字典序最小初始串 \(S\)。
\(1 \leq |T| \leq 3\times10^5\)。
想法
有一个很简单的做法:令 \(f_i\) 表示 \([i,n]\) 的答案。
显然有转移:\(f_i=\min(S_i+f_{i+1},f_{g_i})\)。
那么只需比较字典序。
相当于 trie 上插叶子,查询倒序字典序,倍增即可。
\(O(n\log n)\)。