码迷,mamicode.com
首页 > 其他好文 > 详细

数列分块入门1~9 loj6277~6285

时间:2018-02-23 23:46:17      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:oid   mes   inline   ret   can   区间   +=   log   i++   

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

标签:oid   mes   inline   ret   can   区间   +=   log   i++   

原文地址:https://www.cnblogs.com/poorpool/p/8463599.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!