class Block{
public:
typedef long long int ll;
Block(int _n){
n = _n;
//源值
value.assign(n + 1, 0);
//块和
sum.assign(n + 1, 0);
//附加值
add.assign(n + 1, 0);
//确定块大小
blen = pow(n, 0.33);
//分配块编号
idx.assign(n + 1, 0);
for (int i = 1; i <= n; i++){
idx[i] = (i - 1) / blen + 1;
}
}
ll fun(ll a, ll b){
return a ^ b;
}
void modfiy(int l, int r, ll v){
int len = min(idx[l] * blen, r);
//左边多出的
for (int i = l; i <= len; i++){
sum[idx[i]] -= fun(value[i], add[idx[i]]);
value[i] = fun(value[i],v);
sum[idx[i]] += fun(value[i], add[idx[i]]);
}
//右边多出的
if (idx[l] != idx[r]){
for (int i = (idx[r] - 1) * blen + 1; i <= r; i++){
sum[idx[i]] -= fun(value[i], add[idx[i]]);
value[i] = fun(value[i], v);
sum[idx[i]] += fun(value[i], add[idx[i]]);
}
}
//连续块
for (int i = idx[l] + 1; i < idx[r]; i++){
add[i] = fun(add[i],1);
sum[i] = blen - sum[i];
}
}
ll query(int l, int r){
ll len = min(idx[l] * blen, r), ans = 0;
//左边多出的
for (int i = l; i <= len; i++){
ans += fun(value[i], add[idx[i]]);
}
//右边多出的
if (idx[l] != idx[r]){
for (int i = (idx[r] - 1) * blen + 1; i <= r; i++){
ans += fun(value[i], add[idx[i]]);
}
}
//连续块
for (int i = idx[l] + 1; i < idx[r]; i++){
ans += sum[i];
}
return ans;
}
private:
vector<int> idx;
vector<ll> sum,value,add;
int n,blen;
};
分块练习模板
最新推荐文章于 2025-11-30 20:35:27 发布
文章介绍了一个名为ClassBlock的类,用于高效处理整数数组的异或操作、修改和查询。它利用分块技术优化计算,提高了数据结构的性能。
1094

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



