题解

非常容易想到的线段树, 还可以用并查集来。 还有一位大神用了$O(n)$ 就过了Orz

要判断是否能染色出输入给出的序列,必须满足两个条件:

1、 序列中必须存在一个$q$

2、 两个相同的数$x$的中间不存在比 $ x$ 小的数

首先判断输入的数列中是否存在$q$, 若不存在$q$ 且没有 $a_i = 0$, 表示序列中一定没有$q$, 直接输出NO

  若存在某个$a_i = 0$ , 将任意一个染成$q$即可

然后我们再查询两个相同的数$x$ 中是否存在比$x$ 小的数,用线段树来维护区间最小即可实现

  接着把两个$x$中间的序列染色, 用MinOK来记录,表示区间内$a_i = 0$,可以染色的最小值。 (线段树区间修改

  最后把$a_i = 0$ 进行染色(利用线段树点查询

CF现场就想到的算法,然而没有特判存在$q$,pushdown还少打了唔, CF百分百掉分,我要变成pupil了,太惨啦QAQ

代码

 #include<cstring>
#include<algorithm>
#include<cstdio>
#define lson nd<<1
#define rson nd<<1|1
#define rd read()
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define per(i,a,b) for(int i = (a); i >= (b); --i)
using namespace std; const int N = 3e5, inf = ~0U >> ; int MIN[N << ], a[N], L[N], R[N], lazy[N << ], q, n, pos;
int Mok[N << ]; int read() {
int X = , p = ; char c = getchar();
for(; c > '' || c < ''; c = getchar()) if( c == '-') p = -;
for(; c >= '' && c <= ''; c = getchar()) X = X * + c - '';
return X * p;
} void update(int nd) {
MIN[nd] = min(MIN[lson], MIN[rson]);
} void pushdown(int nd) {
if(lazy[nd]) {
Mok[lson] = lazy[nd];
Mok[rson] = lazy[nd];
lazy[lson] = lazy[rson] = lazy[nd];
lazy[nd] = ;
}
} void build(int l, int r, int nd) {
if(l == r) {
MIN[nd] = a[l] == ? inf : a[l];
return;
}
int mid = (l + r) >> ;
build(l, mid, lson);
build(mid + , r, rson);
update(nd);
} int query(int Li, int Ri, int l, int r, int nd) {//查询区间最小
if(Li <= l && r <= Ri) return MIN[nd];
int mid = (l + r) >> , re = inf;
if(Li <= mid) re = min(re, query(Li, Ri, l, mid, lson));
if(mid < Ri) re = min(re, query(Li, Ri, mid + , r, rson));
return re;
} int query_pt(int p, int l, int r, int nd) {//查询可以染上的值
if(l == r) return Mok[nd];
int mid = (l + r) >> ;
pushdown(nd);
if(p <= mid) return query_pt(p, l, mid, lson);
else return query_pt(p, mid + , r, rson);
} void change(int Li, int Ri, int c, int l, int r, int nd) {
if(Li <= l && r <= Ri) {
lazy[nd] = c;
Mok[nd] = c;
return;
}
int mid = (l + r) >> ;
pushdown(nd);
if(Li <= mid) change(Li, Ri, c, l, mid, lson);
if(mid < Ri) change(Li, Ri, c, mid + , r, rson);
update(nd);
} int main()
{
n = rd; q = rd;
for(int i = ; i <= n; ++i) {
a[i] = rd;
if(!a[i]) pos = i;
if(!L[a[i]]) L[a[i]] = i;
R[a[i]] = i;
}
if(!L[q] && !pos) return printf("NO\n"), ;//无a[i]=0也无q
build(, n, );
for(int i = ; i <= q; ++i) {//必须按颜色从小到大覆盖
if(!L[i]) continue;
int minv = query(L[i], R[i], , n, );
if(minv < i) return printf("NO\n"), ;
change(L[i], R[i], i, , n, );
}
for(int i = ; i <= n; ++i) if(!a[i]) {
a[i] = query_pt(i, , n, );
if(i == pos && !L[q]) a[i] = q; // 必须存在q
else if(!a[i]) a[i] = ;
}
printf("YES\n");
for(int i = ; i <= n; ++i) printf("%d ", a[i]);
putchar('\n');
}

CF 1023D Array Restoration - 线段树的更多相关文章

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

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

  2. CF1114F Please, another Queries on Array?(线段树,数论,欧拉函数,状态压缩)

    这题我在考场上也是想出了正解的……但是没调出来. 题目链接:CF原网 题目大意:给一个长度为 $n$ 的序列 $a$,$q$ 个操作:区间乘 $x$,求区间乘积的欧拉函数模 $10^9+7$ 的值. ...

  3. Codedforces 1076G Array Game 线段树

    题意 现在cf上看题意真nm麻烦,有道网页翻译和谷歌翻译鬼畜的一匹 两个人在玩一个游戏. 有一个有\(n\)个数序列\(B\),一开始有一个棋子在\(B\)的第一个位置. 双方轮流操作,第一次操作前将 ...

  4. codeforces 482B. Interesting Array【线段树区间更新】

    题目:codeforces 482B. Interesting Array 题意:给你一个值n和m中操作,每种操作就是三个数 l ,r,val. 就是区间l---r上的与的值为val,最后问你原来的数 ...

  5. CF 787D Legacy(线段树思想构图+最短路)

    D. Legacy time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...

  6. Light OJ-1082 - Array Queries,线段树区间查询最大值,哈哈,水过~~

                                                                                                        ...

  7. Codeforces E. Interesting Array(线段树)

    题目描述: D. Interesting Arraytime limit per test1 secondmemory limit per test256 megabytesinputstandard ...

  8. B. Interesting Array(线段树)

    B. Interesting Array time limit per test 1 second memory limit per test 256 megabytes input standard ...

  9. CF 19D Points 【线段树+平衡树】

    在平面上进行三种操作: 1.add x y:在平面上添加一个点(x,y) 2.remove x y:将平面上的点(x,y)删除 3.find x y:在平面上寻找一个点,使这个点的横坐标大于x,纵坐标 ...

随机推荐

  1. GSO/TSO/GRO等对VirtIO虚机的网络性能影响分析(by quqi99)

    作者:张华  发表于:2016-04-05版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) IP层 ...

  2. Noip2011Mayan游戏

    题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...

  3. CSS3基础

    内容: 1.圆角 border-radius 2.阴影 text-shadow.box-shadow 3.渐变 linear.radial 4.rgba rgb+alpha opacity 5.tra ...

  4. tornado-简单的服务器

    安装tornado pip install tornado 安装sqlalchemy 1.大概代码的解释 import tornado.ioloop #开启循环,等待访问 import tornado ...

  5. java 调用短信 api 接口发送短信

    参考:   https://blog.csdn.net/u014793522/article/details/59062014 参考 :https://blog.csdn.net/Lu_shilusi ...

  6. git 提交文件到gitee

    1.新建文件夹   打开gitbash  初始化仓库 git.init 2.把要提交的文件copy到文件夹 3.git add. 4.git remote add master(分支)  远程仓库 5 ...

  7. XE 创建 Active Form

    XE6: http://docwiki.embarcadero.com/RADStudio/XE6/en/Generating_an_Active_Form_Based_on_a_VCL_Form h ...

  8. 怎样在Windows本地搭建redis服务器

    1.下载最新redis       https://github.com/MicrosoftArchive/redis/releases 2.解压如果是mis 版本直接下一步下一步即可 3.接下来我们 ...

  9. hashlib 加密模块使用说明

    import hashlib  #hashilib 模块 m = hashlib.md5() m.update('hello 天王盖地虎'.encode(encoding = 'utf-8)) m.h ...

  10. Java synchronized(this)锁住的是什么

    synchronized锁住的是括号里面的对象,而不是代码. 对于非static的synchronized方法,锁的就是对象本身,也就是this.