zoukankan      html  css  js  c++  java
  • [LOJ] 分块九题 5

    区间开平方,区间查询。

    lazy标记改为区间是否全是1或者0,这样的区间是没有更新价值的。

    //Stay foolish,stay hungry,stay young,stay simple
    #include<iostream>
    #include<cmath>
    #include<cstdio>
    #include<cctype>
    #define sq(x) (floor(sqrt(x)))
    using namespace std;
    
    const int MAXN=500005;
    
    inline int read_d(){
        int ret=0,op=1;char c;
        while(c=getchar(),!isdigit(c))op=c=='-'?-1:1;
        while(isdigit(c)){
            ret=ret*10+c-'0';
            c=getchar();
        }
        return ret*op;
    } 
    
    int n;
    int sum[MAXN],a[MAXN];
    bool lazy[MAXN];
    int l[MAXN],r[MAXN],bl[MAXN];
    int block,num;
    void build(){
        block=sqrt(n);
        num=n/block;
        if(n%block) num++;
        for(int i=1;i<=n;i++){
            l[i]=(i-1)*block+1;
            r[i]=i*block;
            bl[i]=(i-1)/block+1;
            sum[bl[i]]+=a[i];
        }
    }
    
    void updata_block(int id){
        lazy[id]=1;sum[id]=0;
        for(int i=l[id];i<=r[id];i++){
            if(a[i]>=2) lazy[id]=0;
            a[i]=sq(a[i]);
            sum[id]+=a[i];
        }
    }
    
    void updata(int x,int y){
        if(bl[x]==bl[y]){
            if(lazy[bl[x]]) return;
            for(int i=x;i<=y;i++){
                sum[bl[i]]-=a[i];
                a[i]=sq(a[i]);
                sum[bl[i]]+=a[i];
            }
            return;
        }
        for(int i=x;i<=r[bl[x]];i++){
            sum[bl[i]]-=a[i];
            a[i]=sq(a[i]);
            sum[bl[i]]+=a[i];
        }
        for(int i=l[bl[y]];i<=y;i++){
            sum[bl[i]]-=a[i];
            a[i]=sq(a[i]);
            sum[bl[i]]+=a[i];
        }
        for(int i=bl[x]+1;i<=bl[y]-1;i++){
            if(lazy[i]) continue;
            updata_block(i);
        }
    }
    
    int query(int x,int y){
        int ret=0;
        if(bl[x]==bl[y]){
            for(int i=x;i<=y;i++) ret+=a[i];
            return ret;
        }
        for(int i=x;i<=r[bl[x]];i++) ret+=a[i];
        for(int i=l[bl[y]];i<=y;i++) ret+=a[i];
        for(int i=bl[x]+1;i<=bl[y]-1;i++) ret+=sum[i];
        return ret;
    }
    
    int main(){
        n=read_d();
        for(int i=1;i<=n;i++) a[i]=read_d();
        build();
        for(int i=1;i<=n;i++){
            int q=read_d(),x=read_d(),y=read_d(),z=read_d();
            if(q==0) updata(x,y);
            else printf("%d
    ",query(x,y));
        }
        return 0;
    }
    

    本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9247436.html

  • 相关阅读:
    一个apache安装后无法启动的原因分析
    数字的一点考虑
    [转]bat方式上删除注册表键,项
    题解 P2016 【战略游戏】
    题解 P1403 【[AHOI2005]约数研究】
    题解 P1317 【低洼地】
    2020面向对象程序设计寒假作业3 设计思想
    题解 P1829 【[国家集训队]Crash的数字表格 / JZPTAB】
    题解 P1082 【同余方程】
    Unity3D读取外部Text
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9247436.html
Copyright © 2011-2022 走看看