[NOIP模拟]Modern Art2

来源:互联网 发布:中国城市化率数据 编辑:程序博客网 时间:2024/05/17 01:53

题目描述:
这里写图片描述
样例输入 :
7
0
1
4
5
1
3
3
样例输出 :
2
样例解释:
在第一组样例中,月网首先选择[2,5]和[6,7]这两个区间,分别涂上颜色1 和 3。 然后选择[3,3]和[4,4]这两个区间,分别涂上颜色 4和 5。 (当然也有其它方案,但都至少需要两次操作)
数据范围:
30%的数据:N<=500
50%的数据: N<=10000
100% 的数据:N<=100000
题目分析:
做法:在读入时我们可以记录一个颜色的左边界和有边界。然后一次扫一遍,如果当前点是一种颜色的左边界,入栈,top++;如果是一种颜色的右边界,分两种情况:1、此时栈顶是它本身,出栈,top- -,1、此时栈顶不是它本身,则无解,输出-1。最后ans为整个过程中最大的top。
现在解释:首先这样出栈入栈,对于一种颜色的左右边界里如果有其它颜色,那么就无法同一次完成,操作次数增加。而一旦过了那种颜色右边界,后面的颜色就不会相互影响,可以同一次操作完成。top就代表了当前所需次数。例如样例:145133,1,top=1;4,top=2;4,top=1;5,top=2;5,top=1;1,top=0;3,top=1;3,top=0。ans=max(top)=2。考虑无解的情况,如果到了一种颜色右边界,发现它自己不是栈顶,那么说明至少有另一种颜色还未到其右边界,而这些颜色的左边界又在当前颜色左边界的右边,这就出现了一种交替覆盖的情况,如:1212,显然这办不到。
附代码:

#include<iostream>#include<cstring>#include<string>#include<cstdlib>#include<cstdio>#include<ctime>#include<queue>#include<set>#include<iomanip>#include<vector>#include<cctype>#include<cmath>#include<algorithm>using namespace std;const int maxn=1e5+10;int n,ans,top,a[maxn],sta[maxn],maxl[maxn],maxr[maxn];int readint(){    char ch;int i=0,f=1;    for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());    if(ch=='-') {ch=getchar();f=-1;}    for(;ch>='0'&&ch<='9';ch=getchar()) i=(i<<3)+(i<<1)+ch-'0';    return i*f;}int main(){    //freopen("lx.in","r",stdin);    n=readint();    for(int i=1;i<=n;i++)    {        a[i]=readint();        if(a[i]==0) continue;        if(maxl[a[i]]==0) maxl[a[i]]=i;        maxr[a[i]]=i;    }    for(int i=1;i<=n;i++)    {        if(i==maxl[a[i]])        {            sta[++top]=a[i];            ans=max(ans,top);        }        if(i==maxr[a[i]])        {            if(sta[top]==a[i]) --top;            else            {                printf("-1");                return 0;            }        }    }    printf("%d",ans);    return 0;}
原创粉丝点击