懒更新|单点查询

lc1636

带懒标记的区间加法、乘法、单点查询的实现

++全局 add、mul 懒标记代替逐个修改元素++,append 时用费马小定理求逆元还原原值

查询时 O(1) 计算真实值

时间复杂度全操作 O(logMOD)

class Fancy {

static constexpr int MOD = 1'000'000'007;

vector<int> vals;

long long add = 0;

long long mul = 1;

long long pow(long long x, int n) {

long long res = 1;

for (; n; n /= 2) {

if (n % 2) {

res = res * x % MOD;

}

x = x * x % MOD;

}

return res;

}

public:

void append(int val) {

// 注意这里有减法,计算结果可能是负数,+MOD 可以保证计算结果非负

vals.push_back((val - add + MOD) * pow(mul, MOD - 2) % MOD);

}

void addAll(int inc) {

add = (add + inc) % MOD;

}

void multAll(int m) {

mul = mul * m % MOD;

add = add * m % MOD;

}

int getIndex(int idx) {

if (idx >= vals.size()) {

return -1;

}

return (vals[idx] * mul + add) % MOD;

}

};

相关推荐
汀、人工智能5 小时前
03 - 运算符
数据结构·算法·数据库架构·位运算·哈希表·03 - 运算符
小肝一下5 小时前
每日两道力扣,day4
c++·算法·leetcode·职场和发展
菜鸟‍5 小时前
【论文学习】Disco:基于邻接感知协同着色的密集重叠细胞实例分割方法
人工智能·学习·算法
牧天白衣.5 小时前
力扣215.数组中的第K个最大元素
算法·leetcode
cxr8285 小时前
控制理论基础
人工智能·算法
平平淡淡才是true5 小时前
偏序关系、哈斯图、最长链长度、最长链条数
算法
小钊(求职中)5 小时前
算法知识、常用方法总结
java·算法·排序算法·力扣
paeamecium5 小时前
【PAT甲级真题】- Talent and Virtue (25)
数据结构·c++·算法·pat
Mr_Xuhhh5 小时前
蓝桥杯复习清单真题(C++版本)
c++·算法·蓝桥杯
tankeven5 小时前
HJ163 时津风的资源收集
c++·算法