[补题记录] Complete the Permutation(贪心、set)

news2025/1/17 23:03:55

URL:https://codeforces.com/group/OcmZ7weh45/contest/487583/problem/J

目录

Problem/题意

Thought/思路

Code/代码


Problem/题意

给出一个长度为 N 的序列,其中的元素都是奇数。

现在要求在两个奇数之间插入一个偶数,使得这三个数递增或递减。

一共需要插入 N - 1 个偶数,并且要求这 N - 1 个偶数都不相同。

Thought/思路

显然这道题的关键就在于,两个奇数之间会有 >= 1 个偶数存在。

我们将两个奇数视作一个区间(一共 N - 1 个区间,小的奇数作为左端点),那么我们在选择了某个偶数 X 后,很可能就会占用了其他区间仅有的一个偶数 X,使得条件不满足。


(贪心)我们可以尝试先选择一个区间中最小的偶数,然后在其之后的区间也同样选择区间中还没有被选过的偶数中最小的哪个。


问题就转换为,怎么保证每个区间选中的最小的偶数不会重复,这就要看我们是如何对这 N - 1 个区间排序的。

(1)如果我们按照左端点优先递增来排序,就会出现左端点很小,右端点很大的情况,这意味着:明明这个区间可以选到一个很大的偶数,大到不会影响其他所有区间,而现在却因为先选择了可以选择的最小偶数,导致占用了排在它之后的区间唯一可以选择的偶数。

举个例子:

[1, 3] => 2

[1, 5] => 4

[3, 100000] => 6

[5 7] => 选不了,错误

(2)因此我们再考虑按照右端点优先递增来排序,显然由于有着右端点的限制,假设右端点严格递增,那么每个区间之间都一定能选到互异的偶数:比如 [1, 3]、[1, 5]、[1, 7] 选择 2、4、6。

而就算前后两个区间右端点相同,由于我们在前面的区间里已经选完了可以选择的最小的偶数,因此后面这个区间肯定就是永远无法选到互异的偶数的,比如:[1, 3]、[1, 7]、[3, 7]、[5, 7]。

综上,我们选择按照右端点优先递增来排序。


核心思路就是上面这些,还有一个小问题:

查找最小偶数的时候需要使用二分,当我们选择 set 保存所有的偶数时,二分时必须要使用 set 自带的 upper_bound,而不能使用 algorithm 的 upper_bound。前者二分复杂度 O(logn),后者二分复杂度 O(n),很容易超时

Code/代码

#pragma GCC optimize(2)

#include "bits/stdc++.h"

struct node {
	int x, y, id;
	bool operator < (const node &t) const {
		if (y == t.y) return x < t.x;
		else return y < t.y;
	}
}p[200007];

int a[200007];

void solve() {
	int n; std::cin >> n;

	for (int i = 1; i <= n; ++ i) {
		std::cin >> a[i];
		if (i == 1) continue;
		int l = std::min(a[i], a[i - 1]), r = std::max(a[i], a[i - 1]);
		p[i - 1] = {l, r, i - 1};
	}

	std::sort(p + 1, p + n);

	std::set <int> st;
	for (int i = 2; i <= 2 * n - 2; i += 2) st.insert(i);

	bool flag = true;
	std::vector <int> ans(n);
	for (int i = 1; i <= n - 1; ++ i) {
		int l = p[i].x, r = p[i].y, id = p[i].id;
		//std::cout << "l=" << l << "  r=" << r << " ";
		auto even = st.upper_bound(l);
		if (*even < r) {
			//std::cout << "even=" << *even;
			ans[id] = *even;
			st.erase(even);
		} else {
			flag = false;
		}
		//std::cout << "\n";
	}
	

	if (flag) {
		for (int i = 1; i <= n - 1; ++ i) std::cout << ans[i] << " ";
	} else {
		std::cout << -1;
	}
	std::cout << "\n";
}

signed main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(0); std::cout.tie(0);
	int t; std::cin >> t;
	while (t --) solve();
	return 0;
}

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

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

相关文章

python基础-numpy

numpy中shape (1,X) 和 &#xff08;X&#xff0c;&#xff09;的区别 参考 首先放结论&#xff1a;shape(x,)是一维数组&#xff0c;ndim1,[1,2,3,…x] ;shape(1,x)是二维&#xff1f;数组&#xff0c;ndim2,[[1,2,3,…n]] 由于array.shape 表示数组的维度&#xff0c;返回一…

优秀智慧园区案例 - 上海世博文化公园智慧园区,先进智慧园区建设方案经验

一、项目背景 世博文化公园是上海的绿色新地标&#xff0c;是生态自然永续、文化融合创新、市民欢聚共享的大公园。作为世博地区的城市更新项目&#xff0c;世博文化公园的建设关乎上海城市风貌、上海文化展示、城市生态环境、市民游客体验、上海服务品牌等&#xff0c;被赋予…

【Java】基于SaaS模式的Java基层医院卫生健康云HIS系统源码

一、模板管理 模板分为两种&#xff1a;病历模板和报表模板。模板管理是运营管理的核心组成部分&#xff0c;是基层卫生健康云中各医疗机构定制电子病历和报表的地方&#xff0c;各医疗机构可根据自身特点特色定制电子病历和报表&#xff0c;制作的电子病历及报表可直接在业务…

万字解析设计模式之组合模式、亨元模式

一、组合模式 1.1概述 组合模式是一种结构型设计模式&#xff0c;它允许将对象组合成树形结构&#xff0c;以表示“部分-整体”的层次结构。组合模式使得客户端可以一致地对待单个对象和对象组合&#xff0c;从而将复杂的层次结构展现为一个统一的树形结构。 在组合模式中&…

2023年危险化学品经营单位主要负责人证模拟考试题库及危险化学品经营单位主要负责人理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年危险化学品经营单位主要负责人证模拟考试题库及危险化学品经营单位主要负责人理论考试试题是由安全生产模拟考试一点通提供&#xff0c;危险化学品经营单位主要负责人证模拟考试题库是根据危险化学品经营单位主…

Unity 三维场景的搭建 软件构造实验报告

实验2&#xff1a;仿真系统功能实现 1.实验目的 &#xff08;1&#xff09;熟悉在Unity中设置仿真场景&#xff1b; &#xff08;2&#xff09;熟悉在Unity中C#语言的使用&#xff1b; &#xff08;3&#xff09;熟悉仿真功能的实现。 2.实验内容 新建一个仿真场景&#x…

【计算机网络学习之路】TCP socket编程

文章目录 前言一. 服务器1. 初始化服务器2. 启动服务器 二. 客户端三. 多进程服务器结束语 前言 本系列文章是计算机网络学习的笔记&#xff0c;欢迎大佬们阅读&#xff0c;纠错&#xff0c;分享相关知识。希望可以与你共同进步。 本篇博客基于UDP socket基础&#xff0c;介绍…

windows系统玩游戏找不到d3dx9_35.dll缺失的解决方法

分享一个我们在打开游戏或许软件过程中遇到的问题——“由于找不到d3dx9_35.dll,无法继续执行代码”的五个修复方案。这个问题可能会影响到我们的工作和娱乐效率&#xff0c;甚至可能导致工作的延期。因此&#xff0c;我希望通过今天的文章&#xff0c;能够帮助大家更好地解决这…

宽压12-90V转5V3A降压IC,AH8691芯片

## 宽压12-90V转5V3A降压IC&#xff0c;多重保护功能全面升级 1. **宽压输入范围**&#xff1a;8V-100V&#xff0c;支持输出电压低至3.3V 2. **高效转换**&#xff1a;5A典型峰值开关电流&#xff0c;高达95%的转换效率 3. **多重保护**&#xff1a;包括过流、过热、输出短路…

Git本地库操作

对本地库的操作很少&#xff0c;我们学习1~6节即可&#xff0c;其他了解下。我们可以在idea中完成对本地库还有远程库的操作&#xff0c;可视化界面用起来更加舒适而且也不会混淆。 1. Git概述 Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小…

ASM字节码操作类库(打开java语言世界通往字节码世界的大门) | 京东云技术团队

前言&#xff1a;授人以鱼不如授人以渔&#xff0c;应用asm的文章有很多&#xff0c;简单demo的也很多&#xff0c;那么ASM都具备哪些能力呢&#xff1f;如何去学习编写ASM代码呢&#xff1f;什么样的情景需要用到ASM呢&#xff1f;让我们带着这些问题阅读这篇文章吧。 这里由…

笔记本只使用Linux是什么体验?

笔记本只使用Linux是什么体验&#xff1f; 之后安了Windows双系统之后也不怎么想再进Windows了。 开发环境就不用说了&#xff0c;Linux下配各种开发环境都方便的多&#xff0c;当然你要用 vs 那还是乖乖回 Windows 吧。 最近很多小伙伴找我&#xff0c;说想要一些Linux的资…

Sleuth

Sleuth 一 引言 随着服务的越来越多&#xff0c;对调⽤链的分析会越来越复杂。它们之间的调⽤关系也许如下图&#xff1a; 问题&#xff1a; 1&#xff1a;微服务之间的调⽤错综复杂&#xff0c;⽤户发送的请求经历那些服务&#xff0c;调⽤链不清楚&#xff0c;没有⼀ 个⾃…

CSDN最新最全pytest系列——pytest-base-url插件之配置可选的项目系统UR

前言 ①当我们的自动化代码完成之后&#xff0c;通常期望可以在不同的环境进行测试&#xff0c;此时可以将项目系统的URL单独拿出来&#xff0c;并且可以通过pytest.ini配置文件和支持pytest命令行方式执行。 ② pytest-base-url 是一个简单的pytest插件&#xff0c;它通过命…

哈夫曼树你需要了解一下

哈夫曼树介绍哈夫曼数特点哈夫曼应用场景哈夫曼构建过程哈夫曼树示例拓展 哈夫曼树介绍 哈夫曼树&#xff08;Huffman Tree&#xff09;是一种特殊的二叉树&#xff0c;也被称为最优二叉树。在计算机科学中&#xff0c;它是由权值作为叶子节点构造出来的一种二叉树。哈夫曼树的…

计算机组成原理(万字爆肝整理)

第一章 计算机系统概述 “较简单&#xff0c;不做过多赘述&#xff0c;后面会详细学到” 第一节 计算机系统层次结构 1.计算机系统的基本组成&#xff1a;硬件软件 2.计算机硬件的基本组成&#xff1a;运算器存储器控制器输入设备输出设备 3.系统软件和应用软件 系统软件…

企业数字化转型所需的数据在哪里找?企业数据运营有什么用?

现阶段&#xff0c;越来越多企业考虑数字化转型。特别是中小型企业&#xff0c;他们察觉到&#xff1a;数字化转型的关键在于数据的运营。只有通过数据的有效管理和不断挖掘&#xff0c;企业才可以更好地了解市场需求&#xff0c;优化业务流程&#xff0c;提高决策效率&#xf…

浅谈Python装饰器原理与用法分析

前言 本文实例讲述了Python装饰器原理与用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 1、装饰器的本质是函数&#xff0c;主要用来装饰其他函数&#xff0c;也就是为其他函数添加附加功能 2、装饰器的原则: (1) 装饰器不能修改被装饰的函数的源代码 (2) 装…

磐舟CI使用说明及案例

整体介绍 磐舟作为一个devops产品&#xff0c;它具备基础的CI流水线功能。同时磐舟的流水线是完全基于云原生架构设计的&#xff0c;在使用时会有一些注意事项。这里首先我们要了解磐舟整体的流水线打包逻辑。 文档结构说明 一般来说&#xff0c;磐舟推荐单个业务的标准git库…

面试官:什么是三色标记

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…