本文搬运自本人初中博客园博客,若图片加载不出来,可到原文查看:https://www.cnblogs.com/zhangtingxi/p/16461488.html

比赛地址

比赛情况

排名:99 / 23733
AC:4 / 6

题目总结

A

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

B

d=2d=2 显然最优。

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

C

双指针

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

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

D

对于当前 iibib_i,我们可以求出 aia_i 的范围:

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

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

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

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

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