炼金术师

题目链接:nowcoder 217127

到主站看:https://blog.csdn.net/weixin_43346722/article/details/116243190

题目大意

给你一些操作,每次将 1~x 的地方染上一个新的颜色。
你可以任意选一个颜色,选一个 x 把 1~x 的地方都染上这个颜色。
问你你至少要染多少次才能染的跟题目的一样。

思路

根据题目容易看出它就是要你维护一个单调队列,然后问你到最后它的长度。

然后你就跟着做就好了。

代码

#include<cstdio>

using namespace std;

int n, x, q[1000001];

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &x);
        while (q[0] && q[q[0]] <= x) q[0]--;
        q[++q[0]] = x;//维护单调队列
    }

    printf("%d", q[0]);//输出最后单调队列的长度

    return 0;
}