51nod1437 迈克步 单调栈
2024-08-24 19:03:55
考虑一个点作为最小值的区间$[L[i], R[i]]$
那么这个区间的所有含$i$的子区间最小值都是$v[i]$
因此,用单调栈求出$L[i], R[i]$后,对$R[i] - L[i] + 1$这个长度打一个$v[i]$的标记
之后,统计后缀最大值就能得出答案
注:不加输出优化会$T$
复杂度$O(n)$,暂居$rk1$
#include <cstdio>
#include <iostream>
using namespace std; extern inline char gc() {
static char RR[], *S = RR + , *T = RR + ;
if(S == T) fread(RR, , , stdin), S = RR;
return *S ++;
}
inline int read() {
int p = , w = ; char c = gc();
while(c > '' || c < '') { if(c == '-') w = -; p = p * + c - ''; c = gc(); }
while(c >= '' && c <= '') p = p * + c - '', c = gc();
return p * w;
} int wr[], rw;
#define pc(o) *O ++ = o
char WR[], *O = WR;
inline void write(int x) {
if(!x) pc('');
if(x < ) x = -x, pc('-');
while(x) wr[++ rw] = x % , x /= ;
while(rw) pc(wr[rw --] + ''); pc(' ');
} #define ri register int
#define sid 200050 int n, st[sid], top;
int v[sid], L[sid], R[sid], ans[sid]; int main() {
n = read();
for(ri i = ; i <= n; i ++) v[i] = read(); st[top = ] = ; v[] = ;
for(ri i = ; i <= n; i ++) {
while(top && v[st[top]] >= v[i]) top --;
L[i] = st[top] + ; st[++ top] = i;
} st[top = ] = n + ; v[n + ] = ;
for(ri i = n; i >= ; i --) {
while(top && v[st[top]] >= v[i]) top --;
R[i] = st[top] - ; st[++ top] = i;
} for(ri i = ; i <= n; i ++) {
int len = R[i] - L[i] + ;
ans[len] = max(ans[len], v[i]);
}
for(ri i = n; i >= ; i --) ans[i] = max(ans[i], ans[i + ]);
for(ri i = ; i <= n; i ++) write(ans[i]);
fwrite(WR, , O - WR, stdout);
return ;
}
最新文章
- Ubuntu 14.04 安装 JDK 8,ubuntu14.04
- 转 BHO API HOOK Wininet基于IE编程的一些资料
- MVC WEB安全——XSS攻击防御
- 如何用JS获取ASP.net中的textbox的值 js获不到text值
- How Tomcat Works(五)
- nyoj-257 郁闷的C小加(一) 前缀表达式变后缀
- 用git difff 生成补丁
- Android 物理按键
- 宣布正式发布 Biz Talk Services、Azure Active Directory 和 Traffic Manager, 同时发布 Azure Active Directory 高级版预览
- 深入浅出数据结构C语言版(3)——递归简论
- 8.C++-类的关键字
- css-tips
- mysql 高版本only_full_group_by 错误
- Kaldi的delta特征
- spring集成jwt验证方式,token验证
- spring-mybatis代码生成插件,与实例展示
- 编译Spring源码
- Fiddler设置抓取https请求
- Hadoop YARN简介
- 都铎王朝第一至四季/全集The Tudors迅雷下载