[補題記錄] 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.pswp.cn/news/160299.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160299.shtml
英文地址,請注明出處:http://en.pswp.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 <…