喜欢我 \(O(n^2 \log^2 n)\) 过 \(2e5\) 吗😋
_ _ _ _ _ _ Ciallo~(∠・ω< )⌒★
A
有解的一个必要不充分条件是:
设 \(L_i\) 表示 \(l \le i\) 的左端点数量,\(R_i\) 表示 \(r < i\) 的右端点数量,对于每个位置 \(i\) 满足 \(L_i \ge i \wedge R_i < i\)。
意思就是对于每个位置,左边要有足够的左端点对应左边的点,右边有足够的右端点对应右边的点,右边与左边类似条件翻到左边成为上面的模样。
引理:若一组区间有解,给当前序列第一个位置指定区间之后,将第一个位置和对应区间删去,剩下的位置还满足上述性质,则剩下的区间仍然有解。
证明:首先 \(L_i\ge i\) 在操作前后始终成立,可以直接忽略。只需要考虑 \(R_i < i\)。
设一个合法解的右端点序列为 \(p_1, p_2, \cdots p_n\),如果指定 \(p_k\) 放在第一个位置,考虑如下交换策略。
将 \(t = p_1\) 拿出来作为缓存区间,依次枚举位置 \(i = 2\sim k - 1\):
- 如果 \(t > p_i\) 则交换 \(t\) 和 \(p_i\);
- 如果 \(t\le p_i\) 则不做任何操作;
最后将 \(t\) 作为 \(p_k\) 插入进去。
不难发现如果执行该交换策略后的序列不合法,一定是存在 \(i\) 满足 \(p_i' < i\),而我们保证了性质成立,\(R_i < i\),于是 \(1\sim i\) 中至少有一个 \(p_j\ge i\),这与上述交换策略矛盾。所以应用上述交换策略一定能构造出一个 \(p_k\) 在开头的解,从而引理成立。
关于 \(L_i\ge i\) 在操作前后始终成立:
注意到将第一个位置删去后后面所有下标都减一,由于选的区间 \([l, r]\) 能选首位置,所以 \(l \le 1\),所以后面的 \(L_i\) 都减一。
我们据此从左到右贪心的选可以选的最小值就好了。
维护 \(i - R_i\),满足上面的性质即为所有 \(i - R_i \ge 1\)。
给首位置选择区间并将它们删去(注意此时所有的下标要减一),设区间的右端点(减一后)是 \(r\),删去区间的影响即为 \([1, r]\) 的 \(i - R_i\) 全部减一,后面的 \(i - R_i\) 不变。(\([1, r]\) 的 \(i \gets i - 1, R_i \texttt{不变}\),后面的 \(i \gets i - 1, R_i \gets R_i - 1\)。)
所以我们维护后面第一个 \(1\) 的位置(后缀最小值及其位置),我们可以选的区间就是左端点小于等于 \(1\) 右端点小于第一个 \(1\) 的位置的区间。在这些区间里取编号最小的区间。
可以用线段树维护 \(i - R_i\) 的最小值及位置;用线段树维护右端点为 \(i\) 的区间的编号最小值(底层 set
,维护区间 \(\min\)),在扫到区间左端点时把它加进去即可。
B
喜欢我 \(O(n^2 \log^2 n)\) 过 \(2e5\) 吗😋
讲题整活最高荣誉:啊?
正反各跑一遍 KMP,得到 T 的每个位置正向匹配 S 的最长前缀,反向匹配 S 的最长后缀。
然后枚举 T 相邻两个位置暴力跳 \(nxt\) 去重可以 \(n^3\) 解决。
那么优化?
跳 \(nxt\) 就是在 \(nxt\) 树上到根链求和链清空嘛。
直接给前缀每个位置开线段树树剖维护。
空间可能开不下但是动态开点卡一卡。
然后就可以速度榜榜三啦😋
出题人完全不卡的是吧。
可能用上的两个剪枝?
LL tmp = res; res += Qry(u, mched[i + 1]); if (tmp == res) break;
int tmp = seg[u].qry(dfn[top[x]], dfn[x]); if (!tmp) break;
都是在 \(nxt\) 树上已经被访问过了则不继续查询了。
C
知周所众,DAG 里有至少一个没有入度的点。
考虑直接状压,设 \(f_{S}\) 表示 \(S\) 构成 DAG 的方案数。
枚举无入读的点集 \(T\),显然 \(T\) 内部不能有边,\(S - T\) 和 \(T\) 之间的边要么指向 \(S - T\) 要么删去,然后由于许多状态会转移重我们使用钦定带上一个容斥系数有:
\(f_{S} \gets \sum_{\varnothing \neq T \sube S} (-1)^{|T| + 1} \cdot f_{S - T} \cdot 2^{cnt_{S} - cnt_{T} - cnt_{S - T}}\)。
其中 \(cnt_{sta}\) 是集合内部边数。
现在已经可以枚举子集 \(O(3^n)\) 解决。
进一步的,我们把上式参数分离一下
\(\displaystyle\frac{f_{S}}{2^{cnt_{S}}} \gets \sum_{\varnothing \neq T \sube S} \frac{(-1)^{|T| + 1}}{2^{cnt_T}}\cdot \frac{f_{S - T}}{2^{cnt_{S - T}}}\)。
就是 \(\displaystyle F_{S} = \frac{f_S}{2^{cnt_S}}, G_{T} = \frac{(-1)^{|T| + 1}}{2^{cnt_T}}, F_{S} = \sum_{\varnothing \neq T \sube S} F_{S - T}\cdot G_{T}\)。
可以子集卷积。