D2. Great Vova Wall (Version 2)
l链接
[https://codeforces.com/contest/1092/problem/D2]
题意
和D1一样只是不能竖直放了
分析
水平放的话,就只可能是相邻等时才可以,而且你会发现
只有中间数字小于两边的才可以
比如551122是可以的,15522不可以,你用一个栈保存当前不能改变高度的位置
如果遇到相等的就出栈,具体看代码体会吧
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,h;
//freopen("in.txt","r",stdin);
while(~scanf("%d",&n)){
stack<int> stk;
int ma=0;
bool flag=1;
for(int i=0;i<n;i++)
{
scanf("%d",&h); ma=max(ma,h);
if(!stk.empty()){
if(h>stk.top()){//如果后面的比栈顶大是不可能填平的,前面没有操作余地了
//而后面的操作只会使得高度不变或者增加
flag=0;
}
if(stk.top()==h){//相邻的等高度可以变成大于等于当前的高度
stk.pop();
}
else if(stk.size()>h) stk.push(h);
}
else stk.push(h);
}
if(stk.size()>1||stk.size()==1&&stk.top()<ma) flag=0;
//剩下的就是无法改变的高度如果超过两个,无法同时满足剩下的高度
//或者剩一个,但是高度小于最大的,也是无法使得所有高度一样
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}