题意:自己搜吧。。。

思路:

记二元组\((x,l)\)表示当前为\(x\)且之前有\(l\)个连续数与\(x\)相同。

并且维护up和low数组表示取到最大/最小值时,连续序列的长度。

正一遍,反一遍,搞定。

我排序手抖达成\(a.r and b.r\),调了1小时...

#include <bits/stdc++.h>
using namespace std;
const int maxn = 200010;
inline int read () {
int q=0,f=1;char ch = getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;ch=getchar();
}
while(isdigit(ch)){
q=q*10+ch-'0';ch=getchar();
}
return q*f;
}
struct node {
int l,r;
}up[maxn],low[maxn]; node Max(node a,node b) {
if(a.l > b.l||(a.l == b.l && a.r > b.r)) return a;
else return b;
} node Min(node a,node b) {
if(a.l > b.l||(a.l == b.l && a.r > b.r)) return b;
else return a;
} int n;
int a[maxn];
int ans[maxn];
int w[maxn];
node t1,t2;
int main () {
freopen("seq.in","r",stdin);
freopen("seq.out","w",stdout);
n = read();
up[0].r = 2;
low[0].r = 5;
for(int i = 1;i <= n; ++i) {
a[i] = read();
t1 = up[i - 1];
if(t1.r + 1 > 2) {
t1.l ++;
t1.r = 1;
}
else t1.r ++;
t2.l = a[i];
t2.r = 2;
if(a[i]) {
up[i] = Min(t1,t2);
}
else up[i] = t1;
t1 = low[i - 1];
if(t1.r + 1 > 5) {
t1.l ++;
t1.r = 1;
}
else {
t1.r ++;
}
t2.r = 1;
if(a[i]) {
low[i] = Max(t1,t2);
}
else low[i] = t1;
}
if(a[1] > 1) {
puts("-1");
return 0;
}
if(up[n].r == 1) {
up[n].l --;
}
for(int i = 1;i <= n; ++i) {
if(a[i]) {
if(a[i] < low[i].l || a[i] > up[i].l) {
puts("-1");
return 0;
}
ans[i] = a[i];
}
if(up[i].l < low[i].l) {
puts("-1");
return 0;
}
}
ans[n] = up[n].l;
w[ans[n]] ++;
for(int i = n - 1;i; --i) {
if(!a[i]) {
ans[i] = min(ans[i + 1],up[i].l);
if(w[ans[i]] == 5) {
ans[i] --;
}
}
w[ans[i]] ++;
}
printf("%d\n",ans[n]);
for(int i = 1;i <= n; ++i) {
printf("%d ",ans[i]);
}
return 0;
}

[JZOJ 5811] 简单的填数的更多相关文章

  1. NOIP模拟测试「简单的区间·简单的玄学·简单的填数·简单的序列」

    简单的区间 $update$ 终于$AC$了 找到$(sum[r]+sum[l](sum表示以中间点为基准的sum)-mx)\%k==0$的点 注意这里$sum$表示是以$mid$为基准点,(即$su ...

  2. noip模拟12[简单的区间·简单的玄学·简单的填数]

    noip模拟12 solutions 这次考试靠的还是比较好的,但是还是有不好的地方, 为啥嘞??因为我觉得我排列组合好像白学了诶,文化课都忘记了 正难则反!!!!!!!! 害没关系啦,一共拿到了\( ...

  3. [CSP-S模拟测试]:简单的填数(贪心+模拟)

    题目描述 对于一个长度为$n$,且下标从$1$开始编号的序列$a$,我们定义它是「合法的」,当且仅当它满足以下条件:·$a_1=1$·对于$i\in [1,n),a_i\leqslant a_{i+1 ...

  4. NOIP 模拟 $12\; \text{简单的填数}$

    题解 一个纯的贪心,被我搞成 \(dp\) 了,最后把错解删掉了,骗了 \(10pts\) 考虑如何贪心,设置一种二元组 \((x,l)\),\(x\) 表示当前值,\(l\) 表示当前最长连续长度. ...

  5. <蛇形填数>--算法竞赛 入门经典(第2版)- 3.1 数组 程序3-3 蛇形填数

     蛇形填数: 在n×n方阵里填入1,2,....,n×n,要求填成蛇形.例如,n = 4 时方阵为:    10  11  12  1   9  16  13  2 8  15  14  3 7   ...

  6. 蓝桥杯 方格填数 DFS 全排列 next_permutation用法

    如下的10个格子(参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数.注意:你提交的应该是一个 ...

  7. 蓝桥杯 2014本科C++ B组 六角填数 枚举排列

    标题:六角填数 如图[1.png]所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交答案,不要填 ...

  8. ACM_螺旋填数

    螺旋填数 Time Limit: 2000/1000ms (Java/Others) Problem Description: 一天,小明在研究蜗牛的壳时,对其螺旋状的花纹感到十分有趣.于是他回到了家 ...

  9. [Noip2018]填数游戏

    传送门 Description 耳熟能详,就不多说了 Solution 对于一个不会推式子的蒟蒻,如何在考场优雅地通过此题 手玩样例,发现对于 \(n=1\) , \(ans=2^m\) .对于 \( ...

随机推荐

  1. Unity 调用jar闪退 解决方案

    { https://www.cnblogs.com/YZFHKMS-X/p/11864496.html }

  2. 数学二分——cf700A

    二分答案 #include<bits/stdc++.h> using namespace std; #define ll long long int n,l,v1,v2,k; double ...

  3. 使用ionic来build安卓apk时,报CordovaError: Requirements check failed for JDK 1.8 or greater

    本地配置了JDK和jre的本地环境变量之后,在命令行中运行Java.javac等都能正常输出,但是在使用ionic cordova build android 来打包ionic的程序时,会提示 Cor ...

  4. 炼数成金数据分析课程---10、python中如何画图

    炼数成金数据分析课程---10.python中如何画图 一.总结 一句话总结: 主要matplotlib库,pandas中也可以画一些基础图 大纲+实例快速学习法 1.matplotlib的最简单画图 ...

  5. P1435 回文字串

    P1435 回文字串 题目背景 IOI2000第一题 题目描述 回文词是一种对称的字符串.任意给定一个字符串,通过插入若干字符,都可以变成回文词.此题的任务是,求出将给定字符串变成回文词所需要插入的最 ...

  6. html+css 常用布局

    1.中间固定宽度,两侧自适应 1.1 flex布局 <!DOCTYPE html><html lang="en"> <head> <met ...

  7. (3)centos7 目录结构

    根目录下的文件下 根目录:  /   注意:根目录只存放目录,并且/etc./bin./dev./lib./sbin应该和根目录放置在一个分区中 /bin 二进制目录,存放用户级的GUN工具  /bo ...

  8. Django框架(十)—— 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询

    目录 多表操作:增删改,基于对象/双下划线的跨表查询.聚合查询.分组查询.F查询与Q查询 一.创建多表模型 二.一对多增删改表记录 1.一对多添加记录 2.一对多删除记录 3.一对多修改记录 三.一对 ...

  9. Java8 时间调节器

    TemporalAdjuster 是做日期数学计算.例如,要获得“本月第二个星期六”或“下周二”. 让我们来看看他们的操作. 选择使用任何编辑器创建以下java程序在 C:/> JAVA Jav ...

  10. 随笔-ansible-6

    Ansible中的变量引用有时候需要双引号,有时候不需要双引号,这是因为Ansible是多人协作的作品,所以没有统一. 一切以官网说明为主,同时自己也要实践. 这是一个example.yml文件,我们 ...