Codeforces Round #305 (Div. 2) D.Mike and Feet

2930 단어 codeforces
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 strength of 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.
Examples
input
10
1 2 3 4 5 4 3 2 1 6

output
6 4 4 3 3 2 2 1 1 1 

참고:http://blog.csdn.net/libin56842/article/details/46473803
제목의 뜻은 말하지 않겠다.자서에 단조로운 창고가 있는 비슷한 문제가 있는데 뇌구멍이 크지 않아서 O(n)방법을 생각하지 못했다.대신의 단조로운 창고 사고방식을 거울로 삼았지만 생각은 아직 투철하지 않다.
단조롭게 증가하는 창고를 구성함으로써 어떤 길이의 구간 내에서 가장 작은 값이 얼마나 큰지 판단하는 것이다.
먼저 node를 구성하면num는 창고에 들어갈 때 이 원소의 값을 나타내고width는 너비를 나타내며 창고 꼭대기에서 원소의 거리를 나타낸다.연속 구간의 최소값을 찾았을 때, 실제적으로 최소값을 찾았을 때, 왼쪽에서 오른쪽으로 확장할 수 있는 최장 거리를 찾았다.여기의width는 왼쪽으로 확장된 거리 (자신 포함) 를 표시하고, 오른쪽으로 확장된 거리는 퇴장할 때 계산 (즉while 순환 중의len) 합니다.
처리가 완료되면 업데이트되지 않은 점이 있을 수 있으므로 앞으로 업데이트합니다.
ans[i]=max(ans[i],ans[i+1])
여기의 이해가 완전하지 않아서 처음에 ans[i]=0을 방지하는 줄 알았는데 실제 상황에서 이것뿐만 아니라 ans[i]의 크기도 보장할 수 있다는 것을 발견하고 마지막에 의심을 품었다.
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define INF 0x3f3f3f3
const int N=200005;
const int mod=1e9+7;

struct node{
    int num,width;
    node() {};
    node(int _num,int _width):num(_num),width(_width) {}
};

stack s;
int a[N],ans[N];

int main(){
    int n,i,j;
    cin>>n;
    for (i=0; ians[ls]) {
                ans[ls]=k.num;
            }
            len+=k.width;
            s.pop();
        }
        s.push(node(a[i],len+1));
    }
    for (i=n-1; i>=1; i--) {
        ans[i]=max(ans[i],ans[i+1]);
    }
    for (i=1; i

좋은 웹페이지 즐겨찾기