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;
}
一直地一直地往前走