假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。
现在,我们首先进行n次操作,每次操作将某一位置 x 上的数加 c 。
接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r]之间的所有数的和。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector< int > alls;
vector <pair<int , int>> add, query;
int a[300010] , b[300010];
int find(int x){
int l = 0 , r = alls.size() - 1;
while(l < r){
int mid = (l + r) >> 1;
if(x > alls[mid]) l = mid + 1;
else r = mid;
}
return r + 1;
}
int main(){
int n , m ;
cin >> n >> m;
for(int i = 0 ; i < n ; i ++){
int x , c;
cin >> x >> c;
add.push_back({x , c});
alls.push_back(x);
}
for(int i = 0 ; i < m ; i ++){
int l , r;
cin >> 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 x = find(item.first);
a[x] += item.second;
}
for(int i = 1 ; i < 300010 ; i ++) b[i] = a[i] + b[i - 1];
for(auto item : query){
int l = find(item.first);
int r = find(item.second);
cout << b[r] - b[l - 1] << endl;
}
return 0;
}
标签:离散,int,back,mid,---,item,alls,push,区间
From: https://www.cnblogs.com/lxy54/p/18518726