离散化的两种操作

离散化的常见操作

一种所有情况都适用,排一次序然后for循环lower_bound一遍 O(2nlogn) ≈ O(nlogn),另一种只适用于没有重复元素的情况,但只有一个排序的复杂度O(nlogn),而且简单好写。

#include 
using namespace std;
const int N = 1e5+7;
int a[N],b[N],n,m;
bool cmp(int x,int y)
{
	return a[x] < a[y];
}
int main()
{
/*
	第一种离散化 适合所有情况 
	scanf("%d",&n);
	for(int i = 1; i <= n; i++)
	{
		scanf("%d",&a[i]);
		b[i] = a[i];
	}
	sort(a+1,a+n+1);
	int len = unique(a+1,a+n+1)-a-1;
	for(int i = 1; i <= n; i++)
		b[i] = lower_bound(a+1,a+len+1,b[i])-a;
		
	b是离散化后的数组 
	for(int i = 1; i <= n; i++)
		printf("%d ",b[i]);
	return 0;
	
	第二种离散化 只适合没有重复元素的情况 
*/	scanf("%d",&n);
	for(int i = 1; i <= n; i++)
	{
		scanf("%d",&a[i]);
		b[i] = i;
	}
	sort(b+1,b+n+1,cmp);
	for(int i = 1; i <= n; i++)
		a[b[i]] = i;
	for(int i = 1; i <= n; i++)
		printf("%d ",b[i]);
	return 0;
}

你可能感兴趣的:(小技巧)