D. Mike and Feet
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Mike is the president of country What-The-Fatherland. There are n bears living in this country besides Mike. All of them are standing in a line and they are numbered from 1 to n from left to right. i-th bear is exactly ai feet high.

A group of bears is a non-empty contiguous segment of the line. The size of a group is the number of bears in that group. The strengthof a group is the minimum height of the bear in that group.

Mike is a curious to know for each x such that 1 ≤ x ≤ n the maximum strength among all groups of size x.

Input

The first line of input contains integer n (1 ≤ n ≤ 2 × 105), the number of bears.

The second line contains n integers separated by space, a1, a2, ..., an (1 ≤ ai ≤ 109), heights of bears.

Output

Print n integers in one line. For each x from 1 to n, print the maximum strength among all groups of size x.

Sample test(s)
input
10
1 2 3 4 5 4 3 2 1 6
output
6 4 4 3 3 2 2 1 1 1 

先用ST算法处理出一段区间内最小值。二分查询出对于第i个数,以它为最小向左或向右可达的最值,得到区间长度为r-l+1。那么,对于group长度为1,2,3,....r-l+1最小值为第i个数的值。则区间更新这些组大小,取最大值。此处可以使用线段树维护。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=200050;
const int inf=1e9+107; int feet[N];
int st[N][20];
int seg[N<<2];
int ans[N];
void pushdown(int rt){
seg[rt<<1]=max(seg[rt<<1],seg[rt]);
seg[rt<<1|1]=max(seg[rt<<1|1],seg[rt]);
seg[rt]=-1;
} void ST(int num){
for(int i=1;i<=num;i++)
st[i][0]=feet[i];
for(int j=1;j<20;j++)
for(int i=1;i<=num;i++){
if(i+(1<<j)-1 <= num){
st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
}
} void update(int rt,int l,int r,int L,int R,int val){
if(l<=L&&R<=r){
if(val>seg[rt]) seg[rt]=val; return;
}
int m=(L+R)>>1;
pushdown(rt);
if(r<=m){
update(rt<<1,l,r,L,m,val);
}
else if(l>=m+1){
update(rt<<1|1,l,r,m+1,R,val);
}
else{
update(rt<<1,l,r,L,m,val);
update(rt<<1|1,l,r,m+1,R,val);
}
} void dfs(int rt,int L,int R){
if(L==R){
ans[L]=seg[rt];
return ;
}
pushdown(rt);
int m=(L+R)>>1;
dfs(rt<<1,L,m);
dfs(rt<<1|1,m+1,R);
} int query(int l,int r){
int k=(int)((log(r-l+1))/log(2.0));
int maxl=min(st[l][k],st[r-(1<<k)+1][k]);
return maxl;
} int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=(n<<2)+10;i++){
seg[i]=-1;
}
for(int i=1;i<=n;i++){
scanf("%d",&feet[i]);
}
ST(n);
for(int i=1;i<=n;i++){
//left
int l=1,r=i;
int L=i,R=i;
while(l<=r){
int m=(l+r)>>1;
int index=query(m,i);
if(index>=feet[i]){
r=m-1;
L=m;
}
else {
l=m+1;
}
}
//right
l=i,r=n;
while(l<=r){
int m=(l+r)>>1;
int index=query(i,m);
if(index>=feet[i]){
l=m+1;
R=m;
}
else {
r=m-1;
}
}
update(1,1,R-L+1,1,n,feet[i]);
}
dfs(1,1,n);
printf("%d",ans[1]);
for(int i=2;i<=n;i++)
printf(" %d",ans[i]);
printf("\n");
}
return 0;
}

  

Codeforces Round #305 (Div. 2) D题 (线段树+RMQ)的更多相关文章

  1. Codeforces Round #603 (Div. 2) E. Editor 线段树

    E. Editor The development of a text editor is a hard problem. You need to implement an extra module ...

  2. Codeforces Round #765 Div.1 F. Souvenirs 线段树

    题目链接:http://codeforces.com/contest/765/problem/F 题意概述: 给出一个序列,若干组询问,问给出下标区间中两数作差的最小绝对值. 分析: 这个题揭示着数据 ...

  3. Codeforces Codeforces Round #316 (Div. 2) C. Replacement 线段树

    C. ReplacementTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/570/problem ...

  4. Codeforces Round #406 (Div. 1) B. Legacy 线段树建图跑最短路

    B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...

  5. 【转】Codeforces Round #406 (Div. 1) B. Legacy 线段树建图&&最短路

    B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...

  6. Codeforces Round #406 (Div. 2) D. Legacy 线段树建模+最短路

    D. Legacy time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...

  7. Codeforces Round #278 (Div. 1) Strip (线段树 二分 RMQ DP)

    Strip time limit per test 1 second memory limit per test 256 megabytes input standard input output s ...

  8. Codeforces Round #305 (Div. 2) E题(数论+容斥原理)

    E. Mike and Foam time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  9. Codeforces Round #305 (Div. 2) C题 (数论)

    C. Mike and Frog time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

随机推荐

  1. python自动化测试学习笔记-1

    一.什么是自动化 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程.直白的就是为了节省人力.时间或硬件资源,提高测试效率,便引入了通过软件或程序自动化执行测试用例进行测试: 二.python ...

  2. URI、URL、请求、响应、常见状态代码

    URI:路径(统一资源标识符,包括本地地址和网络地址) URL是URI的一种子路径, URI范围比URL范围广. URL (Uniform Resource Locator,统一全球资源定位符): 通 ...

  3. 324 Wiggle Sort II 摆动排序 II

    给定一个无序的数组nums,将它重新排列成nums[0] < nums[1] > nums[2] < nums[3]...的顺序.例子:(1) 给定nums = [1, 5, 1, ...

  4. [转]使用ThinkPHP框架快速开发网站(多图)

    本文转自:http://blog.csdn.net/ruby97/article/details/7574851 这一周一直忙于做实验室的网站,基本功能算是完成了.比较有收获的是大概了解了ThinkP ...

  5. 学习c语言的感想

    其实个人认为无论学习什么语言,最重要的是掌握习编程思想,然而C语言一种学习编程思想的基础语言.所以,C语言的重要性不言而喻. 一.课本 无论用的是什么书,要学好C语言,把书上的每一个例题.习题的代码读 ...

  6. 深拷贝js

    JSON 最简单的一个 let obj = {} let newObj = JSON.parse(JSON.stringify(obj)) 弊端:这种方法无法拷贝function函数,undefine ...

  7. Java 开源博客 Solo 1.3.0 发布 - Docker 支持

    Solo 1.3.0 正式发布了,感谢一直以来关注 B3log 开源的朋友! 可以通过一个命令启动(不需要安装数据库.部署容器),也可以通过 war 方式部署容器,连接 MySQL.这应该是史上最容易 ...

  8. 微信自定义分享功能实现Tips

    以MVC为例 前台js通过.post()方法传给后台特定Controller当前页面的url,后台获取后,进行处理: 1.获取access_token:https://mp.weixin.qq.com ...

  9. Angular——内置指令

    内置指令 ng-app 指定应用根元素,至少有一个元素指定了此属性. ng-controller 指定控制器 ng-show控制元素是否显示,true显示.false不显示 ng-hide控制元素是否 ...

  10. html5——3D案例(立体导航)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...