题意:
现在给你一个长度为 1day 油漆干了后再同样操作,输出创作完成并全干了后的最少时间。
一道括号序列的变形问题。
记录每一种颜色的起始点以及终点,可以想象,如果染色次数要最少,那么最外一层的颜色要最先涂。
于是我们维护一个栈,把每个颜色加入栈,最大染色次数就是栈最大的元素个数。
对于每一种颜色
如果
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define INF 1e9
using namespace std;
const int maxn=1e5+5;
int n,a[maxn],ans;
int s[maxn],t[maxn];
int stack[maxn],top;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(!s[a[i]])
s[a[i]]=i;
t[a[i]]=i;
}
t[0]=n+1;
for(int i=0;i<=n;i++)
{
int p=a[i];
if(i==s[p])
{
stack[++top]=p;
ans=max(ans,top);
}
if(p!=stack[top])
{
printf("-1");
return 0;
}
if(i==t[p])
top--;
}
printf("%d",ans-1);
return 0;
}
//类似括号序列,同一种颜色只能涂一次!!!
//用个栈维护一下,如果开始新颜色就入栈,如果结束就出栈,如果在中间,且颜色与栈顶不同肯定无解。