Codeforces 1344 题解

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

F

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值