传送门

还是一个字——栈

然后加一大堆特判

至少我是这么做的

我的代码

#include <cstdio>
#include <iostream>
#define N 100001
#define max(x, y) ((x) > (y) ? (x) : (y)) int s[N], a[N], b[N];
int n, top, ans; inline int read()
{
int x = 0, f = 1;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
return x * f;
} int main()
{
int i, x;
n = read();
for(i = 1; i <= n; i++)
{
a[i] = read();
b[a[i]]++;
}
for(i = 1; i <= n; i++)
{
if(!top && !a[i]) continue;
else if(!a[i])
{
s[++top] = a[i];
continue;
}
if(s[top] == a[i] && b[a[i]] > 1)
{
ans = max(ans, top);
b[a[i]]--;
}
else if(s[top] == a[i] && b[a[i]] == 1)
{
ans = max(ans, top);
b[a[i]]--;
top--;
}
else if(b[a[i]] == 1) ans = max(ans, top + 1);
else
{
s[++top] = a[i];
b[a[i]]--;
}
}
if(top) puts("-1");
else printf("%d\n", ans);
return 0;
}

  

看了题解

发现预处理出来每种颜色最左边和最右边的位置会更好处理

如果两种颜色有交集,直接输出-1

题解代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int n;
int a[100008],l[100008],r[100008];
int s[100008],top;
int tmp,ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(!l[a[i]]) l[a[i]]=i;
r[a[i]]=i;
}
for(int i=1;i<=n;i++){
if(a[i]==0){
if(top){
cout<<-1;
return 0;
}
else continue;
}
if(l[a[i]]==i){
if(top&&r[a[i]]>r[s[top]]){
cout<<-1;
return 0;
}
s[++top]=a[i];
tmp++;
ans=max(ans,tmp);
}
if(r[a[i]]==i){
top--;
tmp--;
}
}
cout<<ans;
return 0;
}

  

5

1 2 1 2 1

这组数据,我输出-1,题解输出2

好像题解错了,但因为数据水,所以,你懂的

[luoguP3668] [USACO17OPEN]Modern Art 2 现代艺术2(栈)的更多相关文章

  1. 洛谷P3668 [USACO17OPEN]Modern Art 2 现代艺术2

    P3668 [USACO17OPEN]Modern Art 2 现代艺术2 题目背景 小TY的同学HF也想创作艺术 HF只有一块长条状的画布(画条),所以每一次涂色只能涂上连续几个单位的颜料,同样新的 ...

  2. [LuoguP3668][USACO17OPEN]现代艺术2

    [LuoguP3668][USACO17OPEN]Modern Art2(Link) 现在你有一块长为\(N\)的画布,每次可以选择一段连续的区间进行颜色填涂,新颜色会覆盖旧颜色.每一次填涂都要耗费一 ...

  3. bzoj 4780: [Usaco2017 Open]Modern Art 2

    4780: [Usaco2017 Open]Modern Art 2 Time Limit: 10 Sec  Memory Limit: 128 MB Description Having becom ...

  4. lesson 18 Electric currents in modern art

    lesson18 Electric currents in modern art electricity n. 电力:电流; electric adj. 电的:电动的; electronic adj. ...

  5. [Usaco2017 Open]Modern Art 2

    Description Having become bored with standard 2-dimensional artwork (and also frustrated at others c ...

  6. BZOJ2368 : Modern Art Plagiarism 树同构

    枚举$T_1$的树根,然后DP,设$f[i][j]$表示$T_1$的子树$i$是否存在包括i的连通子树与$T_2$的子树$j$同构. 若$j$是叶子,那么显然可以. 若$deg_i<deg_j$ ...

  7. [BZOJ4776] [Usaco2017 Open]Modern Art(差分 + 思维?)

    传送门 可以预处理出每种颜色的上下左右的位置,这样就框出来了一个个矩形,代表每种颜色分别涂了哪里. 然后用二维的差分. 就可以求出来每个位置至少涂了几次,如果 > 1 的话,就肯定不是先涂的, ...

  8. Lesson 26 The best art critics

    Text I am an art student and I paint a lot of pictures. Manay people pretend that they understand mo ...

  9. Lesson 23 A new house

    Text I had a letter from my sister yesterday. She lives in Nigeria. In her letter, she said that she ...

随机推荐

  1. php类重载

    首先,因为PHP是弱类型语言,是不直接支持重载的,不过可以通过一些方法来实现重载. 先说一下重写 在子类继承父类方法后,自己重新定义父类的方法,包含函数名,形参(个数,顺序)完全相同,但权限修饰符可不 ...

  2. Nginx性能优化参考

    nginx性能优化参考 1)调整配置文件中的配置项的值(配置文件:nginx.conf) worker_processes auto;开启的进程数,一般配置为跟逻辑CPU核数一样worker_rlim ...

  3. 51nod 1212 无向图最小生成树(Kruskal模版题)

    N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树.   Input 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N <= 1000, 1 &l ...

  4. Netbeans使用笔记

    Netbeans 新建项目 A brand new project 选择"文件">"新建项目"以打开新建项目向导. 在向导中,选择 "C/C++ ...

  5. 数据倾斜是多么痛?spark作业调优秘籍

    目录视图 摘要视图 订阅 [观点]物联网与大数据将助推工业应用的崛起,你认同么?      CSDN日报20170703——<从高考到程序员——我一直在寻找答案>      [直播]探究L ...

  6. 制作新的train,test数据集

    之前的数据集的train和test是直接按照网上下载的数据的前7000个作为训练集,后2212个作为测试集.看得出来,这个数据集是由开车录制视频转换来的图片数据,后面2000多个图片的场景和前面的场景 ...

  7. Linux命令权限 用户权限 组权限 文件、目录权限

    Linux命令的格式是: 命令+选项+参数 命令是必须存在的,选项和参数可以不必存在,不写的情况是有默认的参数 Linux 一切皆文件 对于文件而言,只需要对文件进行读写就可以实现对文件内容内容的增删 ...

  8. 解决VS2013无法安装ArcObjects10.2的问题

    之前在网上看到的10.1在vs2012安装不上的问题,解决办法是改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\1 ...

  9. Linux文件系统概述二

    VFS-目录项对象(dentry) 每个文件除了有一个索引节点 inode 数据结构外,还有一个目录项 dentry 数据结构 dentry 结构代表的是逻辑意义上的文件,描述的是文件逻辑上的属性,目 ...

  10. python之数据类型补充

    1. capitalize (首字母大写) 例题: s = "alex wusir" s1 = s.capitalize() # 格式 print(s1) ''' 输出结果 Ale ...