分块
分块
数据:
const int maxn=1e5+5;
int a[maxn];
const int maxb=500;
int blo,belo[maxn],laz[maxb];
vector<int> b[maxb];
初始化:
int n; cin>>n;
blo=sqrt(n);
for(int i=1;i<=n;++i){
belo[i]=(i-1)/blo+1;
cin>>a[i];
b[belo[i]].push_back(a[i]);
}
区间查询:
int query(int l,int r){
int ans=0;
for(int i=l;i<=min(belo[l]*blo,r);++i)
;//操作
if(belo[l]!=belo[r]){
for(int i=(belo[r]-1)*blo+1;i<=r;++i)
;//操作
}
for(int i=belo[l]+1;i<=belo[r]-1;++i)
;//操作
return ans;
}
区间更新和区间查询差不多,有些时候需要用一个laz[]
来进行整块区间的加减操作。
CAD加油!欢迎跟我一起讨论学习算法,QQ:1401650042