题意简述
n首歌循环播放。每首歌有一个欢乐值。播放到一首歌,如果这首歌的欢乐值的两倍小于放过的最大值,则停止。对于每首歌,求出从这首歌开始播放,能放几首歌。n<=1e5。
思路框架
如果全局最小值的两倍>=全局最大值,直接全部输出-1。
数组开三倍。维护一个单调递减的单调队列。现在考虑到 i i i,先把 a [ i ] a[i] a[i]入队列。如果 a [ i ] a[i] a[i]两倍小于队首 H H H,记录 a n s [ H ] = i − H ans[H]=i-H ans[H]=i−H,弹出队首。对于没有处理过的位置 i i i,直接ans[i]=ans[i+1]+1。输出1~n位置的答案。
具体思路
由于是循环的问题,我们考虑把数组开两倍。但是看到样例二,手动模拟一下,发现这不够,要三倍。
开始分析。显然, i i i位置能播放到的位置肯定<= i + 1 i+1 i+1能放到的位置。比如这组数据:
15
58 37 28 74 28 41 50 34 72 79 45 42 94 54 39
我们计算每个位置能放到的位置,得到这样一个数组:
3 5 5 5 15 15 15 15 15 15 15 15 15 18