分块

分块

数据:

const int maxn=1e5+5;
int a[maxn];
const int maxb=500;
int blo,belo[maxn],laz[maxb];
vector 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[]来进行整块区间的加减操作。

你可能感兴趣的:(分块)