Modern Art 2

Modern Art 2

栈的应用。记录每个颜色的开始和结束,在开始时进栈,结束时出栈,统计最大的栈深度就可以了。

关键条件是每种颜色只能用一次,所以如果任何时候,如果栈顶的颜色和我们要结束的颜色不一样,那这个顺序就是不可能的。例如这样的顺序:

1 2 1 2

到第二个1的时候,因为2还没有结束,所以是栈顶元素,这时候就应该输出-1了。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
 
int n;  // 1e5
int a[100005];
pi cl[100005];   // start and end of each color
stack<int> st;
int ans;
 
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        cl[i] = {-1,-1};
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
        pi c = cl[a[i]];
        cl[a[i]] = {c.first == -1 ? i : c.first, i};
    }
    for (int i = 0; i < n; i++) {
        if (a[i] == 0) {
            if (st.size()) {
                printf("-1"); 
                return 0;
            }
            continue;
        }
        pi c = cl[a[i]];
        if (c.first == i) st.push(a[i]);
        ans = max(ans, (int)st.size());
        if (c.second == i) {
            if (st.top() != a[i]) { // overlapping colors, impossible to paint
                printf("-1");
                return 0;
            }
            st.pop();
        }
    }
    printf("%d", ans);
    return 0;
}