[补题记录] 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.mzph.cn/news/160299.shtml

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

相关文章

信息压缩模型在自然语言处理中的应用和探讨

信息压缩模型在自然语言处理中的应用和探讨 摘要:正文:结论:附录:摘要: 随着人工智能和深度学习的发展,自然语言处理(NLP)在信息处理中的角色变得越来越重要。然而,海量的自然语言数据为信息处理带来了挑战——更多的信息通常意味着更高的处理成本,并可能导致效率降低。为…

一个工具让你明白“万丈高楼平地起”,拒绝重复造轮子!

大家在公司工作当中是不是很多时间装环境很麻烦&#xff0c;一个项目要上线了&#xff0c;开始网上搜了一边又一遍的环境搭建教程&#xff1f;等到下一个项目要上线了&#xff0c;又上网上搜了一边又一遍的环境搭建教程。关键天花乱坠的互联网&#xff0c;找不到很靠谱的呀。有…

数组的移动

设计程序&#xff0c;给定包含N个整数的数组array&#xff0c;实现操作&#xff1a;前面各个整数顺序向后移动m个位置&#xff0c;最后的m个整数移动到最前面。方法&#xff1a;void move(int array[], int n,int m ) 输入要求 第一行输入两个整数N(1<N<1e6)和m(0<m&…

webpack 配置

1、基础配置 // node js核心模塊 const path require(path) // 插件是需要引入使用的 const ESLintPlugin require(eslint-webpack-plugin) // 自动生成index.html const HtmlWebpackPlugin require(html-webpack-plugin); // 将css文件单独打包&#xff0c;在index.html中…

如何做好项目管理?年薪百万项目大佬一直在用这11张图

大家好&#xff0c;我是老原。 日常工作中&#xff0c;我们会遇到各种大大小小的工作项目&#xff0c;如何能让项目保质保量的完成&#xff0c;是我们项目经理的目标。 项目管理的流程可以说是由一系列的子过程组成的&#xff0c;它是一个循序渐进的过程&#xff0c;所以不能…

python数字

目录 整数&#xff08;如&#xff0c;2、4、20 &#xff09;的类型是 int&#xff0c;带小数&#xff08;如&#xff0c;5.0、1.6 &#xff09;的类型是 float。 Python 用 ** 运算符计算乘方 1&#xff1a; 等号&#xff08;&#xff09;用于给变量赋值。 解释器像一个简单…

进程API

linux下进程的api forkwaitexec fork #include <stdio.h> #include <stdlib.h> #include <unistd.h>/* linux环境运行 子进程并不是完全拷贝了父进程。具体来说&#xff0c;虽然它拥有自己的 地址空间&#xff08;即拥有自己的私有内存&#xff09;、寄存器…

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

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

Postman如何使用(一):导入导出和发送请求查看响应

一、Postman如何导入导出打包的应用 在Postman中导入导出我们的 测试数据包 和 工作环境 非常的方便&#xff1a; 导出数据包的方法如下&#xff1a; 如果你想学习自动化测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站播放全网第一的自动化测试教程…

七天.NET 8操作SQLite入门到实战 - 第三天SQLite快速入门

前言 今天我们花费一个小时快速了解SQLite数据类型、SQLite常用命令和语法。 七天.NET 8操作SQLite入门到实战详细教程 第一天 SQLite 简介第二天 在 Windows 上配置 SQLite环境 EasySQLite项目源码地址 GitHub地址&#xff1a;https://github.com/YSGStudyHards/EasySQLite&…

第一百七十六回 如何创建渐变色边角

文章目录 1. 概念介绍2. 实现方法3. 代码与细节3.1 示例代码3.2 代码细节 4. 内容总结 我们在上一章回中介绍了"如何创建放射形状渐变背景"相关的内容&#xff0c;本章回中将介绍"如何创建渐变色边角".闲话休提&#xff0c;让我们一起Talk Flutter吧。 1.…

2023-11-22 LeetCode每日一题(网格中的最小路径代价)

2023-11-22每日一题 一、题目编号 2304. 网格中的最小路径代价二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的整数矩阵 grid &#xff0c;矩阵大小为 m x n &#xff0c;由从 0 到 m * n - 1 的不同整数组成。你可以在此矩阵中&#xff0c;从一个…

一石激起千层浪,有关奥特曼被炒的消息引发了一场热烈的讨论

在毫无征兆的情况下&#xff0c;OpenAI CEO山姆-奥特曼被炒了。 一石激起千层浪&#xff0c;有关奥特曼被炒的消息引发了一场热烈的讨论。 有人将其看成是一场「宫斗」&#xff0c;有人将其看成是OpenAI的董事会与创始人们的一次纠偏。 无论如何&#xff0c;这样一件看似并无…

网工内推 | 合资公司网工,CCNP/HCIP认证优先,朝九晚六

01 中企网络通信技术有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、按照工作流程和指引监控网络运行情况和客户连接状况&#xff1b; 2、确保各监控系统能正常运作&#xff1b; 3、快速响应各个网络告警事件&#xff1b; 4、判断出网络故障&#xff0c;按…

数据要素:数字经济最核心的资源。(存储,流通,使用)数据资产的价值量化评估,数据要素的特点

目录 数据要素:数字经济最核心的资源。(存储,流通,使用) 数据资产的价值量化评估

浅谈对于Android CMakeLists文件的理解

文章目录 文件结构 文件结构 cmake_minimum_required(VERSION 3.10.2) //设置cmake版本set(CMAKE_LIBRARY_OUTPUT_DIRECTORY${CMAKE_CURRENT_LIST_DIR}/../jniLibs/${ANDROID_ABI}) //设置.so文件输出路径 project("add") //编译目录add_library( common //生成.so文…

【Linux虚拟内存的配置】

设置Linux虚拟内存 注意:在做项目时&#xff0c;电脑内存不够用,怎么办? 这里给大家提供了一种解决方案,用磁盘换内存,具体如下: 虚拟内存swap介绍 如果你的服务器的总是报告内存不足&#xff0c;并且时常因为内存不足而引发服务被强制kill的话&#xff0c;在不增加物理内…

一、爬虫-爬取豆瓣电影案例

1、环境配置 你需要一个pycharm和requests第三方库&#xff0c;在安装完成之后即可继续浏览。 2、操作流程 &#xff08;1&#xff09;打开豆瓣电影网站&#xff0c;点击排行榜&#xff0c;点击喜剧&#xff0c;检查 &#xff08;2&#xff09;可以看到鼠标每次下移&#xff0…

蓝桥杯每日一题2023.11.22

题目描述 题目分析 由题目知其每个品牌积分一定小于315故直接暴力枚举每个品牌如果符合要求直接输出即可 &#xff08;答案&#xff1a;150&#xff09; #include<bits/stdc.h> using namespace std; int main() {for(int i 1; i < 315; i ){for(int j 1; j <…