Acwing 802 區間和(離散化)

2021-09-25 00:10:52 字數 1300 閱讀 3440

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

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

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

輸入格式

第一行包含兩個整數n和m。

接下來 n 行,每行包含兩個整數x和c。

再接下裡 m 行,每行包含兩個整數l和r。

輸出格式

共m行,每行輸出乙個詢問中所求的區間內數字和。

資料範圍

−109≤x≤109,

1≤n,m≤105,

−109≤l≤r≤109,

−10000≤c≤10000

輸入樣例:

3 31 2

3 67 5

1 34 6

7 8輸出樣例:80

5思路:把範圍位1e9的資料對映在1e5區間內,每次二分查詢下標,進行操作。

#include

#include

#include

using namespace std;

const int n

=300010

;vector

> add,query;

//分別儲存插入和詢問資訊

vector a;

//儲存出現的所有資料

int sum[n]

;//字首和

int num[n]

;//離散化後各位置對應的值

int find

(int x)

//查詢下標

return r+1;

//為了求字首和方便

}int main()

);}for

(int i=

0;i;}

sort

(a.begin()

,a.end()

);a.

erase

(unique

(a.begin()

,a.end()

),a.

end())

;//去重 for

(auto x:add

)for

(int i=

1;i<=a.

size()

;i++

) sum[i]

=sum[i-1]

+num[i]

;for

(auto x:query

)return0;

}

acwing802 區間和 離散化

acwing802.區間和 離散化就是乙個對映的過程,將資料變得緊湊,便於處理。模板如下 vector int alls 儲存所有待離散化的值 sort alls.begin alls.end 將所有值排序 alls.erase unique alls.begin alls.end alls.end...

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 表示乙個區間的兩個端點。輸出格式 輸出乙個整數,表示所需的點的最小數量。...