传送门

首先显然的,如果一个位置开始播放了两圈还没结束,那么就永远不会结束

先考虑位置 $1$ 开始播放,用一个 $multisetset$ 维护一下当前听的所有歌,直到某一首歌 $r$ 不合法了就停止,此时播放的区间即为位置 $1$ 开始的答案

然后考虑从位置 $2$ 开始播放时和从位置 $1$ 开始播放有什么变化,显然播放的歌曲一定可以到 $r$ (反证法容易证明),并且 $multiset$ 里少了一首位置 $1$ 的歌

那么直接把 $multiset$ 更新一下,然后继续模拟过程直到下一个不合法,然后又可以算出答案

这样一直算下去即可求出所有答案

均摊复杂度 $O(n \log n)$,注意要把听歌的序列延长 $3$ 倍而不是两倍(看样例 $2$ 就知道了)

数组也要开 $3$ 倍!(如果你像我一样不小心开了两倍,那么结果就是通过 $\text{pretest}$ 然后 $WA$ 在 $\text{system test}$)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=3e5+;
int n,n3,ans[N];
int A[N];
multiset <int> S;
int main()
{
n=read(),n3=n*;
for(int i=;i<=n;i++) A[n*+i]=A[n+i]=A[i]=read();
int r=;
for(int i=;i<=n;i++)
{
while(r<=n3)
{
if(S.size())
{
int p=*S.rbegin();
if(A[r]<p/ || (A[r]==p/ && p&))
break;
}
S.insert(A[r]); r++;
}
ans[i]= r<=n3 ? r-i : -; S.erase(S.find(A[i]));
}
for(int i=;i<=n;i++) printf("%d ",ans[i]);
puts(""); return ;
}

最新文章

  1. JDBC Tutorials: Commit or Rollback transaction in finally block
  2. lodop打印控件
  3. webDriver 执行杀死浏览器进程方法
  4. Java日志规范
  5. PHP FastCGI RCE Vul
  6. poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)
  7. 2016.8.16 JQuery学习记录
  8. 关于ubuntu 系统
  9. day55
  10. .Net 4.0特性 Tuple元组
  11. Poj 3517 And Then There Was One Joseph核心问题
  12. knockout笔记
  13. To the end
  14. phpcms笔记
  15. springmvc常用注解标签详解【转】
  16. 【可视化】Echarts3坐标系倒映
  17. svn conflict 冲突解决
  18. 洛谷P3168 [CQOI2015]任务查询系统
  19. Java 8中用法优雅的Stream,性能也&quot;优雅&quot;吗?
  20. python 回溯法 子集树模板 系列 —— 13、最佳作业调度问题

热门文章

  1. Manjaro XFCE 设置分辨率1920*1080
  2. 解决phpStorm使用vue提示&quot;Attribute v-xxx is not allowed here&quot;的问题
  3. CTF中PHP反序列化和命令注入的一次简单利用
  4. 解决Linux下Firefox无法启动的问题
  5. adb命令连接Android模拟器夜神模拟器
  6. 树状数组优化dp,一维排序,一维离散化
  7. 黑马vue---19、v-for中key的使用注意事项
  8. 企业SOA架构案例分析
  9. 约束布局ConstraintLayout详解
  10. HttpClient提交数据