随机乱做计划 Part 1

对 Umnik 想题法的一个尝试。

随机挑选四个题,什么时候想出来了再更新。

由于博主水平有限,所以不会做是正常情况。

  1. CF1479D *2900
  2. CF1552G *3000
  3. CF1566G *3100
  4. CF1610G *3300

题意:


CF1479D

给一棵树,每个点有颜色 \(c_i\),多次查询,每次给定 \(u,v,l,r\),你需要给出一个颜色 \(x\),使得 \(x\) 满足:

  1. \(x\in [l,r]\)
  2. \(x\)\(u\)\(v\) 的路径上出现了奇数次。

你需要对于每组查询给出 \(x\),如果一组查询不存在合法的 \(x\),则输出 \(-1\)

\(n,m\le 3\times 10^5\)

想法

判断是否存在合法颜色存在一个简单的 hash 算法,即给颜色随机赋权,然后计算异或和。

用一颗主席树维护即可。

submission


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)\)

submission

(虽然实现的时候复杂度不小心假了但还是过了。


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\)

想法

一眼大讨论,不太有意思的样子。

稍微讨论一下:

  1. 两条不相交的边。
  2. 四个点的菊花。

分别处理这两种即可。

  1. 两条不相交的边。
    线段树分治,那么只用处理加边的情况。
    容易发现只需在任意时刻保存 \(O(1)\) 条有用的边.
  2. 四个点的菊花。
    那么显然对于每个点只需保存三条最短的边。
    也可以线段树分治。

看了题解,做法也差不多,但是可以不线段树分治。

做法省略了,因为实在很难写,不如线段树分治。详见提交。

submission


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)\)


posted @ 2022-09-29 15:36  一般通过小萌新  阅读(110)  评论(1编辑  收藏  举报