zoukankan      html  css  js  c++  java
  • 【LibreOJ 6280】 数列分块入门 4 (分块)

    题目:传送门

    听说用define会使代码简洁qwq
    code:

    //By Menteur_Hxy
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<set>
    #define ll long long
    #define f(A,B,C) for(int A=B;A<=C;A++)
    #define minn(a,b) (a>b?b:a) //一定要记得加括号 
    using namespace std;
    
    ll rd() {
        ll x=0,fla=1; char c=' ';
        while(c>'9'|| c<'0') {if(c=='-') fla=-fla; c=getchar();}
        while(c<='9'&&c>='0') x=x*10+c-'0',c=getchar();
        return x*fla;
    }
    
    const int MAX=100005;
    const int INF=0x3f3f3f3f;
    int n,blo;
    ll v[MAX],bl[MAX],tag[MAX],sum[MAX];
    
    void add(int a,int b,int c) {
        f(i,a,minn(bl[a]*blo,b)) v[i]+=c,sum[bl[a]]+=c;
        if(bl[a]!=bl[b]) 
            f(i,(bl[b]-1)*blo+1,b) v[i]+=c,sum[bl[b]]+=c;
        f(i,bl[a]+1,bl[b]-1) tag[i]+=c;
    }
    
    ll query(int a,int b) {
        ll ans=0;
        f(i,a,minn(bl[a]*blo,b)) ans+=v[i]+tag[bl[a]];
        if(bl[a]!=bl[b]) 
            f(i,(bl[b]-1)*blo+1,b) ans+=v[i]+tag[bl[b]];
        f(i,bl[a]+1,bl[b]-1) ans+=sum[i]+blo*tag[i]; // 注意tag一定要乘上blo
        return ans; 
    }
    
    int main() {
        n=rd(); blo=sqrt(n);
        f(i,1,n) v[i]=rd();
        f(i,1,n) {
            bl[i]=(i-1)/blo+1;
            sum[bl[i]]+=v[i];
        }
        f(i,1,n) {
            int opt=rd(),a=rd(),b=rd(),c=rd();
            if(opt) printf("%lld
    ",(ll)query(a,b)%(c+1));
            else add(a,b,c);
        }
        return 0;
    }
    版权声明:本文为博主原创文章,未经博主允许不得转载。 博主:https://www.cnblogs.com/Menteur-Hxy/
  • 相关阅读:
    [NM]打开NetworkManager和wpa_supplicant的DEBUG接口
    TI am335x am437x PRU
    Ansible and FileBeta
    [gpio]devm_gpiod_get_optional用法
    TCP连接
    STM32云平台连接培训20180814
    select理解
    TypeScript躬行记(1)——数据类型
    React躬行记(15)——React Hooks
    React躬行记(14)——测试框架
  • 原文地址:https://www.cnblogs.com/Menteur-Hxy/p/9247987.html
Copyright © 2011-2022 走看看