Codeforces 1237D Balanced Playlist 题解

博客观赏效果更佳

题意简述

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]=iH,弹出队首。对于没有处理过的位置 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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值