题目描述

对于一个长度为$n$,且下标从$1$开始编号的序列$a$,我们定义它是「合法的」,当且仅当它满足以下条件:
·$a_1=1$
·对于$i\in [1,n),a_i\leqslant a_{i+1}\leqslant a_i+1$且$a_{i+1}$为正整数
·对于任意在$a$中出现过的数$v$,记它的出现次数为$s$,则$2\leqslant s\leqslant 5$
给定一个长度为$n$的序列$a$,其中有一些位置为$0$,你需要在这些位置上任意填数,使得$a$成为一个合法的序列,并且最大化$a_n$的值。


输入格式

第一行一个数$n$,表示序列的长度。
第二行$n$个整数,第$i$个整数表示$a_i$,如果$a_i=0$,则表示这个位置没有填数。


输出格式

如果不存在合法的填数方案,则输出$−1$;否则第一行输出一个整数,表示最大的$a_n$;第二行$n$个正整数,第$i$个数表示完成填数后的序列的第$i$个元素。 如果有多组合法的解,输出任意一组


样例

样例输入1:

7
0 1 0 0 0 3 0

样例输出1:

3
1 1 2 2 3 3 3

样例输入2:

4
0 0 0 3

样例输出2:

-1


数据范围与提示

对于$30\%$的数据,$n\leqslant 1,000$;
对于另外$30\%$的数据,数据保证随机生成;
对于$100\%$的数据,$2\leqslant n\leqslant 2\times {10}^5,0\leqslant a_i\leqslant {10}^5$。


题解

对于每个位置维护两个二元组,分别是$up(x,l)$表示当前位置能填的最大值$x$和连续个数$l$;$down(x,l)$表示当前为只能填数的最小值$x$和连续个数$l$。

求$up$就是尽可能的往上升,求$down$反之。

第一问就是最后一位的最大值,至于第二问倒着扫一边即可求出。

时间复杂度:$\Theta(n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n;
int a[200001];
pair<int,int> up[200001],down[200001];
int sum[100001],ans[200001];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
if(a[1]>1){puts("-1");return 0;}
a[1]=1;
up[1]=down[1]=make_pair(1,1);
for(int i=2;i<=n;i++)
{
up[i]=make_pair(up[i-1].first,up[i-1].second+1);
down[i]=make_pair(down[i-1].first,down[i-1].second+1);
if(up[i].second>2)
{
up[i].first++;
up[i].second=1;
}
if(down[i].second>5)
{
down[i].first++;
down[i].second=1;
}
if(a[i])
{
if(up[i].first==a[i])up[i].second=min(up[i].second,2);
if(up[i].first>a[i])up[i]=make_pair(a[i],2);
if(down[i].first<a[i])down[i]=make_pair(a[i],1);
if(up[i].first<a[i]||down[i].first>a[i]){puts("-1");return 0;}
}
}
if(up[n].second==1)up[n]=make_pair(up[n-1].first,up[n-1].second+1);
printf("%d\n",up[n].first);
ans[n]=up[n].first;
sum[a[n]]=1;
for(int i=n-1;i;i--)
{
if(a[i])ans[i]=a[i];
else
{
int flag=min(ans[i+1],up[i].first);
if(sum[flag]==5)flag--;
ans[i]=flag;
}
sum[ans[i]]++;
}
for(int i=1;i<=n;i++)printf("%d ",ans[i]);
return 0;
}

rp++

[CSP-S模拟测试]:简单的填数(贪心+模拟)的更多相关文章

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

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

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

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

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

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

  4. [CSP-S模拟测试]:飞(fly)(数状数组+简单几何)

    题目描述 $liu\_runda$决定提高一下知识水平,于是他去请教郭神.郭神随手就给了$liu\_runda$一道神题,$liu\_runda$并不会做,于是把这个题扔到联考里给高二的做.郭神有$n ...

  5. [CSP-S模拟测试]:简单的括号序列(组合数)

    题目传送门(内部题82) 输入格式 一行一个字符串$ss$,保证$ss$中只包含$'('$和$')'$. 输出格式 一行一个整数,表示满足要求的子序列数对$10^9+7$的结果. 样例 样例输入1: ...

  6. [CSP-S模拟测试]:小L的数(数位DP+模拟)

    题目传送门(内部题132) 输入格式 第一行一个整数$t$. 接下来$t$行每行一个整数$n$. 输出格式 $t$行,每行一个整数表示答案. 样例 样例输入: 41818231232691052109 ...

  7. [CSP-S模拟测试]:简单计算(数学)

    题目传送门(内部题104) 输入格式 第一行一个正整数$T$,表示该测试点内的数据组数,你需要对该测试点内的$T$组数据都分别给出正确的答案才能获得该测试点的分数. 接下来$T$组数据,每组数据一行两 ...

  8. [CSP-S模拟测试]:简单的操作(二分图+图的直径)

    题目描述 从前有个包含$n$个点,$m$条边,无自环和重边的无向图. 对于两个没有直接连边的点$u,v$,你可以将它们合并.具体来说,你可以删除$u,v$及所有以它们作为端点的边,然后加入一个新点$x ...

  9. [CSP-S模拟测试]:简单的期望(DP)

    题目描述 从前有个变量$x$,它的初始值已给出. 你会依次执行$n$次操作,每次操作有$p\%$的概率令$x=x\times 2$,$(100−p)\%$的概率令$x=x+1$. 假设最后得到的值为$ ...

随机推荐

  1. 【Java】Java引用maven私服jar包及jar包提交私服问题

    pom.xml中加入以下配置即可 1.引用私服jar包 <!-- 加载的是 第三方项目使用的jar包 --> <repositories> <repository> ...

  2. 左手Mongodb右手Redis

    第二章,了解Mongodb保存数据 Mongodb对于每次插入的数据没有要求,字段可以随便变动,字段类型可以随意变动. Mongodb可以并发插入上万条文档,这是传统关系型数据库不能望其项背的. 1. ...

  3. spark sql correlated scalar subqueries must be aggregated 错误解决

    最近在客户中使用spark sql 做一些表报处理,但是在做数据关联时,老是遇到 “correlated scalar subqueries must be aggregated” 错误 举一个例子, ...

  4. PHP常用

    php.ini文件配置 时间配置PRC中国 date.timezone = PRC 文件上传file_uploads = On //支持http上传upload_tmp_dir = //临时文件保存路 ...

  5. 练习1-20 编写程序detab,将输入中的制表符替换成适当数目的空格.

    1.问题描述 编写程序detab,将输入中的制表符替换成适当数目的空格,使空格充满到下一个制表符终止位的地方. 假设制表符终止位的位置是固定的, 换句话说每隔n列就会出现一个制表符终止位. 2.描述 ...

  6. 实用|从0到1 搭建Web性能监控系统

    工具介绍 1. Statsd 是一个使用Node开发网络守护进程,它的特点是通过UDP(性能好,及时挂了也不影响主服务)或者TCP来监听各种数据信息,然后发送聚合数据到后端服务进行处理. 常见支持的「 ...

  7. Html5 学习笔记 【PC固定布局】 实战4 footer 区域

    最终效果图: Html代码: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta chars ...

  8. POJ 1860 Currency Exchange (Bellman-Ford)

    题目链接:POJ 1860 Description Several currency exchange points are working in our city. Let us suppose t ...

  9. VB - 变量

    Cbool函数将变量转换成布尔值: Cbyte函数将变量转换为0到255之间的整数. Ccur函数.Cdbl函数和Csng函数将变量转换为浮点数值,前者只精确到小数点后四位,后两者要更加精确,数值的范 ...

  10. u盘在电脑读不出来,但别的可以读

    其实一般这种问题都是驱动程序问题导致的,解决方法很简单,不管是win7还是win10都适用:    插入u盘然后在设备管理里删掉设备重新插拔试试.    详细步骤是:    插上U盘 打开设备管理器 ...