近期总结 2024.2.9
CF1508D Swap Pass
题意:平面上有 \(n\) 个点,满足任意三点不共线。每个点有 \(a_i\) 且构成 \(1...n\) 的排列。每次执行一种操作:选择两个点 \(i,j\),交换 \(a_i,a_j\),然后在平面上点 \(i,j\) 之间画一条边。求出一种让 \(a_{1...n}\) 排序的操作方案,满足画出来的边两两不相交,但是可以交于一条边的端点。 \(1\le n\le 2000\)
排序就是使得最终 \(\forall i,\space a_i=i\)
考虑一个排列由若干个环组成。对于一个环,我们构造一种方案:
-
任意选择一个点 \(s\)
-
然后从 \(s\) 指向的点开始,依次令 \(s\) 与环上的点交换
显然,这样操作满足要求,且画出来是一个类似于菊花图的样子。
但是如果有多个环很不好处理,考虑两个不同环的点,我们交换他们,可以使他们所在的环合并成一个大环。
因此,我们尝试依次通过上述方法合并所有的环,最后直接操作这个环。
首先合并完后,我们仍然是选择一个点 \(s\),然后连菊花图。
由于不能相交,这启示我们通过交换图上相邻两个点来合并环。
每个点按与 \(s\) 的极角排序,然后每次判断相邻两个点是否在不同的环,然后逐一交换,最后连个菊花图。
时间复杂度 \(O(n\log n)\),瓶颈在排序。
CF704D Coptain America
题意:平面上有 \(n\) 个点,坐标为 \((x_i,y_i)\)。每个点可以染成红色或蓝色,代价分别为 \(r,b\)。有 \(m\) 条限制,每个限制为一条 \(x=l\) 或 \(y=l\) 的直线上,染红的点与染蓝的点数量之差的绝对值 \(\le d\),求最小染色总代价。 \(1\le n,m\le 10^5\)
首先钦定 \(r\le b\),我们先假设所有点染红,这是最小可能代价。
但是有限制,我们需要把一些点变色。发现每个限制都可以变为:一条线上的点变色数量必须在一个特定范围(一个区间)。
把行看作左部点,列看作右部点,就很像二分图最大匹配。唯一的区别是一个点能匹配多个,且匹配次数限制在一个区间。
转网络流,其实就是有源汇上下界最小流。
CF1037H Security
题意:给出一个字符串 \(S\),有 \(m\) 次询问。每次给出 \(l,r\) 和字符串 \(T\),问在 \(S\) 中选取一个字典序最小的在 \([l,r]\) 中的子串,且字典序比 \(T\) 大,求出这个子串。 \(1\le |S| \le 10^5, \space 1\le m\le 2\times 10^5,\space 1\le \sum |T|\le 2\times 10^5\),字符串都由小写字母组成
考虑答案一定是 \(T\) 的一段前缀,在加上比 \(T\) 后面第一个字符大的一个字符,且满足这一段前缀尽量大。
建立 SAM,然后一步一步在 SAM 上走,每次走一个字符。
枚举前缀,枚举下一个字符,找到 SAM 上对应的结点,我们需要判断是否存在这样的字符串。假设有共 \(i\) 个字符,存在的条件是有一个结尾位置在 \([l+i-1,r]\) 的串,直接在 parent tree 上线段树合并即可,时间复杂度线性对数。