离散化:
对于一些数,我们只需要知道它们之间的大小关系,而不需要知道他们的值相差多少
那么,对于一个数列1,50,666,8558555,9989898989而言
其实我们可以把他们看作1,2,3,4,5
他们的大小关系并没有发生改变
那么这个1,2,3,4,5就是上述原数组离散化后的id
离散化就是获取原数列的id,从而进行更方便的操作(比如建立线段树)
那么这个实现也并不困难
对于一个用vector存储的数组
我们只需要使用unique,lower_bound和erase就可以实现
当然也可以使用set来代替unique和erase,只是会额外地占用更多的空间
实现代码如下:
int main(){
vector<int> v = {1, 50, 666, 8598, 68414, 36, 57, 956,4,4,5,50,666};
vector<int> v2 = v;
sort(v.begin(), v.end());
//unique会去除相邻的重复元素,将它们放到数组后方,并返回去除后的无重复数组的最后一个元素的下一个地址
//erase会清除两个迭代器之间的元素
//通过这一步,就相当于我们把原数组排序并去重了
//这一步等价于把原数组里面的数一个一个地塞进set里
v.erase(unique(v.begin(), v.end()),v.end());
//去重以后,原本的数的离散化下标记就变成了他们的数组下标
for (int i = 0; i < v2.size();i++){
cout << lower_bound(v.begin(), v.end(), v2[i]) - v.begin()<<endl;
}
return 0;
}
矩阵快速幂:
矩阵之间的乘法具有结合性,因此,我们可以采用普通快速幂的思想,对矩阵进行快速幂运算

最低0.47元/天 解锁文章
186

被折叠的 条评论
为什么被折叠?



