原题链接:区间和
由于数据范围很大,但是输入的询问和插入的值较少,如果开数组开不下,即使能开下也会造成巨大的浪费,这里选择离散化,将输入的数组下标存入vector,将数组下标映射到另外一个下标,比如1,5000,1000000,20000000,
这四个数之间的距离非常大,如果用长达200000000的数组仅仅存储4个数,浪费很大。下面是代码:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 300000 + 5;
int num[maxn], prefix[maxn];
typedef pair<int, int>PII;
vector<int>alls;
vector<PII>add, query;
int find(int x)
{
int l = 0, mid,r = alls.size()-1;
while (l > r)
{
mid = (l + r) >> 1;
if (alls[mid] >= x)
{
mid = r;
}
else
{
l = mid + 1;
}
}
return l + 1;
}
int main(void)
{
int n, m;
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++)
{
int x, c;
scanf("%d %d", &x, &c);
add.push_back({ x,c });
alls.push_back(x);
}
for (int i = 0; i < m; i++)
{
int l, r;
scanf("%d %d", &l, &r);
query.push_back({ l,r });
alls.push_back(l);
alls.push_back(r);
}
sort(alls.begin(), alls.end());
alls.erase(unique(alls.begin(), alls.end()), alls.end());
for (auto item : add)
{
int index = find(item.first);
num[index] += item.second;
}
for (int i = 0; i <= alls.size(); i++)
{
prefix[i] = prefix[i - 1] + num[i];
}
for (auto item : query)
{
int l = item.first;
int r = item.second;
cout << prefix[r] - prefix[l - 1] << endl;
}
return 0;
}