题意:自己搜吧。。。

思路:

记二元组\((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. Java中的时间日期Date和Calendar

    日期时间类 Date: Date类的构造方法: 可以发现Date类的toString方法被重写了. Date类的方法: SimpleDateFormat 它提供了解决Date输出问题的解决方案--格式 ...

  2. Thread.Join理解

    Thread.Join:Blocks the calling thread until a thread terminates MainThread里面起了一个SubThread,从SubThread ...

  3. vue-cli 3.0版本,配置代理Proxy,不同环境不同target(生产环境,uat环境和本地环境的配置)

    1.在项目的的根目录下新建vue.config.js 2.新建一个config包,里面存放不同的环境文件,里面包含:pro.env.js(生产环境配置),uat.env.js(测试环境配置),dev. ...

  4. leetcood学习笔记-35-二分法

    题目: 第一次提交; class Solution: def searchInsert(self, nums: List[int], target: int) -> int: for i in ...

  5. [7.18NOIP模拟测试5]砍树 题解(数论分块)

    题面(加密) 又考没学的姿势……不带这么玩的…… 考场上打了个模拟 骗到30分滚粗了 稍加思考(滑稽)可将题面转化为: 求一个最大的$d$,使得 $\sum \limits _{i=1}^n {(\l ...

  6. ES数据导入导出

    ES数据导入导出   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ...

  7. selenium工作的大概原理

    selenium的原理是什么? selenium的原理涉及到3个部分,分别是 浏览器 driver: 一般我们都会下载driver client: 也就是我们写的代码 client其实并不知道浏览器是 ...

  8. XML XPATH simpleXML

    XPath 通过DOM结构定位节点,在数据量很大的情况下速度下降的很厉害.解决方法是XPath.Xpath的作用:用于快速定位节点 position()是节点的位置,节点的位置是从1开始 simple ...

  9. HDU 6697 Closest Pair of Segments (计算几何 暴力)

    2019 杭电多校 10 1007 题目链接:HDU 6697 比赛链接:2019 Multi-University Training Contest 10 Problem Description T ...

  10. Vim多窗口编辑

    在Linux中使用vim编辑多个窗口     方式:            1. vim -o file1 file2             打开的两个文件上下窗口分布 比如当前目录有makefil ...