cf 547B 单调栈
2015-06-03 16:10
417 查看
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=2e5+10;
int lst[maxn],nxt[maxn];
int a[maxn],s[maxn];
int n;
int tp;
int ans[maxn];
void getPos(int i)
{
lst[i]=i;nxt[i]=n;
while(tp!=0 && a[s[tp-1]]>=a[i])//tp初值为0,注意是>=
nxt[s[--tp]]=i-1;
s[tp++]=i;
if(tp==1) lst[i]=1;
else lst[i]=s[tp-2]+1;
}
int main()
{
tp=0;
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
getPos(i);//边输入边插入
}
for(int i=1;i<=n;i++)
{
int len=nxt[i]-lst[i]+1;
ans[len]=max(ans[len],a[i]);
}
for(int i=n-1;i>0;i--)
{
ans[i]=max(ans[i],ans[i+1]);
}
for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
}
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=2e5+10;
int lst[maxn],nxt[maxn];
int a[maxn],s[maxn];
int n;
int tp;
int ans[maxn];
void getPos(int i)
{
lst[i]=i;nxt[i]=n;
while(tp!=0 && a[s[tp-1]]>=a[i])//tp初值为0,注意是>=
nxt[s[--tp]]=i-1;
s[tp++]=i;
if(tp==1) lst[i]=1;
else lst[i]=s[tp-2]+1;
}
int main()
{
tp=0;
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
getPos(i);//边输入边插入
}
for(int i=1;i<=n;i++)
{
int len=nxt[i]-lst[i]+1;
ans[len]=max(ans[len],a[i]);
}
for(int i=n-1;i>0;i--)
{
ans[i]=max(ans[i],ans[i+1]);
}
for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
}
相关文章推荐
- CS架构和BS架构的区别
- 剑指offer之链表续
- 加密算法(扩展知识:Base64编码)
- 【绿皮】新GRE填空补充练习题Exercise7
- INFOBRIGHT 快速安装
- UIView中的drawRect
- php实现将上传word文件转为html的方法
- go安装
- Winform 获取Win7 UAC 管理员权限
- #if DEBUG的妙用
- Android 系统中 Location Service 的实现与架构
- opoengl 投影矩阵的推导
- Ubuntu12.04 安装jdk
- ZH奶酪:JavaScript中的JSON.stringify() and JSON.parse()
- DFS深度优先遍历
- 外盘和内盘
- 基本SQL语句学习1.0
- dockerfile_instructions(指令)
- SAT阅读真题资料4
- 在Maven仓库中添加Oracle JDBC驱动