Acwing 基礎課 基礎演算法 離散化 區間合併

2021-10-20 19:50:00 字數 3330 閱讀 4412

題目鏈結

題目大意

假定有乙個無限長的數軸,數軸上每個座標上的數都是0。

現在,我們首先進行 n 次操作,每次操作將某一位置x上的數加c。

接下來,進行 m 次詢問,每個詢問包含兩個整數l和r,你需要求出在區間[l, r]之間的所有數的和。

−109≤x≤109 ,

1≤n,m≤105,

−109≤l≤r≤109,

−10000≤c≤10000

解題思路

參考鏈結

離散化的本質,是對映,將間隔很大的點,對映到相鄰的陣列元素中。減少對空間的需求,也減少計算量。

首先,可以先統計所有出現的座標(將無限長的陣列,離散化為有限的座標),記錄插入操作的插入值、記錄查詢操作的兩個區間,其次將所有出現的座標去重。接著處理插入操作,使用二分查詢找到相應的座標;然後,為了方便計算查詢操作的區間和,使用字首和進行預處理;最後,在字首和陣列上處理查詢操作。

#include

#include

#include

using

namespace std;

typedef pair<

int,

int> pii;

//1≤n,m≤10^5,將無限長的數軸對映為n個座標

const

int n =

300010

;int n, m;

int a[n]

, s[n]

;vector<

int> alls;

vector add, query;

//第乙個 >= x 的位置

intfind

(int x)

return r +1;

// 對映到1.2......n

}//會將所有重複的元素,放在後面,然後刪除就可以了

vector<

int>

::iterator unique

(vector<

int>

&a)int

main()

);alls.

push_back

(x);

}for

(int i =

0; i < m; i ++))

; alls.

push_back

(l);

alls.

push_back

(r);

}// alls 涉及了所有的下標

// 去重

sort

(alls.

begin()

, alls.

end())

;//h 刪除下標pos開始的n個字元

// unique(alls) 會將所有重複的數字放在最後

alls.

erase

(unique

(alls)

, alls.

end())

;// 處理插入

for(

auto item : add)

// 字首和

for(

int i =

1; i <= alls.

size()

; i ++

) s[i]

= s[i -1]

+ a[i]

;// 處理詢問

for(

auto item : query)

return0;

}

這裡涉及兩個模板

模板一 vector去重

//會將所有重複的元素,放在後面,然後刪除就可以了

vector<

int>

::iterator unique

(vector<

int>

&a)int

main()

模板二 二分查詢第乙個》= x的位置
//第乙個 >= x 的位置

intfind

(int x)

// 返回的下標從1開始

return r +1;

// 對映到1.2......n

}

題目鏈結

題目大意

給定 n 個區間 [li,ri],要求合併所有有交集的區間。

注意如果在端點處相交,也算有交集。

輸出合併完成後的區間個數。

例如[1,3]和[2,6]可以合併為乙個區間[1,6]。

解題思路 模擬

顯然區間的端點非常關鍵

區間左端點排序後,可以設定start,end記錄上一次區間的左右端點。

如果上一次區間的右端點,比新的區間的左端點還要大,但小於右端點,此時,上一次區間與新的區間可以合併,合併後的新區間的兩個端點是:[old_start,new_end]。

如果上一次區間的右端點,比新的區間的兩個端點還要大,舊區間自然包含了新的區間,不需要合併。

如果上一次區間的右端點,比新的區間的左端點還要小,由於已經按區間左端點排序,則舊區間不會再進行合併,記錄區間即可。

#include

using

namespace std;

#define pb push_back

#define mp make_pair

typedef pair<

int,

int> pii;

vector ans,res;

intmain()

sort

(ans.

begin()

,ans.

end())

;int start =

-1e9

;int end =

-1e9

;for

(auto it : ans)

else

// end < it.second才更新,否則可以直接不用管(前乙個範圍》it當前的範圍)

}else

if(end < it.second)

}//處理最後的區間

if(end !=

-1e9

&& start !=

-1e9

) cout << res.

size()

<<

"\n"

;return0;

}

AcWing 演算法基礎課 動態規劃

1 揹包問題 1 01揹包 每件物品僅用一次 可以做空間優化 dp j max dp j dp j v i w i 0,1揹包狀態均是從前一迴圈的狀態轉移 2 完全揹包 每件物品可以用無限次 完全揹包的狀態可以從當前迴圈的狀態轉移,進行優化 3 多重揹包 每件物品有不同的數量限制 可以對物品的數量限...

Acwing 基礎課 基礎演算法 歸併排序

參考鏈結 include const int n 100005 int a n int t n voidms int l,int r while i mid t k a i while j r t k a j for int i l i r i intmain 題目鏈結 參考鏈結 題目大意 給定乙個...

Acwing演算法基礎課知識點

知識點 基礎演算法 模板鏈結常用 模板1 基礎演算法 排序 二分高精度 字首和與差分 雙指標演算法 位運算離散化 區間合併 資料結構 模板鏈結常用 模板2 資料結構 鍊錶與鄰接表 樹與圖的儲存 棧與佇列 單調佇列 單調棧 kmptrie 並查集堆 hash表 c stl使用技巧 搜尋與圖論 模板鏈結...