题目https://www.acwing.com/problem/content/804/
- 离散化看起来简单,实际上手写会发现如果思路不清晰很容出问题。
- 这道题首先将要添加的n个数和m个询问分别用pair存到vector中,然后将所有坐标存到vector中,去重后将待插入元素按照vector中映射的位置存到数组a中,并用s数组求前缀和。
- 那么怎么快速找到某个数在vector中映射的位置呢?答案是二分
- 最关键的一点还是理解将所有坐标离散化的含义。
比着代码打一遍差不多就理解了hhh
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
const int N=3e5+10;
typedef long long ll;
typedef pair<int,int> PII;
int n,m;
int a[N],s[N];
vector<int>alls;
vector<PII>add,query;
int find(int x)
{
int l=0,r=alls.size()-1;
while(l<r)
{
int mid=l+r>>1;
if(alls[mid]>=x)r=mid;
else l=mid+1;
}
return l+1;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;++i)
{
int x,c;
scanf("%d%d",&x,&c);
alls.push_back(x);
add.push_back({x,c});
}
for(int i=0;i<m;++i)
{
int l,r;
scanf("%d%d",&l,&r);
alls.push_back(l),alls.push_back(r);
query.push_back({l,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<=alls.size();++i)s[i]=s[i-1]+a[i];
for(auto item:query)
{
int l=find(item.first),r=find(item.second);
printf("%d\n",s[r]-s[l-1]);
}
return 0;
}