并查集、樹狀數組

并查集、樹狀數組、線段樹

  • 并查集
  • 樹狀數組
    • 樹狀數組1 (單點修改,區間查詢)
    • 樹狀數組2 (單點查詢,區間修改)

并查集

【模板】并查集

題目描述

如題,現在有一個并查集,你需要完成合并和查詢操作。

輸入格式

第一行包含兩個整數 N , M N,M N,M ,表示共有 N N N 個元素和 M M M 個操作。

接下來 M M M 行,每行包含三個整數 Z i , X i , Y i Z_i,X_i,Y_i Zi?,Xi?,Yi?

Z i = 1 Z_i=1 Zi?=1 時,將 X i X_i Xi? Y i Y_i Yi? 所在的集合合并。

Z i = 2 Z_i=2 Zi?=2 時,輸出 X i X_i Xi? Y i Y_i Yi? 是否在同一集合內,是的輸出
Y ;否則輸出 N

輸出格式

對于每一個 Z i = 2 Z_i=2 Zi?=2 的操作,都有一行輸出,每行包含一個大寫字母,為 Y 或者 N

樣例輸入 #1

4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4

樣例輸出 #1

N
Y
N
Y

提示

對于 30 % 30\% 30% 的數據, N ≤ 10 N \le 10 N10 M ≤ 20 M \le 20 M20

對于 70 % 70\% 70% 的數據, N ≤ 100 N \le 100 N100 M ≤ 1 0 3 M \le 10^3 M103

對于 100 % 100\% 100% 的數據, 1 ≤ N ≤ 1 0 4 1\le N \le 10^4 1N104 1 ≤ M ≤ 2 × 1 0 5 1\le M \le 2\times 10^5 1M2×105 1 ≤ X i , Y i ≤ N 1 \le X_i, Y_i \le N 1Xi?,Yi?N Z i ∈ { 1 , 2 } Z_i \in \{ 1, 2 \} Zi?{1,2}

以下是模板代碼

#include<bits/stdc++.h>
using namespace std;
#define MAXN 10005int fa[MAXN]; // 用于存儲每個元素所屬的集合的根節點// 查找操作,返回元素x所屬集合的根節點
int find(int x) {if(x == fa[x]) return x; // 如果當前節點是根節點,直接返回return fa[x] = find(fa[x]); // 路徑壓縮,將x的父節點直接設為根節點,加快以后的查找
}// 合并操作,將兩個集合合并
void join(int c1, int c2) {int f1 = find(c1); // 查找c1所屬的集合的根節點int f2 = find(c2); // 查找c2所屬的集合的根節點if(f1 != f2) // 如果根節點不同,表示c1和c2不在同一集合中fa[f1] = f2; // 將c1的根節點的父節點設為c2的根節點,即合并兩個集合
}int main() {int n, m;cin >> n >> m; // 輸入元素個數n和操作個數mfor(int i = 1; i <= n; i++) fa[i] = i; // 初始化,每個元素初始時都是一個單獨的集合,根節點就是自己while(m--) {int z, x, y;cin >> z >> x >> y; // 輸入操作類型z以及兩個元素x和yif(z == 1) {join(x, y); // 合并操作,將x和y所在的集合合并} else {if(find(x) == find(y))cout << "Y" << endl; // 查找操作,如果x和y在同一個集合中,輸出Yelsecout << "N" << endl; // 否則輸出N}}return 0;
}

樹狀數組

樹狀數組1 (單點修改,區間查詢)

【模板】樹狀數組 1

題目描述

如題,已知一個數列,你需要進行下面兩種操作:

  • 將某一個數加上 x x x

  • 求出某區間每一個數的和

輸入格式

第一行包含兩個正整數 n , m n,m n,m,分別表示該數列數字的個數和操作的總個數。

第二行包含 n n n 個用空格分隔的整數,其中第 i i i 個數字表示數列第 i i i 項的初始值。

接下來 m m m 行每行包含 3 3 3 個整數,表示一個操作,具體如下:

  • 1 x k 含義:將第 x x x 個數加上 k k k

  • 2 x y 含義:輸出區間 [ x , y ] [x,y] [x,y] 內每個數的和

輸出格式

輸出包含若干行整數,即為所有操作 2 2 2 的結果。

樣例輸入 #1

5 5
1 5 4 2 3
1 1 3
2 2 5
1 3 -1
1 4 2
2 1 4

樣例輸出 #1

14
16

提示

【數據范圍】

對于 30 % 30\% 30% 的數據, 1 ≤ n ≤ 8 1 \le n \le 8 1n8 1 ≤ m ≤ 10 1\le m \le 10 1m10
對于 70 % 70\% 70% 的數據, 1 ≤ n , m ≤ 1 0 4 1\le n,m \le 10^4 1n,m104
對于 100 % 100\% 100% 的數據, 1 ≤ n , m ≤ 5 × 1 0 5 1\le n,m \le 5\times 10^5 1n,m5×105

數據保證對于任意時刻, a a a 的任意子區間(包括長度為 1 1 1 n n n 的子區間)和均在 [ ? 2 31 , 2 31 ) [-2^{31}, 2^{31}) [?231,231) 范圍內。

樣例說明:

故輸出結果14、16

以下是模板代碼

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
#define lowbit(x) ((x) & (-x))
int tree[N] = {0}; // 樹狀數組void update(int x, int d) { // 單點修改:修改元素 a[x],a[x] = a[x] + dwhile (x <= N) {tree[x] += d; // 將當前位置的值增加dx += lowbit(x); // 轉到下一個需要修改的位置}
}int sum(int x) { // 查詢前綴和:返回前綴和 sum = a[1] + a[2] + ... + a[x]int ans = 0;while (x > 0) {ans += tree[x]; // 累加當前位置的值x -= lowbit(x); // 轉到前一個位置}return ans;
}int main() {int n, m, a;cin >> n >> m; // 輸入數列數字個數n和操作總個數mfor (int i = 1; i <= n; i++) {cin >> a; // 輸入每個數列項的初始值update(i, a); // 初始化計算tree[]數組}while (m--) {int op;cin >> op; // 輸入操作類型if (op == 1) {int x, k;cin >> x >> k; // 輸入要修改的元素位置x和要加的值kupdate(x, k); // 對位置x的元素進行加法操作} else {int x, y;cin >> x >> y; // 輸入查詢區間[x, y]cout << sum(y) - sum(x - 1) << endl; // 輸出區間內元素和}}return 0;
}

樹狀數組2 (單點查詢,區間修改)

【模板】樹狀數組 2

題目描述

如題,已知一個數列,你需要進行下面兩種操作:

  1. 將某區間每一個數加上 x x x

  2. 求出某一個數的值。

輸入格式

第一行包含兩個整數 N N N M M M,分別表示該數列數字的個數和操作的總個數。

第二行包含 N N N 個用空格分隔的整數,其中第 i i i 個數字表示數列第 $i $ 項的初始值。

接下來 M M M 行每行包含 2 2 2 4 4 4個整數,表示一個操作,具體如下:

操作 1 1 1: 格式:1 x y k 含義:將區間 [ x , y ] [x,y] [x,y] 內每個數加上 k k k

操作 2 2 2: 格式:2 x 含義:輸出第 x x x 個數的值。

輸出格式

輸出包含若干行整數,即為所有操作 2 2 2 的結果。

樣例輸入 #1

5 5
1 5 4 2 3
1 2 4 2
2 3
1 1 5 -1
1 3 5 7
2 4

樣例輸出 #1

6
10

提示

樣例 1 解釋:

故輸出結果為 6、10。


數據規模與約定

對于 30 % 30\% 30% 的數據: N ≤ 8 N\le8 N8 M ≤ 10 M\le10 M10

對于 70 % 70\% 70% 的數據: N ≤ 10000 N\le 10000 N10000 M ≤ 10000 M\le10000 M10000

對于 100 % 100\% 100% 的數據: 1 ≤ N , M ≤ 500000 1 \leq N, M\le 500000 1N,M500000 1 ≤ x , y ≤ n 1 \leq x, y \leq n 1x,yn,保證任意時刻序列中任意元素的絕對值都不大于 2 30 2^{30} 230

以下是模板代碼

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
#define lowbit(x) ((x) & (-x))
int tree[N] = {0}; // 樹狀數組void update(int x, int d) { // 單點修改:修改元素 a[x],a[x] = a[x] + dwhile (x <= N) {tree[x] += d; // 將當前位置的值增加dx += lowbit(x); // 轉到下一個需要修改的位置}
}int sum(int x) { // 查詢前綴和:返回前綴和 sum = a[1] + a[2] + ... + a[x]int ans = 0;while (x > 0) {ans += tree[x]; // 累加當前位置的值x -= lowbit(x); // 轉到前一個位置}return ans;
}int main() {int n, m;int old = 0, a;cin >> n >> m; // 輸入數列數字個數n和操作總個數mfor (int i = 1; i <= n; i++) {cin >> a; // 輸入每個數列項的初始值update(i, a - old); // 初始化計算tree[]數組,這里是一個差分數組old = a;}while (m--) {int op;cin >> op; // 輸入操作類型if (op == 1) {int x, y, k;cin >> x >> y >> k; // 輸入要修改的區間[x, y]和要加的值kupdate(x, k);update(y + 1, -k); // 將區間[y+1, n]的值減去k,保持區間[x, y]加上k} else {int x;cin >> x; // 輸入要查詢的位置xcout << sum(x) << endl; // 輸出第x個數的值}}return 0;
}

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

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

相關文章

Scala中的Either的用法

在 Scala 中&#xff0c;Either 是一種表示兩種可能值的數據類型。它可以用來處理函數可能返回的兩種不同類型的結果&#xff0c;通常用于錯誤處理或者結果分支情況。Either 有兩個子類&#xff1a;Left 和 Right&#xff0c;其中 Left 通常用于表示錯誤或異常情況&#xff0c;…

1.物聯網LWIP網絡,TCP/IP協議簇

一。TCP/IP協議簇 1.應用層&#xff1a;FTP&#xff0c;HTTP&#xff0c;Telent&#xff0c;DNS&#xff0c;RIP 2.傳輸層&#xff1a;TCP&#xff0c;UDP 3.網絡層&#xff1a;IPV4&#xff0c;IPV6&#xff0c;OSPF&#xff0c;EIGRP 4.數據鏈路層&#xff1a;Ethernet&#…

YOLOv5改進系列(21)——替換主干網絡之RepViT(清華 ICCV 2023|最新開源移動端ViT)

【YOLOv5改進系列】前期回顧: YOLOv5改進系列(0)——重要性能指標與訓練結果評價及分析 YOLOv5改進系列(1)——添加SE注意力機制 YOLOv5改進系列(2

兩階段提交:詳解數據庫宕機引起的主從不一致問題、redolog與binlog的兩階段提交

0、基礎知識and問題 從基礎上我們了解&#xff1a; &#xff08;1&#xff09;redolog作為數據庫保證持久化的日志&#xff0c;在update事務提交后就會按一定的策略刷入磁盤中&#xff0c;在刷入后&#xff0c;即使數據庫斷電宕機&#xff0c;mysql也能從redolog中恢復數據到磁…

Matplotlib數據可視化(六)

目錄 1.繪制概率圖 2.繪制雷達圖 3.繪制流向圖 4.繪制極坐標圖 5.繪制詞云圖 1.繪制概率圖 from scipy.stats import norm fig,ax plt.subplots() plt.rcParams[font.family] [SimHei] np.random.seed() mu 100 sigma 15 x musigma*np.random.randn(437) num_bins …

【騰訊云 Cloud Studio 實戰訓練營】在線 IDE 編寫 canvas 轉換黑白風格頭像

關于 Cloud Studio Cloud Studio 是基于瀏覽器的集成式開發環境(IDE)&#xff0c;為開發者提供了一個永不間斷的云端工作站。用戶在使用Cloud Studio 時無需安裝&#xff0c;隨時隨地打開瀏覽器就能在線編程。 Cloud Studio 作為在線IDE&#xff0c;包含代碼高亮、自動補全、Gi…

winform 設置畫刷半透明

使用solidBrush新建畫刷&#xff0c;定義畫刷的顏色為透明色 Brush b new SolidBrush(Color.FromArgb(50, Color.Green)); 這里的50是透明度的設置&#xff0c;范圍從0-255&#xff1b; 0:無顏色 255:不透明 轉&#xff1a;c# 設置Brush 畫刷 透明_solidcolorbrush 透明色_…

git-fatal: No url found for submodule path ‘packages/libary‘ in .gitmodules

文章目錄 前言一、git submodule功能使用二、錯誤信息&#xff1a;三、解決方法&#xff1a;四、.gitmodules配置文件&#xff1a;總結 前言 最近在做vue項目&#xff0c;因為項目比較復雜&#xff0c;把功能拆分成很多子模塊&#xff0c;我們使用Git的submodule功能。遇到錯誤…

使用libvncserver庫快速搭建VNC服務端

文章目錄 VNC是什么libvncserver的優點和缺點構建libvncserver使用libvncserver搭建VNCServerX11模擬鼠標鍵盤操作libvncserver中處理鼠標鍵盤消息 VNC是什么 VNC(Virtual Network Computing)是一種使用遠程幀緩沖協議(RFB)的屏幕分享及遠程操作軟件。VNC的服務端可以通過RFP協…

Linux開機啟動程序添加root權限

Linux添加開機啟動程序 Debain、Ubuntu系列Linux開機之后會執行/etc/rc.local文件中的命令&#xff0c;所以&#xff0c;如果是想添加登陸用戶所具有權限的操作&#xff0c;可以在文件中exit 0之前添加開機自動執行的腳本命令。或者將執行腳本的權限修改為當前登錄用戶具有執行…

基于R語言APSIM模型進階應用與參數優化、批量模擬

隨著數字農業和智慧農業的發展&#xff0c;基于過程的農業生產系統模型在模擬作物對氣候變化的響應與適應、農田管理優化、作物品種和株型篩選、農田固碳和溫室氣體排放等領域扮演著越來越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…

moodle單點登陸

在moodle/login添加sso.php <?phprequire(../config.php); require_once(lib.php);if($_SERVER[REQUEST_METHOD]==GET){$tokenId=$_GET[tokenId]; }else{$tokenId="fail";

C++新經典03--共用體、枚舉類型與typedef

共用體 共用體&#xff0c;也叫聯合&#xff0c;有時候需要把幾種不同類型的變量存放到同一段內存單元&#xff0c;例如&#xff0c;把一個整型變量、一個字符型變量、一個字符數組放在同一個地址開始的內存單元中。這三個變量在內存中占的字節數不同&#xff0c;但它們都從同…

idea 轉換為 Maven Project 的方法

選項&#xff1a; Add as Maven Project

通過TightVNC遠程訪問MacOS

目錄 一、下載 TightVNC 下載鏈接&#xff1a;https://www.tightvnc.com/ 下載后按步驟進行安裝&#xff0c;安裝完成后安裝目錄如下&#xff1a; 運行 tvnviewer.exe&#xff0c;輸入遠程 IP&#xff0c;點擊【connect】&#xff1a; 輸入密碼&#xff0c;點擊【OK】后即可遠…

Matlab中圖例的位置(圖例放在圖的上方、下方、左方、右方、圖外面)等

一、圖例默認位置 默認的位置在NorthEast r 10; a 0; b 0; t0:0.1:2.1*pi; xar*cos(t); ybr*sin(t); A1plot(x,y,r,linewidth,4);%圓 hold on axis equal A2plot([0 0],[1 10],b,linewidth,4);%直線 legend([A1,A2],圓形,line)二、通過Location對legend的位置進行改變 變…

企業電子招投標采購系統源碼之電子招投標的組成 tbms

? 功能模塊&#xff1a; 待辦消息&#xff0c;招標公告&#xff0c;中標公告&#xff0c;信息發布 描述&#xff1a; 全過程數字化采購管理&#xff0c;打造從供應商管理到采購招投標、采購合同、采購執行的全過程數字化管理。通供應商門戶具備內外協同的能力&#xff0c;為…

設計模式-觀察者模式(觀察者模式的需求衍變過程詳解,關于監聽的理解)

目錄 前言概念你有過這樣的問題嗎&#xff1f; 詳細介紹原理&#xff1a;應用場景&#xff1a; 實現方式&#xff1a;類圖代碼 問題回答監聽&#xff0c;為什么叫監聽&#xff0c;具體代碼是哪觀察者模式的需求衍變過程觀察者是為什么是行為型 總結&#xff1a; 前言 在軟件設計…

【C++類和對象】類有哪些默認成員函數呢?(下)

文章目錄 一、類的6個默認成員函數二、日期類的實現2.1 運算符重載部分2.2 日期之間的運算2.3 整體代碼1.Date.h部分2. Date.cpp部分 三. const成員函數四. 取地址及const取地址操作符重載擴展內容 總結 ヾ(????)&#xff89;" 人總要為過去的懶惰而付出代價ヾ(???…

2011年下半年 軟件設計師 上午試卷2

博主介紹&#xff1a;?全網粉絲3W&#xff0c;全棧開發工程師&#xff0c;從事多年軟件開發&#xff0c;在大廠呆過。持有軟件中級、六級等證書。可提供微服務項目搭建與畢業項目實戰&#xff0c;博主也曾寫過優秀論文&#xff0c;查重率極低&#xff0c;在這方面有豐富的經驗…