离散化的后续
↑惯例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]经离散化后对应的值
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; }
以上代码输出为
4
1
2
5
6
5
6
序列若为1 2 5 5 6 6
输出则为4 1 2 5 6 6 6
stl真是好东西,感动