[补题记录] 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.hqwc.cn/news/207593.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

orvibo的Mini网关VS20ZW玩法

概述 闲鱼淘来一个2016年生产的网关,此网关的型号:VS20ZW。 已经不能用APP入网了,没事拆来玩玩。 此设备已经被淘汰,很多新的zigbee产品不再支持入网。 官网设备的简介: ZigBee Mini网关,智能家居网关,智能家居主机|ORVIBO欧瑞博智能网关 设备概貌: 主要器件: …

生活如果真能像队列一样的话

生活如果真能像队列一样&#xff0c;那该多好啊。 —————————————————————————————————————————— 背包&#xff0c;队列 可以先看他们的API&#xff1a;都含有一个无参构造函数&#xff0c;添加单个元素的方法&#xff0c;测试集合…

pikachu_php反序列化

pikachu_php反序列化 源代码 class S{var $test "pikachu";function __construct(){echo $this->test;} }//O:1:"S":1:{s:4:"test";s:29:"<script>alert(xss)</script>";} $html; if(isset($_POST[o])){$s $_POST[…

HTML新手入门笔记整理:HTML基本标签

结构标签 <html> </html> 告诉浏览器这个页面是从<html> 开始&#xff0c;到 </html>结束 <head> </head> 网页的头部&#xff0c;用于定义一些特殊内容&#xff0c;如页面标题、定时刷新、外部文件等。 <body> </body> …

Linux 进程等待

在2号手册里查wait&#xff08;&#xff09;。wait()等待任意一个子进程的状态。 wait&#xff08;&#xff09;等待成功会返回该子进程的id,返回失败会返回-1&#xff1a; 小实验 子进程的退出码 子进程执行work()&#xff0c;父进程wait子进程。 子进程跑完5秒之后就e…

一篇文章搞懂WPF动画的使用技巧

WPF 动画系统提供了丰富的功能&#xff0c;用于为 UI 元素创建流畅的动态效果。动画可以应用于任何可用于渲染的属性&#xff0c;比如位置、颜色、大小等。在 WPF 中&#xff0c;动画是通过更改随时间变化的属性来实现的。 WPF动画基本用法 例如实现如下的动画效果&#xff1…

以45°斜抛水平距离最远

已知&#xff1a;斜抛物体的初速度为 v 0 v_0 v0​&#xff08;与水平方向的夹角为 θ \theta θ&#xff09;&#xff0c;重力加速度为 g g g。 求&#xff1a;抛物轨迹方程&#xff1f; 垂直方向的速度为 v y v 0 sin ⁡ θ − g t v_yv_0 \sin \theta -gt vy​v0​sinθ−…

小程序存在优惠卷遍历,但是歪了

进入小程序&#xff0c;因为是一个小商城&#xff0c;所以照例先查看收货地址是否存在越权&#xff0c;以及能否未授权访问&#xff0c;但是发现不存在这些问题&#xff0c;所以去查看优惠卷 进入领券中心&#xff0c;点击领取优惠券时抓包 发现数据包&#xff0c;存在敏感参数…

PTA-6-45 工厂设计模式-运输工具

题目如下&#xff1a; 工厂类用于根据客户提交的需求生产产品&#xff08;火车、汽车或拖拉机&#xff09;。火车类有两个子类属性&#xff1a;车次和节数。拖拉机类有1个子类方法耕地&#xff0c;方法只需简单输出“拖拉机在耕地”。为了简化程序设计&#xff0c;所有…

JVM中判断对象是否需要回收的方法

在堆里面存放着Java 世界中几乎所有的对象实例&#xff0c;垃圾收集器在对堆进行回收前&#xff0c;第一件事情就是要确定这些对象之中哪些还“ 存活 ” 着&#xff0c;哪些已经 “ 死去 ”。 引用计数算法 引用计数法是一种内存管理技术&#xff0c;它是通过对每个对象进行引用…

智能卡接口芯片解决方案

一、基本概述 HCM8035是一款简洁且低成本的智能IC卡模拟接口芯片。内嵌升压模块&#xff0c;支持5V,3V,1.8V全电压读写。具有全面的安全保护机制&#xff0c;包括ESD保护&#xff0c;端口短路保护&#xff0c;电源上掉电保护。外围元件数目少&#xff0c;采用QFN32L封装。 今…

微信在线点餐怎么做_怎么实现在微信公众号在线点餐

微信公众号在线点餐&#xff1a;一种全新的餐饮体验 在这个快节奏的时代&#xff0c;人们的时间变得越来越宝贵。为了满足人们的需求&#xff0c;微信公众号的在线点餐功能应运而生。通过微信公众号&#xff0c;用户可以随时随地浏览和订购自己喜欢的餐食&#xff0c;无需排队…