题目描述
传送门
题目大意:给定一个序列,序列上每个点有一个颜色。每一轮可以选择一些没有交集的区间,将每个区间涂上一种颜色。要求全程每个颜色最多被涂一个区间,求最少涂多少轮
题解
其实就是求一个合法的括号序列的最大深度。
注意“0 for a blank cell”这句话,刚开始没看到,结果不停的WA。。。。QAQ
代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#define N 300003
using namespace std;
int mx[N],mn[N],val[N],n,st[N],top,ins[N];
struct data{
int x,y;
}a[N];
int cmp(data a,data b)
{
return a.x<b.x;
}
int main()
{
freopen("a.in","r",stdin);
freopen("my.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&val[i]);
memset(mn,0x3f,sizeof(mn));
for (int i=1;i<=n;i++)
mn[val[i]]=min(mn[val[i]],i),
mx[val[i]]=max(mx[val[i]],i);
int cnt=0;
for (int i=1;i<=n;i++)
if (mn[i]!=0x3f3f3f3f) {
cnt++;
a[cnt].x=mn[i]; a[cnt].y=i;
cnt++;
a[cnt].x=mx[i]; a[cnt].y=i;
}
sort(a+1,a+cnt+1,cmp);
int ans=0;
for (int i=1;i<=cnt;i++)
if (ins[a[i].y]) {
if (st[top]!=a[i].y) {
printf("-1\n");
return 0;
}
st[top--]=0;
}
else{
st[++top]=a[i].y;
ins[a[i].y]=1;
ans=max(ans,top);
}
printf("%d\n",ans);
}