题目描述:
假定有一个无限长的数轴,数轴上每个坐标上的数都是0。
现在,我们首先进行 n 次操作,每次操作将某一位置x上的数加c。
近下来,进行 m 次询问,每个询问包含两个整数l和r,你需要求出在区间[l, r]之间的所有数的和。
输入格式
第一行包含两个整数n和m。
接下来 n 行,每行包含两个整数x和c。
再接下里 m 行,每行包含两个整数l和r。
输出格式
共m行,每行输出一个询问中所求的区间内数字和。
数据范围
−109≤x≤109,
1≤n,m≤10^5,
−109≤l≤r≤109,
−10000≤c≤10000
输入样例:
oj题库
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int s[300005], a[300005];
struct p
{
int a, b;
};
vector<int>pp;
vector<p> add, qr;
int find(int x)
{
int l = 0, r = pp.size() - 1;
while (l < r)
{
int mid = l + r >> 1;
if (pp[mid] <= x)l = mid + 1;
else r = mid;
}
return r + 1;
}
int main(void)
{
int m, n; cin >> m >> n;
for (int i = 1; i <= m; i++)
{
int a, b; cin >> a >> b;
pp.push_back(a);
add.push_back({ a,b });
}
for (int i = 1; i <= n; i++)
{
int a, b; cin >> a >> b;
pp.push_back(a);
pp.push_back(b);
qr.push_back({ a,b });
}
sort(pp.begin(), pp.end());
pp.erase(unique(pp.begin(), pp.end()),pp.end());
for (auto it : add)
{
int x = find(it.a);
s[x] += it.b;
}
for (int i = 1; i <= pp.size(); i++)a[i] += a[i - 1] + s[i];
for (auto it : qr)
cout << a[find(it.b)] - a[find(it.a) - 1] << endl;
return 0;
}
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
using namespace std;
int c[100005],m,n,bb[100005];
int l;
struct pp
{
int a, b;
}s[1000005];
pp ss[1000005];
int low(int x)
{
return x & -x;
}
void up(int x,int cc)
{
while (x <= l)
{
c[x] += cc;
x += low(x);
}
}
int sum(int x)
{
int ans = 0;
while (x > 0)
{
ans += c[x];
x -= low(x);
}return ans;
}
int main(void)
{
cin >> m >> n; int num = 0;
for (int i = 1; i <= m; i++)
{
scanf_s("%d%d", &s[i].a, &s[i].b);
bb[++num] = s[i].a;
}
for (int i = 1; i <= n; i++)
{
scanf_s("%d%d", &ss[i].a, &ss[i].b);
bb[++num] = ss[i].a;
bb[++num] = ss[i].b;
}
sort(bb + 1, bb + num + 1);//排序后才可以去重
l = unique(bb + 1, bb + num + 1) - bb-1;
for (int i = 1; i <= m; i++)
{
int x = lower_bound(bb + 1, bb + l + 1, s[i].a)-bb;
up(x,s[i].b);
}
for (int i = 1; i <= n; i++)
{
int x = lower_bound(bb + 1, bb + l + 1, ss[i].a) - bb;//里面自带的二分查找不需要自己写
int y= lower_bound(bb + 1, bb + l + 1, ss[i].b) - bb;
cout << sum(y) - sum(x - 1) << endl;
}
return 0;
}