1. 程式人生 > >數列分塊入門1~9 loj6277~6285

數列分塊入門1~9 loj6277~6285

math block == post include main name tdi lin

hzwer的講解

給出一個長為 \(n\) 的數列,以及 \(n\) 個操作,操作涉及區間加法,單點查值。

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int n, a[50005], opt, uu, vv, ww, tag[305], blc, bel[50005];
void add(int uu, int vv, int ww){
    int p=bel[uu], q=bel[vv];
    if(p==q)
        for(int i=uu; i<=vv; i++)
            a[i] += ww;
    else
{ for(int i=p+1; i<=q-1; i++) tag[i] += ww; for(int i=uu; i<=bel[uu]*blc; i++) a[i] += ww; for(int i=(bel[vv]-1)*blc+1; i<=vv; i++) a[i] += ww; } } int main(){ cin>>n; blc = sqrt(n); for(int i=1; i<=n; i++) scanf("%d", &a[i]); for
(int i=1; i<=n; i++) bel[i] = (i - 1) / blc + 1; for(int i=1; i<=n; i++){ scanf("%d %d %d %d", &opt, &uu, &vv, &ww); if(!opt) add(uu, vv, ww); else printf("%d\n", a[vv]+tag[bel[vv]]); } return 0; }

數列分塊入門1~9 loj6277~6285