A
假设所有的 ((i+a_i)) 模 (n) 意义下构成排列则答案为 YES
,否则为 NO
.
时间复杂度 (O(n)) 或 (O(nlog n)).
代码: 79150268
B
由于每行每列必须有至少一个 S,所以每行每列为 #
的格子要么构成一个连续区间要么不存在。
如果某行或列不存在 #
,则该行或列的格子必须放在一个不存在 #
的列或行。
于是得到了有解的必要条件:(1) 每行每列 #
的格子要么不存在要么构成连续区间;(2) “存在一行无 #
”和“存在一列无 #
”二者要么同时满足要么同时不满足。
充分性:每个连通块全放 S,再随便一个位置放 N,显然最优。
时间复杂度 (O(nmalpha(nm))).
代码: 79341530
C
首先按大小关系建图,拓扑排序,有解当且仅当无环(全放 (exists) 即可)。
对于一个 (x_i) 而言,显然如果有 (jgt 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_ilt 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(nlog W)).
代码: 79350373
E
不难发现限制形如“在区间 ([l_i,r_i]) 中要操作一次 (u_i)”. 假设我们提取出所有的限制(共 (S) 个),就可以在 (O(Slog n)) 的时间内得到答案——用一个优先队列维护,每次时间后推,把所有 $lle $ 当前时间的加入优先队列,然后删去 (r) 最小的。
由 LCT 的经典分析可知有用的限制总数是 (O(n+mlog n)) 级别。考虑用 LCT 提取出这些限制。
每一次 access
时,当轻重边切换的时候更新切换的点的限制列表,拉成同一棵 Splay 之后打一个标记,表示这些点最后一次被 access
的时间。
注意细节问题。无论重边切换成什么(即便是 (0))都要加到列表里,最后对列表进行处理,去掉 (0),合并相邻相同的。典型错误做法是如果切换成 (0) 则不加入列表,这样会导致后面的区间的 (l) 变大。
时间复杂度 (O(nlog n+mlog^2 n)).
代码: 79797116