题意:
给一排砖,每列的高度$a_i$,问是否可以放1*2的砖,使得n列高度一样,砖只能横着放
思路:
每两个相邻的高度相同的砖可以变成大于等于它的高度的任意高度
所以像这样的
123321
是不满足题意的,因为两边的相同的高度没法合在一起
只有像这样的
321123
才满足
所以,满足题意的墙应该像上述一样几个“凹”的高度的组合加上最多一列高度为h的墙
这个h应该满足h<=max(a),准确来说应该是等于
拿栈搞一搞就行了
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<stack> #include<queue> #include<deque> #include<set> #include<vector> #include<map> #include<functional> #define fst first #define sc second #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) #define lson l,mid,root<<1 #define rson mid+1,r,root<<1|1 #define lc root<<1 #define rc root<<1|1 #define lowbit(x) ((x)&(-x)) using namespace std; typedef double db; typedef long double ldb; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> PI; typedef pair<ll,ll> PLL; const db eps = 1e-6; const int mod = 1e9+7; const int maxn = 2e5+100; const int maxm = 2e6+100; const int inf = 0x3f3f3f3f; const db pi = acos(-1.0); stack<int>s; int main(){ int n; scanf("%d", &n); int mx = -1; for(int i = 1; i <= n; i++){ int x; scanf("%d", &x); mx = max(mx, x); if(!s.empty()){ if(s.top() < x){ return printf("NO"),0; } if(s.top() == x){ s.pop(); } else if(s.top() > x){ s.push(x); } } else s.push(x); } if(s.size() > 1) return printf("NO"),0; else if(s.size() == 1){ if(s.top() < mx) return printf("NO"),0; } printf("YES"); return 0; } /* */