Codeforces 1344 题解

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

F

题解: https://www.cnblogs.com/suncongbo/p/12872134.html

原文地址:https://www.cnblogs.com/suncongbo/p/12875389.html