区间和---使用离散化

假定有一个无限长的数轴,数轴上每个坐标上的数都是 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;
}
posted @ 2024-10-31 19:40  _l_x_y  阅读(0)  评论(0编辑  收藏  举报