CSA Round #53 (Div. 2 only) Histogram Partition(模拟)

传送门

题意

给出一个数组A,你有一个数组B(一开始全为0),询问多少次操作后B转化为A
一次操作:选择一段区间,加上某个正整数

分析

构建一个栈,
输入一个数,若当前栈空或栈顶元素比输入小,则加入栈中,否则若大于栈顶元素,则删去栈顶元素,放入输入元素,复杂度O(n)

trick

代码

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define F(i,a,b) for(int i=a;i<=b;++i)
#define R(i,a,b) for(int i=a;i<b;++i)
#define mem(a,b) memset(a,b,sizeof(a))

int n;
stack<int>s;
int ans;

int main()
{
   cin >> n;
   F(i, 0, n)
   {
      int val = 0;
      if (i < n) cin >> val;
      if (!s.empty() && s.top() > val) {s.pop(); s.push(val); ans++;}
      if (s.empty() || s.top() < val) s.push(val);
   }
   cout << ans << endl;
   return 0;
}

posted @ 2017-10-19 10:59  遗风忘语  阅读(101)  评论(0编辑  收藏  举报