D. Array Restoration(st表 O(1)查询区间最值)

news2024/12/24 21:22:13

Problem - D - Codeforces

给定一个由n个整数组成的初始数组a,位置从1到n编号。

对该数组执行q次查询,每次查询选择一个区间[li, ri](1≤li≤ri≤n),并将该区间内所有元素的值都改为i。查询的顺序不能更改,并且必须应用所有q次查询。已知每个位置从1到n都至少被一个区间覆盖。

我们可能会提供一个问题,即检查某个给定的数组(由n个取值范围为1到q的整数组成)是否可以通过上述查询获得。但是,我们决定这太容易了。

因此,我们对其进行了增强。在此数组中选择一些位置(可能为空),并将这些位置上的元素值设置为0。

你的任务是检查是否可以通过上述查询获得该数组。如果可以获取,则还需要恢复该数组。

如果有多个可能的数组,则打印其中任何一个。 输入格式 第一行包含两个整数n和q(1≤n,q≤2⋅105)——数组元素数量和对其执行的查询数量。

第二行包含n个整数a1,a2,…,an(0≤ai≤q)——结果数组。如果某个位置j处的元素等于0,则该位置的元素值可以是1到q之间的任意整数。 输出格式 如果可以通过q次查询获得数组a,则输出“YES”。对于每个查询,都会单独选择区间[li, ri]。必须覆盖1到n中的每个位置。

否则输出“NO”。

如果可以获得某个数组,则在第二行上打印n个整数——第i个数字应该等于结果数组的第i个元素,并且应具有1到q的值。该数组应恰好通过执行q次查询获得。

如果有多个可能的数组,则打印其中任何一个。

Examples

Input

Copy

4 3
1 0 2 3

Output

Copy

YES
1 2 2 3

Input

Copy

3 10
10 10 10

Output

Copy

YES
10 10 10 

Input

Copy

5 6
6 5 6 2 2

Output

Copy

NO

Input

Copy

3 5
0 0 0

Output

Copy

YES
5 4 2

题解:
通过我们观察样例我们发现,如果不包含0的数组满足条件,那么让0等于左右相邻位置不等于0的,这个数组依旧可以构造出来

不满足的条件1是在两个相同值之间,有一个比他们小的数,按照从小到大的涂改顺序这样肯定不行

其二,数组中没有出现q,q是一定要出现的,因为他是最后一次修改,不会被其他值覆盖

那么我们只要在符合条件的,数组中找到一个0,修改为q即可

注意最后让所有0等于左右相邻,不为0的

st查询复杂度只有O(1),比线段树快很多,虽然不能修改,但出现多次查询的问题是,十分有用

 

#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
 #define int long long
typedef pair<int,int> PII;
typedef unsigned long long ULL;
const int N = 3e5 + 10;
int mod = 1e9 + 7;
int n,q;
int a[N];
int f[N][30];
vector<int> p[N]; 
void st()
{
	for(int j = 1;(1 << j) <= n;j++)
	{
		for(int i = 1;i + (1 << j) - 1 <= n;i++)
		{
			f[i][j] = min(f[i][j - 1],f[i + (1 << (j - 1))][j - 1]);
		}
	}
}
int query(int l,int r)
{
	int k = log2(r - l + 1);
	return min(f[l][k],f[r - (1 << k) + 1][k]);
}
void solve()
{
	cin >> n >> q; 
	memset(f,0x3f,sizeof f);
	for(int i = 1;i <= n;i++)
	{
		cin >> a[i];
		if(a[i])
		f[i][0] = a[i];
		p[a[i]].push_back(i);
	} 
	st();
	for(int i = 1;i <= q;i++)
	{
		int now = p[i].size();
		if(now >= 2)
		{
			int l = p[i][0];
			int r = p[i].back();
			int w = query(l,r);
			if(w < i)
			{
				cout <<"NO";
				return ;
			}
		}
	}
	if(!p[q].size())
	{
		int f = 0;
		for(int i = 1;i <= n;i++)
		{
			if(a[i] == 0)
			{
				a[i] = q;
				f = 1;
				break;
			}
		}
		if(!f)
		{
			cout <<"NO";
			return ;
		}
	}
	for(int i = 1;i <= n;i++)
	{
		if(a[i] == 0)
		a[i] = a[i - 1];
	}
	for(int i = n;i >= 1;i--)
	{
		if(a[i] == 0)
		a[i] = a[i + 1];
	}
	cout <<"YES\n";
	for(int i = 1;i <= n;i++)
	cout << a[i] <<" ";
}
signed main()
{
	ios::sync_with_stdio(0 );
	cin.tie(0);cout.tie(0);
	int t = 1;
//	cin >> t;
	while(t--)
	{
		solve(); 
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/535392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业多个文件存储系统并行使用,IT人员如何统一高效管理?

文件存储系统在企业内部应用广泛&#xff0c;各个企业使用习惯各不相同。很多企业在业务开展中&#xff0c;由于内部业务结构复杂、部门间文件存储习惯差异化、需要与外部合作伙伴进行数据文件交换等原因&#xff0c;会出现企业内部多个文件存储系统并行使用的情况。 对于IT技术…

IPB60R950C6-ASEMI代理英飞凌高压MOS管IPB60R950C6

编辑&#xff1a;ll IPB60R950C6-ASEMI代理英飞凌高压MOS管IPB60R950C6 型号&#xff1a;IPB60R950C6 品牌&#xff1a;Infineon(英飞凌) 封装&#xff1a;TO-263 最大漏源电流&#xff1a;12A 漏源击穿电压&#xff1a;600V RDS&#xff08;ON&#xff09;Max&#xff…

关于全志T113开发板接7寸LCD屏幕显示异常问题的解决方案

在入手全志T113之后&#xff0c;第一时间移植好了之前6ull平台的rootfs。但是在测试QT的过程中发现屏幕最右侧有一部分显示不正常&#xff0c;经过初步推测应该是RGB行场同步时序有问题。本以为在设备树里面稍作修改之后就能OK&#xff0c;但是居然前前后后一共花了至少三个星期…

期刊介绍|骨科老牌期刊,无版面费,审稿极速,毕业不二之选!

今天给大家介绍一本中药方面的期刊&#xff1a;JOURNAL OF ORTHOPAEDIC RESEARCH 一、基本信息 1、期刊名称&#xff1a;JOURNAL OF ORTHOPAEDIC RESEARCH&#xff1b; 2、期刊ISSN: 0736-0266&#xff1b; 3、研究方向&#xff1a;医学-整形外科&#xff1b; 4、出版社&#x…

AI怎么把游戏变好玩?米哈游出手了

《原神》发布两年半后&#xff0c;游戏新贵米哈游终于出新&#xff0c;上线了《崩坏:星穹铁道》。新游戏的一大亮点是内置了一个“图生图”的AIGC工具&#xff0c;用户可上传任何图片&#xff0c;生成对应风格的游戏角色“三月七”。 广大玩家脑洞大开&#xff0c;短短一周时间…

专业的图像编辑软件Affinity Photo 2.04版本在win10系统的下载与安装配置教程

目录 前言一、Affinity Photo安装二、使用配置总结 前言 Affinity Photo 是一款专业的图像编辑软件&#xff0c;提供了很多强大的工具和功能。 一些常用工具的介绍&#xff1a; 选择工具 ——矩形选择工具&#xff1a;用于选择矩形区域。 ——椭圆选择工具&#xff1a;用于选…

Android 网络编程基础

Android 网络编程是一个重要的开发技能&#xff0c;可以让我们的应用程序更加丰富、实用。需要开发者根据实际需求选择合适的网络通信方式&#xff0c;并结合安全协议和数据传输加密算法等措施&#xff0c;以保证数据传输的安全性和可靠性。 网络协议 在 Android 网络编程中&a…

虚拟环境中的 CPU 优化技巧

近年来&#xff0c;虚拟化已成为管理计算资源的主流方式&#xff0c;使用户能够在一台机器上运行多个操作系统和应用程序。虚拟化虽然带来了许多好处&#xff0c;例如更好的资源利用和更大的灵活性&#xff0c;但在优化CPU性能方面也带来了挑战。 在本文中&#xff0c;我们将探…

系统分析师:五、系统配置与性能评价

目录 一、性能指标 二、阿姆达尔解决方案 三、性能评价方法 一、性能指标 性能指标总体如下&#xff1a; 主频&#xff1a;也称时钟频率&#xff0c;主频越高&#xff0c;意味着CPU工作速度越快。它的倒数就是时钟周期。 CPI&#xff1a;每条指令执行锁需要的时钟周期数。 …

那些我收藏多年和偷摸使用的工具~~~

作为一个见到好东西&#xff0c;不管有没有用先收藏的我来说&#xff0c;本期活动实在是太有必要写一篇博客了 目录 展示我的收藏癖生活类收藏学习类收藏工具类收藏谷歌插件类收藏 工具推荐效率工具sublime 文件转换工具text转MarkdownMarkdown-Weixin[Cmd Markdown 编辑阅读器…

算法篇——动态规划大集合(js版)

509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 n…

计算机毕业论文选题推荐|软件工程|系列六

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 基于(***语言)的研发部署管理…

正视架构设计的重要作用

要讨论软件架构设计在软件开发中的重要作用&#xff0c;首先让我们来了解一下目前国内软件的开发现状。   总的来说&#xff0c;国内的多数企业仍然是采用“瀑布模型”作为软件开发过程的主要模型。虽然在采用瀑布模型的同时可能会引入原型法以及诸如MSF等其它软件开发方法与…

必须要掌握的音视频编码、解码基础!

一、音视频为什么要编码&#xff1f; 音视频编码技术在音视频领域有着举足轻重的地位&#xff0c;这是由于音视频原始数据量较大&#xff0c;在传输的过程中如果不进行编码的话&#xff0c;则无法进行传输。比方说&#xff0c;一张普通的图片的大小大概是1-2M&#xff0c;假设我…

CH-90Na螯合树脂技术在废水除镍、除总铬、除重上的应用

电镀是利用电化学的方法对金属和非金属表面进行装饰、防护及获得某些新的性质的一种工艺过程。为保证电镀产品的质量&#xff0c;使金属镀层具有平整光滑的良好外观并与基体牢固结合&#xff0c;必须在镀前把镀件表面上的污物&#xff08;油、锈、氧化皮等&#xff09;彻底洗干…

美国Keysight是德科技34461A万用表

安捷伦Keysight是德科技34461A万用表 安捷伦万用表 附加功能&#xff1a; 带有内置条形图、直方图、趋势、数学和统计数据的彩色图形显示 I/O&#xff1a;USB、LAN/LXI、GPIB&#xff08;可选&#xff09; 已启用 BenchVue。从您的 PC 控制您的 DMM&#xff0c;以轻松查看和捕…

【沐风老师】3dMax粒子拖尾光效插件Ky_Trail使用教程

Ky_Trail粒子拖尾光效插件使用教程 【Ky_Trail 用户界面】 Ky_Trail粒子拖尾光效插件,可以模拟各种粒子拖尾效果动画。 【适用版本】 3dMax4 - 2021 【安装方法】 将插件文件“Ky_Trail.dlv”复制到3dMax插件目录中(3ds Max\plugins”)。 【使用方法】 1.插件安装完成后启…

github某0day漏洞投毒与钓鱼样本分析

前言 近日&#xff0c;烽火台实验室监测到多起针对安全人员的钓鱼攻击。其中一例利用MS Office Word 0DAY进行钓鱼&#xff0c;在github.com和Telegram群组中公开0DAY利用程序&#xff0c;其中并没有包含真正的利用程序&#xff0c;但是却捆绑了木马。运行后下载和执行木马程序…

git rebase问题:First, rewinding head to replay your work on top of it

分支上使用 git rebase 主干名 同步代码时提示&#xff1a; First, rewinding head to replay your work on top of it... 具体信息如截图&#xff1a; 用下面的命令可以解决&#xff1a; git fetch origin; git reset --hard origin/<branch>

UM2002 一款低功耗SUB-1G 无线接收机芯片

UM2002 是一款工作于 200MHz~960MHz 范围内的低功耗、高性能、单片集成的(G)FSK/OOK 无线接收机芯片。内部集成完整的射频接收机、频率综合器、解调器&#xff0c;只需配备简单、低成本的外 围器件就可以获得良好的接收性能。 芯片支持灵活可设的数据包格式&#xff0c;支持数据…