離散化例題 區間和

2022-07-23 08:39:10 字數 2256 閱讀 2208

802.區間和

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

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

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

輸入格式

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

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

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

輸出格式

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

資料範圍

−109≤x≤109−109≤x≤109,

1≤n,m≤1051≤n,m≤105,

−109≤l≤r≤109−109≤l≤r≤109,

−10000≤c≤10000−10000≤c≤10000

輸入樣例:

3 3

1 23 6

7 51 3

4 67 8

輸出樣例:
8

05

解體思路:

vector> alls存放所有離散化了的資料,前乙個intx軸上的下標,後乙個是值。 這裡不單單要存放插入的c,同時也要存搜尋的lr。使用了unordered_maphelper進行去重與累加。先向alls裡插入插入量,再插入lr,若兩值不再alls裡有,則插入鍵值對模擬數軸。

​ 之後只需要簡單的使用字首和降低時間複雜度從o(n^2)——>o(n)即可。

#include #include #include using namespace std;

typedef pairp;

int m, n;

//輔助map

unordered_maphelper;

//儲存所有值結構為 按照x從小到大排列 完成離散化

vectoralls;

//儲存所有查詢值vectorquerry;

void myquick_sort(vector& q, int l, int r)

}swap(q[r], q[i + 1]);

myquick_sort(q, l, i);

myquick_sort(q, i + 2, r);

}//二分查詢 若找不到,則得到序列中最接近v的值,這個值將比v大。當然若v比尾部的還要大,則返回尾部

int mybsearch(vector& q, int l, int r, int v)

// if (q[l].first != v) return l + 1;

return l;

}int main() 按照x從大到小的順序排序,v對應的是c

//進行插入

while (m--) );

else

}//讀入要求計算的值 並且把l,r也放入helpers second值為0 這一步很聰明,這樣就把插入位置,搜尋位置全部離散化了

while (n--) );

if (helper.find(l) == helper.end()) helper.insert();

if (helper.find(r) == helper.end()) helper.insert();

}alls.push_back();

//放入vector中

for (auto it = helper.begin(); it != helper.end(); it++)

//排序使用自己寫的快速排序a

myquick_sort(alls, 0, alls.size() - 1);

//將alls字首和化

for (auto italls = alls.begin() + 1; italls != alls.end(); italls++)

for (auto it = alls.begin(); it != alls.end(); it++)

for (auto it = querry.begin(); it != querry.end(); it++)

}

離散化 區間和

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

區間和 離散化

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

區間和 離散化

802.區間和 include include include using namespace std typedef pair int,int pii 定義二元組為 pii int n,m const int n 3e5 10 int a n s n vector int alls 儲存所有待離散...