思路:

使用set即可,细节很多,容易出错。

实现:

 #include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = ;
int a[MAXN], l[MAXN], r[MAXN];
int main()
{
int n, q;
while (cin >> n >> q)
{
for (int i = ; i <= q; i++) { l[i] = INF; r[i] = -INF; }
int c0 = , cq = ;
for (int i = ; i <= n; i++)
{
cin >> a[i];
c0 += a[i] == ;
cq += a[i] == q;
if (a[i] == ) continue;
l[a[i]] = min(l[a[i]], i);
r[a[i]] = max(r[a[i]], i);
}
if (!c0 && !cq) { cout << "NO" << endl; continue; }
set<int> st;
bool flg = true;
for (int i = ; i <= n; i++)
{
if (i == l[a[i]]) st.insert(a[i]);
if (a[i] && !st.empty() && *st.rbegin() != a[i]) { flg = false; break; }
int tmp = -;
if (a[i] == )
{
if (cq == ) { tmp = q; cq++; }
else if (!st.empty()) tmp = *st.rbegin();
else tmp = ;
}
if (i == r[a[i]]) st.erase(st.find(a[i]));
if (tmp != -) a[i] = tmp;
}
if (!cq || !flg) { cout << "NO" << endl; continue; }
cout << "YES" << endl;
for (int i = ; i <= n; i++) cout << a[i] << " ";
cout << endl;
}
return ;
}

CF1023D Array Restoration的更多相关文章

  1. Codeforces Round #504 D. Array Restoration

    Codeforces Round #504 D. Array Restoration 题目描述:有一个长度为\(n\)的序列\(a\),有\(q\)次操作,第\(i\)次选择一个区间,将区间里的数全部 ...

  2. codeforces 1023 D. Array Restoration 并查集

    D. Array Restoration time limit per test 1 second memory limit per test 256 megabytes input standard ...

  3. Codeforces Round #504:D. Array Restoration

    D. Array Restoration 题目链接:https://codeforces.com/contest/1023/problem/D 题意: 给出一个序列,现在要求对一个全为0的序列执行q次 ...

  4. 【CF1023D】Array Restoration(构造,线段树)

    题意:有一个长为n的序列,对其进行q次操作,第i次操作可以把连续的一段覆盖为i 现在给出操作后的序列,第i个数字为a[i],其中有一些为0的位置可以为任意值,要求构造任意一组合法的操作后的序列 无解输 ...

  5. CF 1023D Array Restoration - 线段树

    题解 非常容易想到的线段树, 还可以用并查集来. 还有一位大神用了$O(n)$ 就过了Orz 要判断是否能染色出输入给出的序列,必须满足两个条件: 1. 序列中必须存在一个$q$ 2. 两个相同的数$ ...

  6. Codeforces #504(div1+div2) 1023D Array Restoration(线段树)

    题目大意:给你一个数组,数组是经过q次区间覆盖后的结果,第i次覆盖是把区间内的值赋值为i,其中有若干个地方数值未知(就是0),让你判断这个数组是否可以经过覆盖后得到的,如果可以,输出任意一种可行数组. ...

  7. Codeforces Round #667 (Div. 3) C. Yet Another Array Restoration (数学)

    题意:给你两个数字\(x\)和\(y\),让你构造一个长度为\(n\)的序列,要求包含\(x\)和\(y\),并且排序后相邻两项的差值相等. 题解:有排序后相邻两项的差值相等可知,构造的序列排序后一定 ...

  8. Codeforces 1023 D.Array Restoration-RMQ(ST)区间查询最值 (Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Fi)

    D. Array Restoration 这题想一下就会发现是只要两个相同的数之间没有比它小的就可以,就是保存一下数第一次出现和最后一次出现的位置,然后查询一下这个区间就可以,如果有0的话就进行填充. ...

  9. Codeforces1409 题解(A-F)

    A. Yet Another Two Integers Problem 最优的操作中,\(k = \min(10, abs(a - b))\),记\(d=abs(a-b)\),最终的答案为\(ans ...

随机推荐

  1. POJ1741:Tree

    浅谈树分治:https://www.cnblogs.com/AKMer/p/10014803.html 题目传送门:http://poj.org/problem?id=1741 这是一道树分治的模板题 ...

  2. Maven下org.junit.Test无法使用

    原文地址: https://blog.csdn.net/allenChenZhiMing/article/details/81412983 我在看Spring in action(第四版)的时候,看到 ...

  3. 20个Flutter实例视频教程-第02节: 底部导航栏制作-2

    视频地址: https://www.bilibili.com/video/av39709290?p=2 博客地址: https://jspang.com/post/flutterDemo.html#t ...

  4. C#基础之--线程、任务和同步:一、异步委托

    创建线程的一种简单方式是定义一个委托,并异步调用它.委托是方法的类型安全的引用. Delegate还支持异步地调用方法.在后台Delegate类会创建一个执行任务的线程. 为了说明委托的异步特性,从一 ...

  5. BZOJ2038【莫队算法】

    THE FIRST 莫队算法. /************************************************************** Problem: 2038 User: ...

  6. lightoj1010【LCS】

    题意: 求最长公共子序列,并且这个子序列是字典序最小. 思路: LCS附一个值,dp[i][j].first代表以i,j的LCS的长度,dp[i][j].second代表LCS结尾元素,然后利用路径输 ...

  7. TRANSFORM_TEX

    Shader "Custom/Exam1" { Properties { _MainTex ("Texture", 2D) = "white" ...

  8. 让你头晕的VR头显,背后发生了什么?

    随着虚拟现实渐渐兴起,国内现在做虚拟现实的厂商也增多了起来.但是我经常听到有体验者向我表示:他戴上国外大厂诸如Oculus.Sony和Valve的VR头显的时候,体验十分出色,但是戴上国产的VR头显, ...

  9. ugui学习资料

    官网文档 http://docs.unity3d.com/Manual/index.html 官网视频教程http://unity3d.com/learn/tutorials/modules/begi ...

  10. Peptidomics analysis of milk protein-derived peptides
released over time in the preterm infant stomach
 (文献分享一组-陈凌云)

    题目:Peptidomics analysis of milk protein-derived peptides
released over time in the preterm infant st ...