题目描述
模板题:区间和(用离散化来做)
C++代码
#include <bits/stdc++.h>
#include <vector>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N = 300010;
int n, m, c, x, l, r;
int a[N], s[N];
vector<int> alls; //存储所有的索引值,包括x、l、r
vector<PII> adds;
vector<PII> querys;
int find(int x){ //找到alls中的x,获取其索引+1(映射为a中的索引存储)
int l = 0, r = alls.size() - 1;
while(l < r){
int mid = l + r >> 1;
if(alls[mid] >= x)
r = mid;
else
l = mid + 1;
}
return l + 1; //因后续使用前缀和,所以这里返回索引+1
}
int main(){
cin >> n >> m;
while(n--){
cin >> x >> c;
alls.push_back(x);
adds.push_back({x, c});
}
while(m--){
cin >> l >> r;
alls.push_back(l);
alls.push_back(r);
querys.push_back({l, r});
}
sort(alls.begin(), alls.end()); // 将所有值排序
alls.erase(unique(alls.begin(), alls.end()), alls.end()); // 去掉重复元素
for(auto item : adds){
x = find(item.first);
a[x] += item.second;
}
for(int i = 1; i <= alls.size(); i++)
s[i] += s[i - 1] + a[i]; //前缀和
for(auto item : querys){
l = find(item.first);
r = find(item.second);
cout << s[r] - s[l - 1] << endl;
}
return 0;
}