离散化的后续

↑惯例Mark大神的博客
 bzoj3289:Mato的文件管理
线段树求逆序对+莫队,但是数据量50000却没有给出范围,既然求逆序对,那么我们关注的只是数据之间的相对大小,此时我们可以把这50000个数据进行简化...嗯看大神的博客就明白了不需要多解释什么了..
 
下面是博客中未授权截取的大神的代码板子....不过都是自己看应该也没什么吧.....
1 sort(sub_a,sub_a+n);
2 int size=unique(sub_a,sub_a+n)-sub_a;//size为离散化后元素个数
3 for(i=0;i<n;i++)
4     a[i]=lower_bound(sub_a,sub_a+size,a[i])-sub_a + 1;//k为b[i]经离散化后对应的值
View Code
lower_bound上一篇刚好记录过了,下面是unique的用法....
http://www.cnblogs.com/heyonggang/archive/2013/08/07/3243477.html
↑unique+unique_copy,用前记得sort把相同的数据排到一起
unique(,)就和sort(,)里放的东西差不多...返回的是一个地址所以要-数组名,个人习惯一般从1开始赋值的所以还要-1....
"调用unique'删除'了相邻的重复值.
给'删除'加上引号是因为unique实际上并没有删除任何元素;
而是将无重复的元素复制到序列的前段,从而覆盖相邻的重复元素."

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
    int a[50]={};
    a[1]=1;
    a[2]=2;
    a[3]=2;
    a[4]=5;
    a[5]=5;
    a[6]=6;
    cout<<unique(a+1,a+6+1)-a-1<<endl;
    cout<<endl;
    for(int i=1;i<=6;i++){
        cout<<a[i]<<endl;
    }
    return 0;
}
View Code
以上代码输出为
4
1
2
5
6
5
6
序列若为1 2 5 5 6 6

输出则为4 1 2 5 6 6 6
stl真是好东西,感动
 
posted @ 2017-11-04 16:45  鲸头鹳  阅读(112)  评论(0编辑  收藏  举报