BZOJ_1307_玩具_单调栈+双指针
BZOJ_1307_玩具_单调栈+双指针
Description
Input
Output
Sample Input
2
4
1
3
2
1
Sample Output
HINT
1<=Value[i]<=10^6
10%的测试数据 N<=10^5。
100%的测试数据 N<=10^6
枚举是哪个数作为最大数。
即求出L1[i]表示把i当成最大的数向左能拓展到哪,R1[i]表示向右拓展到哪。
这步用单调栈一下找到左右第一个大于这个数。
然后求出L2[i]表示满足没有两个数相等的情况下向左能拓展到哪,R2[i]表示向右能拓展到那。
这步用双指针求一下。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 1000050
inline char nc() {
static char buf[100000],*p1,*p2;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
int rd() {
int x=0; char s=nc();
while(s<'0'||s>'9') s=nc();
while(s>='0'&&s<='9') x=(x<<3)+(x<<1)+s-'0',s=nc();
return x;
}
int n,a[N],L1[N],R1[N],L2[N],R2[N],ans,S[N],h[N];
int main() {
n=rd();
int i,tp=0;
for(i=1;i<=n;i++) a[i]=rd();
for(i=1;i<=n;i++) {
while(tp&&a[S[tp]]<=a[i]) tp--;
L1[i]=tp?S[tp]+1:1;
S[++tp]=i;
}
tp=0;
for(i=n;i;i--) {
while(tp&&a[S[tp]]<=a[i]) tp--;
R1[i]=tp?S[tp]-1:n;
S[++tp]=i;
}
// for(i=1;i<=n;i++) printf("%d %d\n",L1[i],R1[i]);
int j=1;
for(i=1;i<=n;i++) {
h[a[i]]++;
while(j<=n&&h[a[i]]==2) {
h[a[j]]--; j++;
}
if(h[a[i]]==1) L2[i]=j;
}
for(i=1;i<=n;i++) h[a[i]]=0;
j=n;
for(i=n;i;i--) {
h[a[i]]++;
while(j>=1&&h[a[i]]==2) {
h[a[j]]--; j--;
}
if(h[a[i]]==1) R2[i]=j;
}
// for(i=1;i<=n;i++) printf("%d %d\n",L2[i],R2[i]);
for(i=1;i<=n;i++) {
int len=min(R1[i],R2[i])-max(L1[i],L2[i])+1;
if(len>=a[i]) ans=max(ans,a[i]);
}
printf("%d\n",ans);
}
BZOJ_1307_玩具_单调栈+双指针的更多相关文章
- [每日一题2020.06.13]leetcode #739 #15 单调栈 双指针查找
739 每日温度 ( 单调栈 ) 题目 : https://leetcode-cn.com/problems/daily-temperatures/ 题意 : 找到数组每一个元素之后第一个大于它的元素 ...
- [bzoj1345][Baltic2007]序列问题_单调栈
bzoj-1345 Baltic-2007 序列问题 题目大意:对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai ...
- LOJ#3083.「GXOI / GZOI2019」与或和_单调栈_拆位
#3083. 「GXOI / GZOI2019」与或和 题目大意 给定一个\(N\times N\)的矩阵,求所有子矩阵的\(AND(\&)\)之和.\(OR(|)\)之和. 数据范围 \(1 ...
- [bzoj4826][Hnoi2017]影魔_单调栈_主席树
影魔 bzoj-4826 Hnoi-2017 题目大意:给定一个$n$个数的序列$a$,求满足一下情况的点对个数: 注释:$1\le n,m\le 2\cdot 10^5$,$1\le p1,p2\l ...
- [bzoj3238][Ahoi2013]差异_后缀数组_单调栈
差异 bzoj-3238 Ahoi-2013 题目大意:求任意两个后缀之间的$LCP$的和. 注释:$1\le length \le 5\cdot 10^5$. 想法: 两个后缀之间的$LCP$和显然 ...
- [bzoj1007][HNOI2008]水平可见直线_单调栈
水平可见直线 bzoj-1007 HNOI-2008 题目大意:给你n条直线,为你从上往下看能看见多少跳直线. 注释:能看见一条直线,当且仅当这条直线上存在一条长度>0的线段使得这条线段上方没有 ...
- BZOJ_1007_ [HNOI2008]_水平可见直线_(单调栈+凸包)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1007 给出一些直线,沿着y轴从上往下看,能看到多少条直线. 分析 由于直线相交,会遮挡住一些直 ...
- [bzoj2086][Poi2010]Blocks_单调栈_双指针
Blocks bzoj-2086 Poi-2010 题目大意:题目链接. 注释:略. 想法:首先,不难发现,如果连续的一段数的平均值不小于输入的k的话,这段数是满足题意的. 所以,我们再次简化一下:将 ...
- BZOJ_3238_[Ahoi2013]差异_后缀数组+单调栈
BZOJ_3238_[Ahoi2013]差异_后缀数组+单调栈 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao ...
随机推荐
- PHP中的字符串替换(str_replace)
/*替换 字符串处理 str_replace() */ $num = 0; $str = "http://www.phpbrother.net/php/demo.php";$st ...
- [NOIP2003] 提高组 洛谷P1041 传染病控制
题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带 ...
- php的错误控制运算符
php的错误控制运算符 PHP中提供了一个错误控制运算符“@”. 可以将@放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略掉: 如果开启了php.ini 中的 track_error ...
- 寒武纪camp Day6
补题进度:10/10 A(树形dp) 略 B(dp) 题意: 给出一个n个关键节点的机械手臂,最开始是竖直的,即关键点在二维平面上的坐标分别是(0,0) (0,100) (0,200) (0,300) ...
- 51nod 马拉松30 C(构二分图+状压dp)
题意 分析 考虑一个图能被若干简单环覆盖,那么一定是每个点恰好一个出度,恰好一个出度 于是类似最小路径覆盖的处理,我们可以把每个点拆成2个点i和i',如果有一条边(i,j),那么将i和j'连起来 那么 ...
- java去空格
1.trim()是去掉首尾空格 2.str.replace(" ", ""); 去掉所有空格,包括首尾.中间 3.或者replaceAll(&quo ...
- 【APUE】进程间通信之消息队列
三种IPC的共同特征 1.标识符和键 每个内核中的IPC结构都用一个非负整数的标识符加以引用.当一个IPC结构被创建,以后又被删除时,与这种结构相关的标识符连续加1,直至达到一个整型数的最大值,然后又 ...
- POJ 1679 The Unique MST 推断最小生成树是否唯一
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22715 Accepted: 8055 D ...
- 奥斯卡·王尔德十大经典语录
10不够真诚是危急的,太真诚则绝对是致命的.--摘自<身为艺术家的评论者> "A little sincerity is a dangerous thing, and a gre ...
- freemarker 模板
1 整体结构 模板(FTL 编程)是由例如以下部分混合而成的: Text 文本:文本会照着原样来输出. Interpolation 插值:这部分的输出会被计算的值来替换.插值由${和}所分隔(或者#{ ...