离散化(模板)

所谓离散化是指,原本一个很大的数据范围,映射后在一个很小的区间

802. 区间和

在这里插入图片描述

思路

在这里插入图片描述

1.首先将所有数的下标存在一个数组 alls 中
2.把需要查询区间范围也存入 alls ,然后去重排序
3.根据插入的数据,把该值映射进一个数组
4.利用前缀和,求区间的范围

简言之,就是把所有需要用到的数组下标存起来,把下标和值映射进一个数组。相比于传统写法就节省了很多空间

源码

#include<bits/stdc++.h>

using namespace std;

typedef pair<int,int> PII;
const int N=1000010;
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 r+1;
} 

int main(){
	cin>>n>>m;
	
	for(int i=0;i<n;i++){
		int x,c;
		cin>>x>>c;
		add.push_back({x,c});//存入需要插入的数,用于接下的 add操作
		
		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(vector<PII>::iterator item=add.begin();item!=add.end();item++){
	 	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(vector<PII>::iterator item=query.begin();item!=query.end();item++){
		int l=find(item->first),r=find(item->second);
		cout<<s[r]-s[l-1]<<endl; //输出区间和
	}
	return 0;
} 



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ღ江晚吟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值