Codeforces 1237D. Balanced Playlist
首先显然的,如果一个位置开始播放了两圈还没结束,那么就永远不会结束
先考虑位置 $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 ;
}
Codeforces 1237D. Balanced Playlist的更多相关文章
- 并不对劲的CF1237D&E:Balanced Playlist and Binary Search Trees
CF1237D Balanced Playlist 题意 有一个长度为\(n\)(\(n\leq 10^5\))的循环播放歌单,每首歌有一个优秀值\(a_i\)(\(a_i\leq 10^9\)). ...
- [Codeforces 873B]Balanced Substring
Description You are given a string s consisting only of characters 0 and 1. A substring [l, r] of s ...
- CodeForces - 873B Balanced Substring(思维)
inputstandard input outputstandard output You are given a string s consisting only of characters 0 a ...
- Codeforces 873B - Balanced Substring(思维)
题目链接:http://codeforces.com/problemset/problem/873/B 题目大意:一个字符串全部由‘0’和‘1’组成,当一段区间[l,r]内的‘0’和‘1’个数相等,则 ...
- CF1237D Balanced Playlist
思路:假设从第i首歌开始听,结束位置为j,那么从第i+1首歌开始听,结束位置一定不早于j.可以用反证法证明.想到这一点,就不难解决了. 实现: #include <bits/stdc++.h&g ...
- Codeforces 1237F. Balanced Domino Placements
传送门 很妙的题 首先先考虑一个简化的问题,现在有一行格子让你填 你要么填一格 要么填两格 有的格子不让你填 问你填了 $a$ 个一格和填了 $b$ 个两格有多少种方案 那么显然先只考虑放两格的方案, ...
- Codeforces 1237E. Balanced Binary Search Trees
传送门 这一题是真的坑人,时间空间都在鼓励你用 $NTT$ 优化 $dp$...(但是我并不会 $NTT$) 看到题目然后考虑树形 $dp$ ,设 $f[i][0/1]$ 表示 $i$ 个节点的树,根 ...
- Codeforces 1237C2. Balanced Removals (Harder)
传送门 先来考虑一下二维时的情况,那么对于 $x$ 相同的点,我们按 $y$ 排序,然后相邻的一对对消除 最后 $x$ 坐标相同的点最多剩下一个,那么此时所有点的 $x$ 坐标都不一样 再按 $x$ ...
- Codeforces 1237B. Balanced Tunnel
传送门 这一题有点意思 首先预处理出 $pos[x]$ 表示编号 $x$ 的车是第几个出隧道的 然后按进入隧道的顺序枚举每辆车 $x$ 考虑有哪些车比 $x$ 晚进入隧道却比 $x$ 早出隧道 显然是 ...
随机推荐
- Linux-ubuntu英文版输入法不能切换中文输入法问题解决办法
1:System Settings中点击Language Support 2. 3. 4. 5. 6. 7.注意不要勾选Only Show Current Language
- SpringMVC和AJAX交互
在实际开发中我们经常需要前后台交互,那么springmvc与ajax之间交互这里记录下在实际开发中遇到的细节问题. jsp页面: <fieldset id="login" s ...
- Bootstrap视频教程
一.全局CSS样式 0.课件 001.概览_栅格系统 2.排版和代码 3.表格和按钮 4.表单 5.图片 6.辅助类 7.响应式工具 二.组件 8.图标_下拉菜单_按钮组 9.输入框组 10.导航 1 ...
- python异常值检验实战2_医美手术价格
python信用评分卡建模(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_ca ...
- Linux shell利用sed如何批量更改文件名详解[转载]
需求背景: 目录A用来存放自动化的包生成的apk文件,现在开发修改了包名的 命名规则:环境名称(pro|uat)-release-日期-v版本号.apk 原来的是思路是通过正则表达式匹配新的包名,但 ...
- flutter Android打包
以下内容均是在mac版本电脑上的操作 1.生成签名 //根目录执行以下命令 keytool -genkey -v -keystore ~/sign.jks -keyalg RSA -keysize 2 ...
- 堡垒机直接调用RUN
两个脚本 Run.vbe 参考https://blog.csdn.net/skypeGNU/article/details/12708221 set ws=wscript.createobject ...
- 白盒测试 && 接口测试 && 自动化测试
一.什么是白盒测试 白盒测试是一种测试策略,这种策略允许我们检查程序的内部结构,对程序的逻辑结构进行检查,从中获取测试数据.白盒测试的对象基本是源程序,所以它又称为结构测试或逻辑驱动测试,白盒测试方法 ...
- SaCa CDC产品简介
1.1 产品简介 东软SaCa™ CDC实时增量数据捕获平台(以下简称SaCa™ CDC)是一款高度可扩展.可靠和易于配置的异构实时事务复制软件,能够提供异构环境下数据的实时捕捉和交付数据,以独立 ...
- 【问题案例】K8S-Master修改IP地址之后,重新初始化的方法。
使用kubeadm命令,执行:kubeadm reset 重新执行初始化:kubeadm init --kubernetes-version=v1.14.1 --pod-network-cidr=10 ...