- 单调栈:最基础的应用、针对每个数,寻找它和它右边第一个比它大的数之间有多少个数。
- 题意:有n堆相邻的砖,每堆都有一个高度,你可以在相邻的两堆中放一个1*2的砖使它们高度都加一
- (要求相邻两堆高度必须相同)。输出可不可以让最后n堆砖有相同高度。(很明显是copy的zyl的)
- 思路:eemm除了最高的那个高度的砖不需要处理别的,都得往上垒砖,那就看一下这个数左边小于等于他的
- 与右边小于等于它的数目包含它本身和是偶数即可。例子呢zyl也举了 1 1 2 2 1 1 3 3 3, 首先看1,
- 每一堆1的个数都为偶数ok,然后序列就变成了 2 2 2 2 2 2 3 3 3 再看2 也是偶数 也ok ,所有就处理出每个数
- 右边第一个比它大的数之间有多少个数 and 左边第一个比它大的数之间有多少个数 .
-
#include<bits/stdc++.h> using namespace std; #define maxn 234567 int n,a[maxn],b[maxn]; int w[maxn],maxx; int main() { scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%d",&a[i]); b[n-i-1]=a[i]; maxx=max(maxx,a[i]); w[i]=-1; } stack<int>k1,k2; for(int i=0; i<n; i++) { if(k1.empty()) k1.push(i); else { while(!k1.empty()&&a[i]>a[k1.top()]) { w[k1.top()]+=i-k1.top(); k1.pop(); } k1.push(i); } if(k2.empty()) k2.push(i); else { while(!k2.empty()&&b[i]>b[k2.top()]) { w[n-1-k2.top()]+=i-k2.top(); k2.pop(); } k2.push(i); } } while(!k1.empty()) { w[k1.top()]+=n-k1.top(); k1.pop(); } while(!k2.empty()) { w[n-1-k2.top()]+=n-k2.top(); k2.pop(); } for(int i=0; i<n; i++) if(w[i]%2&&a[i]!=maxx) { printf("NO\n"); return 0; } printf("YES\n"); return 0; }
D2. Great Vova Wall (Version 2)-单调栈
最新推荐文章于 2020-12-01 15:37:01 发布