手动离散化の模板

不会用 stl 的 Frocean 看见别人用一行 unique 解决离散化 感觉好厉害

但为什么打主席树别人 unique 能 100 分 而我的只有 20 分 啊......

但是就是不想学 =-=

于是自己打了个 手动的 离散化 当然 sort 还是要用一下的啦哈哈哈哈.......

费时间 费空间 岂不美哉

下放代码

//不带去重的
int v[MAXN],newv[MAXN],n;
short cmp(int x,int y) {return v[x] < v[y];}
int main()
{
	scanf("%d",&n); for (int a = 1 ; a <= n ; ++ a)
	scanf("%d",&v[a]),newv[a] = a;
	sort(newv + 1,newv + n + 1,cmp);
	return 0;
}

//可以去重的(丑死了)
struct Discretization {
	int value,rank;
} s[MAXN];
int cpy[MAXN],n;
short cmpto(Discretization x,Discretization y)
{
	return x.value < y.value;
}
short cmpback(Discretization x,Discretization y)
{
	return x.rank < y.rank;
}
int main()
{
	scanf("%d",&n); for (int a = 1 ; a <= n ; ++ a)
	scanf("%d",&s[a].value),s[a].rank = a;
	sort(s + 1,s + n + 1,cmpto);
	for (int a = 1 ; a <= n ; ++ a) cpy[a] = s[a].value;
	for (int a = 1 ; a <= n ; ++ a)
		if (cpy[a] == cpy[a - 1]) s[a].value = s[a - 1].value;
		else s[a].value = s[a - 1].value + 1;
	sort(s + 1,s + n + 1,cmpback);
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值