AcWing模板题:https://www.acwing.com/problem/content/804/
1 #include<iostream> 2 #include<vector> 3 #include<algorithm> 4 using namespace std; 5 int n,m; 6 const int N=3e5+10; 7 vector<int>all; 8 vector<pair<int,int>> add; 9 vector<pair<int,int>>query; 10 int a[N],s[N]; 11 int find(int x){ 12 //找到目标数x离散化之后的数 13 int l=0,r=all.size()-1; 14 while(l<r){ 15 int mid=l+r>>1; 16 if(all[mid]>=x){ 17 r=mid; 18 }else{ 19 l=mid+1; 20 } 21 } 22 return l+1;//目的是让离散化之后的下标从1开始 23 } 24 int main(void){ 25 cin>>n>>m; 26 for(int i=0;i<n;i++){ 27 int x,c; 28 cin>>x>>c; 29 add.push_back({x,c}); 30 all.push_back(x); 31 } 32 for(int i=0;i<m;i++){ 33 int l,r; 34 cin>>l>>r; 35 query.push_back({l,r}); 36 all.push_back(l); 37 all.push_back(r); 38 } 39 40 sort(all.begin(),all.end()); 41 all.erase(unique(all.begin(),all.end()) ,all.end() ); 42 //去重 43 for(int i=0;i<n;i++){ 44 int x=add[i].first; 45 int c=add[i].second; 46 a[find(x)]+=c; 47 } 48 //处理原数组 49 for(int i=1;i<=all.size();i++){//all.size()是总数目,必须小于等于,同样也可以换成3e5+9 50 s[i]=s[i-1]+a[i]; 51 } 52 //处理前缀和 53 for(int i=0;i<m;i++){ 54 int l=find(query[i].first); 55 int r=find(query[i].second); 56 cout<<s[r]-s[l-1]<<endl; 57 } 58 return 0; 59 }