acwing802 區間和 離散化

2021-10-04 23:12:26 字數 1983 閱讀 4517

acwing802.區間和

離散化就是乙個對映的過程,將資料變得緊湊,便於處理。

模板如下

vector<

int> alls;

// 儲存所有待離散化的值

sort

(alls.

begin()

, alls.

end())

;// 將所有值排序

alls.

erase

(unique

(alls.

begin()

, alls.

end())

, alls.

end())

;// 去掉重複元素

// 二分求出x對應的離散化的值

intfind

(int x)

// 找到第乙個大於等於x的位置

return r +1;

// 對映到1, 2, ...n}/

1.讀入資料:注意要把查詢區間的端點也讀入alls中,不然查詢的時候找不到這些點

2.排序去重:因為要進行二分查詢所以排序,因為可能會存在重複的端點,但是有的端點是沒有值的,這會影響接下來求字首和,因此要去重。

3.處理新增:a陣列是對映陣列,下標就是原陣列對映過來的值+1(為了便於處理字首和),a陣列的值就是對應原陣列的值

4.處理詢問:利用find函式找到詢問端點在對映陣列中的下標,然後再利用字首和即可!

#include

#include

#include

using

namespace std;

typedef pair<

int,

int> pii;

const

int n =

300010

;int a[n]

, s[n]

;int n , m;

vector<

int> alls;

vector add , query;

//二分查詢大於等於x的數中最小的那個

intfind

(int x)

return r +1;

}int

main()

);alls.

push_back

(x);

}for

(int i =

0; i < m ; i++))

; alls.

push_back

(l);

alls.

push_back

(r);

}//排序、去重

sort

(alls.

begin()

, alls.

end())

; alls.

erase

(unique

(alls.

begin()

, alls.

end())

, 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)

}

Acwing 802 區間和(離散化)

假定有乙個無限長的數軸,數軸上每個座標上的數都是0。現在,我們首先進行 n 次操作,每次操作將某一位置x上的數加c。近下來,進行 m 次詢問,每個詢問包含兩個整數l和r,你需要求出在區間 l,r 之間的所有數的和。輸入格式 第一行包含兩個整數n和m。接下來 n 行,每行包含兩個整數x和c。再接下裡 ...

poj 2528 區間改動 離散化

題意 有乙個黑板上貼海報。給出每乙個海報在黑板上的覆蓋區間為l r,問最後多少個海報是可見的。題解 由於l r取值到1e7,肯定是要離散化的,但普通的離散化會出問題。比方 1,10 1,4 6,10 普通得到答案是2,但事實上是3。改進的離散化方法假設兩個數字相差大於1,就在中間補乙個數字。incl...

Acwing 905 區間選點

給定n個閉區間 ai,bi 請你在數軸上選擇盡量少的點,使得每個區間內至少包含乙個選出的點。輸出選擇的點的最小數量。位於區間端點上的點也算作區間內。輸入格式 第一行包含整數n,表示區間數。接下來n行,每行包含兩個整數ai,bi 表示乙個區間的兩個端點。輸出格式 輸出乙個整數,表示所需的點的最小數量。...