通过两遍单调栈求出每个点作为最小值往右延伸到$g[i]$,作为最大值往左延伸到$f[i]$。

那么一个区间$[i,j]$可行当且仅当$g[i]\geq j$、$f[j]\leq i$且$i-a[i]==j-a[j]$。

按$i-a[i]$分组,从左往右考虑每个点作为$j$。

维护一个$g$单调递减的栈,那么最优的$i$只可能是栈顶。

如此求出所有固定右端点可能的最优左端点后,贪心求出所有极短合法区间即可。

时间复杂度$O(n)$。

#include<cstdio>
const int N=1100010,BUF=N*10;
char Buf[BUF],*buf=Buf;
inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
int n,m,i,j,a[N],t,q[N],f[N],g[N],st[N*2],nxt[N],p[N],w[N],ans;
inline void add(int x,int y){nxt[y]=st[x];st[x]=y;}
inline void solve(){
if(m<2)return;
int i;
for(t=0,i=1;i<=m;i++){
int x=p[i];
while(t&&g[q[t]]<x)t--;
if(t&&q[t]>=f[x])w[x]=q[t];
while(t&&g[q[t]]<=g[x])t--;
q[++t]=x;
}
}
int main(){
fread(Buf,1,BUF,stdin);read(n);
for(i=1;i<=n;i++)read(a[i]);
for(i=1;i<=n;q[++t]=i++){
while(t&&a[q[t]]<a[i])t--;
f[i]=q[t]+1;
}
for(q[t=0]=n+1,i=n;i;q[++t]=i--){
while(t&&a[q[t]]>a[i])t--;
g[i]=q[t]-1;
}
for(i=n;i;i--)add(i-a[i]+n,i);
for(i=0;i<=n+n;i++){
for(m=0,j=st[i];j;j=nxt[j])p[++m]=j;
solve();
}
for(i=1,j=0;i<=n;i++)if(w[i])if(w[i]<=j)w[i]=0;else j=w[i],ans++;
printf("%d\n",ans);
for(i=1;i<=n;i++)if(w[i])printf("%d %d\n",w[i],i);
return 0;
}

  

BZOJ4970 : [ioi2004]empodia 障碍段的更多相关文章

  1. BZOJ4970 IOI2004 empodia障碍段

    4970: [ioi2004]empodia 障碍段 Time Limit: 10 Sec  Memory Limit: 128 MB Description 古数学及哲学家毕氏相信自然之本质为数学. ...

  2. CF954F Runner's Problem(动态规划,矩阵快速幂)

    CF954F Runner's Problem(动态规划,矩阵快速幂) 题面 CodeForces 翻译: 有一个\(3\times M\)的田野 一开始你在\((1,2)\)位置 如果你在\((i, ...

  3. 本地管理表空间(LMT)与自动段空间管理(ASSM)概念

    创建表空间时,extent management local 定义本地管理表空间(LMT),segment space management auto 定义自动段空间管理(ASSM). extent ...

  4. 进阶篇:2.1)DFMA实施障碍和关键

    本章目的:了解DFMA实施障碍与关键. 1.实施的障碍 面向制造和装配的产品开发能够降低产品成本.提高产品质量.缩短产品开发周期,但是,由于传统产品开发思想和各种条件的限制,实施面向制造和装配的产品开 ...

  5. 跨越语言的障碍:C++/CLI 调用 C#

    首先我想投诉一下博客园首页右边栏的广告..最近总是出现很恐怖的整容脸的广告.真的是吓坏了.=.=大家有同感吗? 博客园前一阵子掀起了语言的广泛讨论,事实上语言的争执在整个程序员圈子也没有停止过.以我个 ...

  6. mysql向表中某字段后追加一段字符串:

    mysql向表中某字段后追加一段字符串:update table_name set field=CONCAT(field,'',str) mysql 向表中某字段前加字符串update table_n ...

  7. WPF自定义RoutedEvent事件代码段

    今天在写东西的时候,发现常用的代码段里没有RoutedEvent的,因此,写了一个代码段,方便以后使用,顺便记录一下,如何做代码段. 1.在项目中新建一个XML文件,将扩展名修改为snippet. 2 ...

  8. mssql 字增自段怎样重置(重新自增)|清空表已有数据

    方法1 -- 清空已有数据,并且将自增自段恢复从1开始计数 truncate table 表名 方法2 -- 不清空已有数据,但将自增自段恢复从1开始计数 dbcc checkident(表名,RES ...

  9. u-boot源码分析之C语言段

    题外话: 最近一直在学习u-boot的源代码,从代码量到代码风格,都让我认识到什么才是真正的程序.以往我所学到的C语言知识和u-boot的源代码相比,实在不值一提.说到底,机器都是0和1控制的.感觉这 ...

随机推荐

  1. js call() 笔记

    var ctrl = function() {}; ctrl.view = function() { return { show: function() { console.log("vie ...

  2. Python函数之匿名函数

    一:概述 匿名函数主要用来处理比较简单的逻辑,用一行显示,并将运算结果作为返回值返回 二:书写规则 函数名 = lambda 参数:返回值 参数可以有多个,多个参数使用逗号分隔 三 :例子 将func ...

  3. HDU 1075 What Are You Talking About (stl之map映射)

    What Are You Talking About Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/204800 K ...

  4. C#连接Oracle错误:OCIEnvCreate 失败,返回代码为 -1

    处理某些数据需要从Oracle里读取数据 因为数据不多,简单方便直接用 System.Data.OracleClient 添加引用,写sql语句一气呵成,运行立刻报错 从没见过这错误啊… 上网搜索之… ...

  5. [转] Javascript模块化编程(一):模块的写法

    随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者 ...

  6. Java中常见的排序方式-快速排序(升序)

    [基本思想] 快速排序在元素较多的情况下,排序效率是相当高的.其基本思想是这样: 假设数组为int[] arr = { 49, 38, 65, 97, 76, 13, 27, 22, 26, 41, ...

  7. java的IO流的一些测试

    public class Demo02 { public static void main(String[] args) { //获取当前毫秒值,用于测试 long l = System.curren ...

  8. 在github上创建新的分支(包括管理分支)

    考虑到前面的项目在master分支上,这个不是太友好,下面在只有master分支的基础上,新建一个dev分支 一:查看 1.查看本地分支 git branch 2.查看远程分支 git branch ...

  9. oracle授权表权限给用户

    命令:grant  xxx权限 on Table to USERgrant select,insert,update,delete,all on 表名 to 用户名例如:将test表的查询权限赋予to ...

  10. HTML的5种空格表示

    HTML提供了5种空格实体(space entity),它们拥有不同的宽度,非断行空格( )是常规空格的宽度,可运行于所有主流浏览器.其他几种空格(       ‌‍)在不同浏览器中宽度各异.     ...