AcWing 802. 区间和
- 离散化就是使用更少的下标来表示一部份数
- // 例如:1,3,5
// 离散化前:0,1,2,3,4,5
// 离散化后:0,1,2 - 注意去重方法:先排序在去重,sort, unique, erase
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 3*(1e5 + 10);
int a[N];
vector<int> index_map;
vector<pair<int, int>> add, qry;
int find_index(int key)
{
int l = 0, r = index_map.size() - 1;
while(l < r)
{
int mid = (r - l) / 2 + l + 1;
if(index_map[mid] > key)
r = mid - 1;
else
l = mid;
}
return l + 1;
}
int main()
{
int m, n;
cin >> m >> n;
int x, c;
for(int i = 0; i < m; ++i)
{
cin >> x >> c;
index_map.push_back(x);
add.push_back(make_pair(x, c));
}
int l, r;
for(int i = 0; i < n; ++i)
{
cin >> l >> r;
qry.push_back(make_pair(l, r));
index_map.push_back(l);
index_map.push_back(r);
}
sort(index_map.begin(), index_map.end());
index_map.erase(unique(index_map.begin(), index_map.end()), index_map.end());
for(auto &p : add)
{
int micro_index = find_index(p.first);
a[micro_index] += p.second;
}
for(int i = 1; i <= index_map.size(); ++i)
{
a[i] = a[i - 1] + a[i];
}
for(auto &p : qry)
{
int x1 = find_index(p.first), x2 = find_index(p.second);
cout << a[x2] - a[x1 - 1] << endl;
}
return 0;
}