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
存放所有離散化了的資料,前乙個int是x軸上的下標,後乙個是值。 這裡不單單要存放插入的c,同時也要存搜尋的l和r。使用了unordered_maphelper
進行去重與累加。先向alls裡插入插入量,再插入l和r,若兩值不再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 儲存所有待離散...