D2. Great Vova Wall (Version 2)-单调栈

  • 单调栈:最基础的应用、针对每个数,寻找它和它右边第一个比它大的数之间有多少个数。
  • 题意:有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;
    }

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/85099844
今日推荐