P8686 [藍橋杯 2019 省 A] 修改數組--并查集 or Set--lower_bound()的解法!!!

P8686 [藍橋杯 2019 省 A] 修改數組--并查集

    • 題目
  • 并查集解析
    • 代碼【并查集解】
  • Set 解法解析
    • lower_bound
    • 代碼

題目

在這里插入圖片描述

并查集解析

首先先讓所有的f(i)=i,即每個人最開始的祖先都是自己,然后就每一次都讓輪到那個數的父親+1(用過后的標記),第二次出現的時候就直接用父親替換掉

并查集的作用:并查集用于快速查找元素的根節點,并進行路徑壓縮以提高效率。

并查集適用場景

1.快速合并與查詢:需要頻繁合并集合(如標記某個數已被占用)和查詢根節點(找下一個可用位置)。
2.路徑壓縮優化:通過壓縮查找路徑,使得后續查詢接近常數時間復雜度。
3.動態維護連續區間:每個數字的父節點指向下一個可用位置,天然維護了一個動態遞增的區間。

代碼【并查集解】

#include <iostream>
#include <vector>
#include <set>
#include <cstring>
#include <algorithm>
#include <math.h>
#include <queue>
#include <climits>  // 包含INT_MAX常量
#include <cctype>
using namespace std;
int n, f[100010];int find(int x) {if (f[x] == x)return x;return f[x] = find(f[x]);
}int main() {cin >> n;for (int i = 1; i <= 1e5; i++)f[i] = i;for (int i = 0; i < n; i++) {int x;cin >> x;x = find(x);cout << x << ' ';f[x] += 1;//為下一次重復做準備}return 0;
}

Set 解法解析

這道題我們可以利用set 的有序性和高效查找特性,直接找到每個元素的最小可用值

代碼思路:
先將1~1e6的值依次存入set中,然后利用lower_bound()找到第一個大于等于x的值,使用過后再利用erase()刪除
【這個代碼的思路完全符合我們腦中所想】

lower_bound

是一個用于在有序序列中【有序序列set】查找特定元素的函數。它返回指向第一個不小于給定值的元素的迭代器。結合set(有序集合),可以高效解決需要動態維護有序數據并快速查找的問題。

lower_bound 的核心功能
1.作用:在有序序列中找到第一個不小于目標值的位置。
2.返回值:
i 如果存在符合條件的元素,返回指向該元素的迭代器。
ii如果所有元素都小于目標值,返回容器的end()迭代器。

在 set 中使用 lower_bound
set 的特性:
1.元素唯一且按升序自動排序。
2.插入、刪除和查找操作的時間復雜度為 O(log N)。
調用方式:

auto it = s.lower_bound(x);  // it 是迭代器,指向第一個 >=x 的元素
cout << *it;                 // *it 是該元素的實際值
s.erase(it);                 // 直接傳遞迭代器刪除元素(不需要 *)

lower_bound 下界 & upper_bound上界
在這里插入圖片描述

為什么不用 vector 替代 set?
vector 的插入、刪除和查找效率較低,適合靜態數據。

vector 的查找必須遍歷或使用 find 算法,效率低。

代碼

#include <iostream>
#include <vector>
#include <set>
#include <cstring>
#include <algorithm>
#include <math.h>
#include <queue>
#include <climits>  // 包含INT_MAX常量
#include <cctype>
using namespace std;
int n;
set<int> s;int main() {cin >> n;for (int i = 1; i <= 1e6; i++)s.insert(i);for (int i = 0; i < n; i++) {int x;cin >> x;auto a = s.lower_bound(x); //lower_bound返回第一個大于等于x的值,在有序集合set中能完美解決該問題cout << *a << ' ';s.erase(a);}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897501.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897501.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897501.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Anaconda中虛擬環境安裝g++和gcc相同版本

安裝torchSDF的時候遇到的&#xff0c;這是g和gcc版本不一致的問題 gcc: fatal error: cannot execute cc1plus: execvp: No such file or directory compilation terminated.查看gcc, g版本 gcc --version | head -n1 g --version | head -n1發現gcc的是anaconda中的&#x…

C++編程:進階階段—4.2對象

目錄 4.2 對象特征 4.2.1 構造函數和析構函數 4.2.2 構造函數的分類 4.2.3 拷貝函數調用時機 4.2.4 構造函數調用規則 4.2.5 深拷貝與淺拷貝 4.2.6 初始化列表 4.2.7 類對象作為類成員 4.2.8 靜態成員 4.2.9 成員變量和成員函數的存儲 4.2.10 this指針 4.2.11 空指針…

【MySQL_04】數據庫基本操作(用戶管理--配置文件--遠程連接--數據庫信息查看、創建、刪除)

文章目錄 一、MySQL 用戶管理1.1 用戶管理1.11 mysql.user表詳解1.12 添加用戶1.13 修改用戶權限1.14 刪除用戶1.15 密碼問題 二、MySQL 配置文件2.1 配置文件位置2.2 配置文件結構2.3 常用配置參數 三、MySQL遠程連接四、數據庫的查看、創建、刪除4.1 查看數據庫4.2 創建、刪除…

配置 Thunderbird 以使用 outlook 郵箱

配置 Thunderbird 以使用 outlook 郵箱 thunder bird 作為郵件客戶端非常好用&#xff0c;不用每次登錄郵箱網頁端查看郵件&#xff0c;直接打開配置好的 thunder bird 即可免登錄查看郵件。 0. 什么是 Thunder Bird ? https://www.thunderbird.net/zh-CN/ Thunderbird 創立…

邊緣計算的業務種類劃分

Pcdn的業務可以根據不同的分類標準來劃分 一、按線路類型劃分 匯聚模式&#xff1a;一個地方有多條線路&#xff0c;業務種類較多。通常使用X86或X99主板組裝的服務器&#xff0c;或各品牌的準系統服務器。收益通常比單線模式更高。 單線模式&#xff1a;一個地方只有一條線路&…

服務器數據恢復—raid5陣列中硬盤出現壞道的數據恢復流程

服務器故障情況&#xff1a; 某公司一臺服務器中有一組多塊硬盤組成的磁盤陣列。磁盤陣列中有2塊硬盤出現故障離線&#xff0c;服務器崩潰&#xff0c;上層數據丟失。 硬件檢測&#xff1a; 硬件工程師對客戶服務器內的所有硬盤進行物理故障檢測&#xff0c;最終確認這2塊硬盤…

Linux:多線程(三.POSIX信號量、生產消費模型、線程池)

目錄 1. 生產者消費者模型 1.1 阻塞隊列(BlockingQueue) 1.2 一個實際應用的例子 2. POSIX信號量 2.1 引入 2.2 回顧加深理解信號量 2.3 信號量的操作接口 3. 基于循環隊列的生產消費模型 3.1 循環隊列 3.2 整個項目 4. 線程池 4.1 概念 4.2 線程池實現 1. 生產者…

關于前后端整合和打包成exe文件的個人的總結和思考

前言 感覺有很多東西&#xff0c;不知道寫什么&#xff0c;隨便寫點吧。 正文 前后端合并 就不說怎么開發的&#xff0c;就說點個人感覺重要的東西。 前端用ReactViteaxios隨便寫一個demo&#xff0c;用于CRUD。 后端用Django REST Framework。 設置前端打包 import { …

Android15 Camera框架中的StatusTracker

StatusTracker介紹 StatusTracker是Android15 Camera框架中用來協調Camera3各組件之間狀態轉換的類。 StatusTracker線程名&#xff1a;std::string("C3Dev-") mId "-Status" Camera3 StatusTracker工作原理 StatusTracker實現批處理&#xff08;狀態…

利用OpenResty攔截SQL注入

需求 客戶的一個老項目被相關部門檢測不安全&#xff0c;報告為sql注入。不想改代碼&#xff0c;改項目&#xff0c;所以想到利用nginx去做一些數據校驗攔截。也就是前端傳一些用于sql注入的非法字符或者數據庫的關鍵字這些&#xff0c;都給攔截掉&#xff0c;從而實現攔截sql…

警惕AI神話破滅:深度解析大模型缺陷與禁用場景指南

摘要 當前AI大模型雖展現強大能力&#xff0c;但其本質缺陷可能引發系統性風險。本文從認知鴻溝、數據困境、倫理雷區、技術瓶頸四大維度剖析大模型局限性&#xff0c;揭示醫療診斷、法律決策等8類禁用場景&#xff0c;提出可信AI建設框架與用戶防護策略。通過理論分析與實操案…

顛覆語言認知的革命!神經概率語言模型如何突破人類思維邊界?

顛覆語言認知的革命&#xff01;神經概率語言模型如何突破人類思維邊界&#xff1f; 一、傳統模型的世紀困境&#xff1a;當n-gram遇上"月光族難題" 令人震驚的案例&#xff1a;2012年Google語音識別系統將 用戶說&#xff1a;“我要還信用卡” 系統識別&#xff…

【Linux】詳談 基礎I/O

目錄 一、理解文件 狹義的理解&#xff1a; 廣義理解&#xff1a; 文件操作的歸類認知 系統角度 二、系統文件I/O 2.1 標志位的傳遞 系統級接口open ?編輯 open返回值 寫入文件 讀文件 三、文件描述符 3.1&#xff08;0 & 1 & 2&#xff09; 3.2 文件描…

超分之DeSRA

Desra: detect and delete the artifacts of gan-based real-world super-resolution models.DeSRA&#xff1a;檢測并消除基于GAN的真實世界超分辨率模型中的偽影Xie L, Wang X, Chen X, et al.arXiv preprint arXiv:2307.02457, 2023. 摘要 背景&#xff1a; GAN-SR模型雖然…

Vue3 Pinia 符合直覺的Vue.js狀態管理庫

Pinia 符合直覺的Vue.js狀態管理庫 什么時候使用Pinia 當兩個關系非常遠的組件&#xff0c;要傳遞參數時使用Pinia組件的公共參數使用Pinia

Web Worker如何在本地使用

首先了解一下什么是Web Worker Web Worker 是一種在后臺線程中運行 JavaScript 的機制&#xff0c;允許你在不阻塞主線程的情況下執行耗時的任務。這對于保持網頁的響應性和流暢性非常重要&#xff0c;特別是在需要進行復雜計算或大量數據處理時。 主要特點 多線程&#xff1…

Javaweb后端文件上傳@value注解

文件本地存儲磁盤 阿里云oss準備工作 阿里云oss入門程序 要重啟一下idea&#xff0c;上面有cmd 阿里云oss案例集成 優化 用spring中的value注解

MAC-禁止百度網盤自動升級更新

通過終端禁用更新服務(推薦)? 此方法直接移除百度網盤的自動更新組件,無需修改系統文件。 ?步驟: ?1.關閉百度網盤后臺進程 按下 Command + Space → 輸入「活動監視器」→ 搜索 BaiduNetdisk 或 UpdateAgent → 結束相關進程。 ?2.刪除自動更新配置文件 打開終端…

數據結構:有序表的插入

本文是我編寫的針對計算機專業考研復習《數據結構》所用資料內容選刊。主要目的在于向復習這門課程的同學說明&#xff0c;此類問題不僅僅使用順序表&#xff0c;也可以使用鏈表。并且&#xff0c;在復習中&#xff0c;兩種數據結構都要掌握。 若線性表中的數據元素相互之間可以…

DeepSeek大語言模型下幾個常用術語

昨天刷B站看到復旦趙斌老師說的一句話“科幻電影里在人腦中植入芯片或許在當下無法實現&#xff0c;但當下可以借助AI人工智能實現人類第二腦”&#xff08;大概是這個意思&#xff09; &#x1f49e;更多內容&#xff0c;可關注公眾號“ 一名程序媛 ”&#xff0c;我們一起從 …