Educational Codeforces Round 131总结

比赛地址

比赛情况

排名:99 / 23733
AC:4 / 6

题目总结

A

看一下有几个1,0个就0,4个就2,否则1

B

\(d=2\) 显然最优。

于是从 1 到 \(n\) 判断,如果此数还未输出就输出它和它的2倍和它的2倍的2倍,直到大于 \(n\),标记为出现过,然后遍历下一个数。

C

双指针

首先把每个人擅长的工作都交给它做,那么每个人完成时间都可以化为数轴 \([1,m]\) 上的一个点。

然后跑双指针,一个从 1 开始从小往大,一个从 \(m\) 开始从大往小,寻找当前完成时间最短和最长的工人,最短+2,最长-1,然后继续跑,直到两个指针交汇就是答案

D

对于当前 \(i\)\(b_i\),我们可以求出 \(a_i\) 的范围:

  1. \(b_i=0\),则 \(a_i\in[i+1,n]\)
  2. \(b_i=0\) 不成立,则 \(a_i\in[\left\lfloor\dfrac{i}{b_i+1}\right\rfloor+1,\left\lfloor\dfrac{i}{b_i}\right\rfloor]\)

把所有 \(a_i\) 的区间求出来后,就转化为经典问题,每个数只能在区间中取,每个数只能出现一次。

然后贪心解决,把所有区间按左端点排序,从 1 到 \(n\) 遍历,逐个确定。

如果当前区间左端点大于当前要确定的数,右端点加入小根堆。

每次从优先队列中取出堆顶,就是这个数对应的答案。

posted @ 2022-07-09 17:53  zhangtingxi  阅读(29)  评论(0编辑  收藏  举报