站外题求助
  • 板块灌水区
  • 楼主GuideZombies
  • 当前回复8
  • 已保存回复8
  • 发布时间2020/10/24 17:37
  • 上次更新2023/11/5 09:59:24
查看原帖
站外题求助
253527
GuideZombies楼主2020/10/24 17:37

假定有一个无限长的数轴,数轴上每个坐标上的数都是0。

现在,我们首先进行 nn 次操作,每次操作将某一位置xx上的数加cc

接下来,进行 mm 次询问,每个询问包含两个整数llrr,你需要求出在区间[ll, rr]之间的所有数的和。

输入格式

第一行包含两个整数nnmm

接下来 nn 行,每行包含两个整数xxcc

再接下里 mm 行,每行包含两个整数llrr

输出格式

共m行,每行输出一个询问中所求的区间内数字和。

数据范围

−109≤xx≤109, 1≤nn,mm≤105, −109≤llrr≤109, −10000≤cc≤10000

输入样例:

3 3
1 2
3 6
7 5
1 3
4 6
7 8

输出样例:

8
0
5

这是我的代码:

#include<bits/stdc++.h>
using namespace std;
vector<int>Spot;
queue<pair<int,int>>Team;
unordered_map<int,int>Axis;
int cnt,n,m,p[1000001],x[100001],c[100001],a[100001],l,r;
int Discretization(int x){//离散化
    if(!Axis.count(x)){
        cnt++;
        Axis[x]=cnt;
    }return Axis[x];
}bool cmp(int i,int j){return i<j;}//排序函数
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>x[i]>>c[i];
        Spot.push_back(x[i]);
    }for(int i=1;i<=m;i++){
        cin>>l>>r;
        Team.push({l,r});
        Spot.push_back(l);
        Spot.push_back(r);
    }sort(Spot.begin(),Spot.end(),cmp);
    for(int i=1;i<=Spot.size();i++) Discretization(Spot[i]);
    for(int i=1;i<=n;i++){//计算前缀和
        int k=Discretization(x[i]);
        a[k]+=c[i];
    }for(int i=1;i<=cnt;i++) p[i]=p[i-1]+a[i];
    for(int i=1;i<=m;i++){
        pair<int,int>section;
        section=Team.front();
        Team.pop();
        cout<<p[Discretization(section.second)]-p[Discretization(section.first)-1]<<endl;
    }return 0;
}
2020/10/24 17:37
加载中...