关于离散化+小Trick

离散化

干嘛用的不多说。

你不会去问度娘吗

板板

经常忘又懒得找。遂写一模板暂存。

//a为原数组,b为a的副本
void version1(){
	sort(b+1,b+1+n);
	int siz=unique(b+1,b+1+n)-b-1;

	for(int i=1,k;i<=n;i++)
		a[i]=lower_bound(b+1,b+1+siz,a[i])-b;
}


unordered_map<int,int> mp;
void version2(){
	int cnt=0;

	for(int i=1;i<=n;i++){
		if(mp.find(a[i])==mp.end())
			mp[a[i]]=++cnt;
		
		a[i]=mp[a[i]];
	}
}

Trick

直接离散化会导致本不连续的值连续,有两种解决方法。

法一:

离散化的时候把每个值+1放到离散化数组里,这样原本不连续的数离散化后也不连续。

法二:

这种方法常数会小一些。

记录一下离散化数组中每个数是否和前一个数一样,如果离散化用的数组叫做 lsh,令 difi=[lshi=lshi1] ,求出 dif 的前缀和 bloi,那么 bloi 相同的数就是在一个连续块里的。

fi=[bloai=bloai1](也就是这一位是否和前一位在一个连续块里),再用一个树状数组维护 f 的前缀和,就可以快速查询一个区间内的所有值是否都在同一个连续块里。

内心OS:感觉没人会为了离散化而单独写一个树状数组吧...

posted @   Elaina_0  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示