离散化,矩阵快速幂,广义矩阵乘法

离散化:

对于一些数,我们只需要知道它们之间的大小关系,而不需要知道他们的值相差多少
那么,对于一个数列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;
}

矩阵快速幂:

矩阵之间的乘法具有结合性,因此,我们可以采用普通快速幂的思想,对矩阵进行快速幂运算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值