A
假设所有的 \((i+a_i)\) 模 \(n\) 意义下构成排列则答案为 YES
,否则为 NO
.
时间复杂度 \(O(n)\) 或 \(O(n\log n)\).
代码: 79150268
B
由于每行每列必须有至少一个 S,所以每行每列为 #
的格子要么构成一个连续区间要么不存在。
如果某行或列不存在 #
,则该行或列的格子必须放在一个不存在 #
的列或行。
于是得到了有解的必要条件:(1) 每行每列 #
的格子要么不存在要么构成连续区间;(2) “存在一行无 #
”和“存在一列无 #
”二者要么同时满足要么同时不满足。
充分性:每个连通块全放 S,再随便一个位置放 N,显然最优。
时间复杂度 \(O(nm\alpha(nm))\).
代码: 79341530
C
首先按大小关系建图,拓扑排序,有解当且仅当无环(全放 \(\exists\) 即可)。
对于一个 \(x_i\) 而言,显然如果有 \(j\gt i\) 且 \(i,j\) 之间有大小关系(即存在一条路径从 \(i\) 到 \(j\) 或从 \(j\) 到 \(i\)),那么 \(j\) 不可以是 \(\forall\).
于是对每个点统计一下能到它的和它能到的点中编号最小的,如果大于它本身就可以是 \(\forall\),否则设为 \(\exists\),这样的方案是最优的。
而这保证了每个 \(\forall\) 是所有和它限制了大小关系的点中编号最小的,因此一定能构造合法解。
时间复杂度 \(O(n+m)\).
代码: 79198382
D
由于贡献关于 \(b_i\) 是凸的(\(f(b_i+1)-f(b_i)\) 随 \(b_i\) 的上升而下降),所以可以考虑这样一个过程:初始时 \(b_i\) 都是 \(0\),进行 \(K\) 轮,每一轮选择当前 \(b_i\lt a_i\) 且 \(\Delta(b_i)=f(b_i+1)-f(b_i)\) 最大的 \(i\),把 \(b_i\) 加一。
考虑优化:每次选择的 \(\Delta\) 单调不升,因此可以二分最终结束时的 \(\Delta\),判断加的轮数是否 \(\ge K\) 即可。注意二分边界,有可能 \(\Delta=x\) 的时候个数 \(\lt K\),\(\Delta=x-1\) 的时候个数 \(\gt K\),这时候随便调整一下即可。
时间复杂度 \(O(n\log W)\).
代码: 79350373
E
不难发现限制形如“在区间 \([l_i,r_i]\) 中要操作一次 \(u_i\)”. 假设我们提取出所有的限制(共 \(S\) 个),就可以在 \(O(S\log n)\) 的时间内得到答案——用一个优先队列维护,每次时间后推,把所有 $l\le $ 当前时间的加入优先队列,然后删去 \(r\) 最小的。
由 LCT 的经典分析可知有用的限制总数是 \(O(n+m\log n)\) 级别。考虑用 LCT 提取出这些限制。
每一次 access
时,当轻重边切换的时候更新切换的点的限制列表,拉成同一棵 Splay 之后打一个标记,表示这些点最后一次被 access
的时间。
注意细节问题。无论重边切换成什么(即便是 \(0\))都要加到列表里,最后对列表进行处理,去掉 \(0\),合并相邻相同的。典型错误做法是如果切换成 \(0\) 则不加入列表,这样会导致后面的区间的 \(l\) 变大。
时间复杂度 \(O(n\log n+m\log^2 n)\).
代码: 79797116