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

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.mfbz.cn/a/177562.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

矩阵知识补充

正交矩阵 定义&#xff1a; 正交矩阵是一种满足 A T A E A^{T}AE ATAE的方阵 正交矩阵具有以下几个重要性质&#xff1a; A的逆等于A的转置&#xff0c;即 A − 1 A T A^{-1}A^{T} A−1AT**A的行列式的绝对值等于1&#xff0c;即 ∣ d e t ( A ) ∣ 1 |det(A)|1 ∣det(A)∣…

VPS配置了swap没发挥作用怎么办

1 swap配置了但没用上 我的服务器内存是2G&#xff0c;装多一点东西就不够用&#xff0c;于是我给他分配了2G的swap&#xff0c;等了几小时&#xff0c;swap还是一点都没有使用 Linux中Swap&#xff08;即&#xff1a;交换分区&#xff09;&#xff0c;类似于Windows的虚拟内存…

C++电脑组装项目(涉及知识点:多态)

需求&#xff1a; #include <iostream> #include "Computer.h" #include "AbstractCpu.h" #include "AbstractMemory.h" #include "AbstractVideoCard.h" #include "IntelCpu.h" #include "IntelMemory.h" …

【LeetCode刷题】--39.组合总和

39.组合总和 本题详解&#xff1a;回溯算法剪枝 class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) {int len candidates.length;List<List<Integer>> res new ArrayList<>();if (len 0) {return r…

二、类与对象(二)

8 this指针 8.1 this指针的引入 我们先来定义一个日期的类Date&#xff1a; #include <iostream> using namespace std; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout << _year <&l…

【Python】数据类型和切片的零碎知识点

1. 数据类型 pow(a, b, c) # a^b % c print("happy {}".format(name))数字类型包括整数&#xff0c;浮点数&#xff0c;复数 0x9a表示十六进制数&#xff08;0x&#xff0c;0X开头表示十六进制&#xff09; 0b1010&#xff0c;-0B101表示二进制数&#xff08;0…

【Delphi】使用TWebBrowser执行JavaScript命令传入JSON参数执行出错解决方案

目录 一、问题背景&#xff1a; 二、实际示例&#xff1a; 三、解决方案&#xff1a; 1. Delphi 代码&#xff1a; 2. javaScript代码&#xff1a; 一、问题背景&#xff1a; 在用Delphi开发程序&#xff0c;无论是移动端还是PC端&#xff0c;都可以很方便的使用TWebBrows…

c语言-操作符详解(含优先级与结合性)

文章目录 了解什么是操作数、操作符操作数&#xff1a;操作符 操作符详解&#xff1a;1.算术操作符&#xff1a; 、- 、* 、/ 、%2.移位操作符: << >>3.位操作符: & | ^4. 赋值操作符: 、 、 - 、 * 、 / 、% 、<< 、>> 、& 、| 、^5. 单⽬操…

Java架构师软件架构风格

目录 1 数据流风格1.1 管道过滤器1.2 数据流风格的优点2 调用返回风格2.1 面向对象风格2.2 调用返回风格总结3 独立构件风格3.1 事件驱动系统风格的主要特点3.2 独立构件风格总结4 虚拟机风格4.1 虚拟机风格总结5 仓库风格5.1 仓库风格总结想学习架构师构建流程请跳转:Java架构…

接口测试快速上手指南

大量线上BUG表明&#xff0c;对接口进行测试可以有效提升产品质量&#xff0c;暴露手工测试时难以发现的问题&#xff0c;同时也能缩短测试周期&#xff0c;提升测试效率。但在实际执行过程中&#xff0c;接口测试被很多同学打上了“上手难&#xff0c;门槛高”的标签。 本文旨…

中低压MOSFET 2N7002T 60V 300mA 双N通道 采用SOT-523封装形式

2N7002KW小电流双N通道MOSFET&#xff0c;电压60V电流300mA&#xff0c;采用SOT-523封装形式。低Ros (on)的高密度单元设计&#xff0c;坚固可靠&#xff0c;具有高饱和电流能力&#xff0c;ESD防护门HBM2KV。可应用于直流/直流转换器&#xff0c;电池开关等产品应用上。

用spring发送http请求

在Spring中&#xff0c;你可以使用RestTemplate或WebClient来发送HTTP请求。下面分别给出使用这两个类的简单示例。 现在pom.xml中导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artif…

原来RocketMQ消息会重复消费是无奈的”Bug“

消息发送异常时重复发送 首先&#xff0c;我们来瞅瞅RocketMQ发送消息和消费消息的基本原理。 如图&#xff0c;简单说一下上图中的概念&#xff1a; Broker&#xff0c;就是RocketMQ的服务端&#xff0c;如上图就有两个服务实例Topic就是一类消息集合的名字Queue就是Topic的…

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

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

电动汽车充放电V2G模型MATLAB代码

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 主要内容&#xff1a; 本程序主要建立电动汽车充放电V2G模型&#xff0c;采用粒子群算法&#xff0c;在保证电动汽车用户出行需求的前提下&#xff0c;为了使工作区域电动汽车尽可能多的消纳供给商场基础负荷…

pycurl>=7.43.0.5机器学习环境配置问题

去官网下载对应版本.whl文件&#xff0c;注意使用python --version提前查看 python版本信息和64bit还是32bit,下载对应版本。 cd 到该路径下&#xff0c;并pip。6

MySQL数据库时间计算的用法

今天给大家分享如何通过MySQL内置函数实现时间的转换和计算&#xff0c;在工作当中&#xff0c;测试人员经常需要查询数据库表的日期时间&#xff0c;但发现开发人员存入数据库表的形式都是时间戳形式&#xff0c;不利于测试人员查看&#xff0c;测试人员只能利用工具对时间戳进…

妥善解决需求冲突的5大技巧

在进行需求分析时&#xff0c;往往会遇到需求冲突问题&#xff0c;此问题往往导致项目进度延迟、资源浪费以及软件质量问题。因此我们需要妥善解决需求冲突问题&#xff0c;平衡各方利益&#xff0c;提高项目的成功率以及客户满意度。 一般来说&#xff0c;妥善解决需求冲突有以…

LeetCode(32)串联所有单词的子串【滑动窗口】【困难】(含图解)

目录 1.题目2.答案3.提交结果截图4.图解 链接&#xff1a; 串联所有单词的子串 1.题目 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如&#xff0c;如果 w…

用css实现原生form中radio单选框和input输入框的hover样式以及聚焦focus的样式

一.问题描述&#xff1a;用css实现原生form中radio单选框和input的hover已经focus的样式 在实际的开发中&#xff0c;一般公司ui都会给效果图&#xff0c;比如单选按钮radio样式&#xff0c;input输入框hover的时候样式&#xff0c;以及focus的时候样式&#xff0c;等等&#…
最新文章