Codeforces6E_Exposition
题意
给定一个序列,求有多少个最长连续子序列满足最大值减最小值之差不超过\(k\)。
分析
- 跟序列最大值最小值有关的可以想到单调栈,先预处理出每个数作为最大值能延伸的区间,然后枚举每个数作为最大值。
- 最大的满足条件的连续序列显然左边就是要在\([le[i],i-1]\)里找到大于等于\(a[i]-k\)的最小值对应的下标,右边同理。
- 线段树维护区间最小值,然后再套一个二分(应该也可以不用,就一个log,不过二分容易想),求出两端能满足条件的序列端点,计算出长度更新答案。
代码
#include <bits/stdc++.h>
using namespace std;
#define ls i<<1
#define rs i<<1|1
#define mid (l+r)/2
const int N=1e5+50;
int n,k,a[N];
int le[N],ri[N];
int mn[N*4];
void build(int i,int l,int r){
if(l==r){
mn[i]=a[l];
return;
}
build(ls,l,mid);
build(rs,mid+1,r);
mn[i]=min(mn[ls],mn[rs]);
}
int query(int i,int l,int r,int ql,int qr){
if(ql<=l && qr>=r){
return mn[i];
}
int ans=0x3f3f3f3f;
if(ql<=mid){
ans=min(ans,query(ls,l,mid,ql,qr));
}
if(qr>mid){
ans=min(ans,query(rs,mid+1,r,ql,qr));
}
return ans;
}
set<pair<int,int> > res;
int mx;
int main(){
// freopen("in.txt","r",stdin);
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
stack<int> s;
for(int i=1;i<=n;i++){
while(!s.empty() && a[s.top()]<=a[i]){
s.pop();
}
if(s.empty()){
le[i]=1;
}else{
le[i]=s.top()+1;
}
s.push(i);
}
while(!s.empty()){
s.pop();
}
for(int i=n;i>=1;i--){
while(!s.empty() && a[s.top()]<=a[i]){
s.pop();
}
if(s.empty()){
ri[i]=n;
}else{
ri[i]=s.top()-1;
}
s.push(i);
}
build(1,1,n);
for(int i=1;i<=n;i++){
int t=a[i]-k;
//查询[le[i],i-1] >=t 的最小值的值和位置
int L=le[i],R=i-1;
int lidx=i;
while(L<=R){
int M=(L+R)/2;
int tm=query(1,1,n,M,i-1);
if(tm>=t){
lidx=M;
R=M-1;
}else{
L=M+1;
}
}
L=i+1,R=ri[i];
int ridx=i;
while(L<=R){
int M=(L+R)/2;
int tm=query(1,1,n,i+1,M);
if(tm>=t){
ridx=M;
L=M+1;
}else{
R=M-1;
}
}
int ans=ridx-lidx+1;
if(ans>mx){
mx=ans;
res.clear();
res.insert({lidx,ridx});
}else if(ans==mx){
res.insert({lidx,ridx});
}
}
int siz=res.size();
printf("%d %d\n",mx,siz);
for(auto it:res){
printf("%d %d\n",it.first,it.second);
}
return 0;
}
Codeforces6E_Exposition的更多相关文章
随机推荐
- Unity3D_(数据)JsonUtility创建和解析Json
Json 百度百科:传送门 LitJson创建和解析Json 传送门 Json数据解析在Unity3d中的应用 传送门 一.使用JsonUnity创建Json using System.Collect ...
- webpack 第二部分
默认根目录 当前项目 修改目录 devServer devServer:{ open:true, //自动打开浏览器 port:3000, // 端口 contentBase:"dist&q ...
- android 播放音乐媒体文件(一)
Audio formats and codecs Format / Codec Encoder Decoder Details Supported File Type(s) / Container F ...
- php面向对象 练习
实例一:求一个圆环的面积,大圆半径:10 小圆半径:5 造一个圆的类: class Yuan { public $r; function __construct($r) //半径初始化 { $t ...
- jenkins 内置变量
Jenkins 有一些内置的变量可以使用.主要是: 邮件的配置变量,可以在发送邮件的时候使用. 环境变量 1. 邮件的配置变量 ${GIT_BRANCH} - build 的 Git 分支 ${FIL ...
- linux添加新用户
使用root用户adduser yj 后面操作有提示 用这种方法新建的用户会在home下生成用户文件夹
- python接口测试之mock(三)
前面介绍了moco的详细的使用,它主要是基于moco-runner-0.11.0-standalone.jar,通过编写json的文件来实现,mock翻译过来就是模拟的意思,也就是说,它是将测试对象所 ...
- linux(centOS7)的基本操作(七) 其它
本地与linux服务器之间的文件传输 本地下载的文件,如果想在远端的linux服务器上执行,需要文件传输.如果本地使用windows系统,则借助XFTP软件的图形界面即可.如果本地使用macOS系统, ...
- STM32Cube填坑,ST link 下载一次以后无法下载
ST link 下载一次以后无法下载, 原因是工程设置忘记设置Debug模式
- 网易云课堂_C++程序设计入门(下)_期末考试_期末考试在线编程题目
期末考试在线编程题目 返回考试 本次考试题目一共两个,在考试期间可以不限制次数地提交 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间 ...