• P4145 上帝造题的七分钟2 / 花神游历各国


    思路

    每个数不会被开方超过log次,对每个数暴力开方即可

    代码

    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #define int long long
    using namespace std;
    struct Node{
        int max,sum;
    }Seg[100100<<2];
    int a[100100],n,m;
    void pushup(int o){
        Seg[o].sum=Seg[o<<1].sum+Seg[o<<1|1].sum;
        Seg[o].max=max(Seg[o<<1].max,Seg[o<<1|1].max);
    }
    void build(int l,int r,int o){
        if(l==r){
            Seg[o].sum=Seg[o].max=a[l];
            return;
        }
        int mid=(l+r)>>1;
        build(l,mid,o<<1);
        build(mid+1,r,o<<1|1);
        pushup(o);
    }
    void modi(int L,int R,int l,int r,int o){
        if(Seg[o].max<=1)
            return;
        if(l==r){
            Seg[o].max=Seg[o].sum=sqrt(Seg[o].sum);
            return;
        }
        int mid=(l+r)>>1;
        if(L<=mid)
            modi(L,R,l,mid,o<<1);
        if(R>mid)
            modi(L,R,mid+1,r,o<<1|1);
        pushup(o);
    }
    int query(int L,int R,int l,int r,int o){
        if(L<=l&&r<=R){
            return Seg[o].sum;
        }
        int mid=(l+r)>>1,ans=0;
        if(L<=mid)
            ans+=query(L,R,l,mid,o<<1);
        if(R>mid)   
            ans+=query(L,R,mid+1,r,o<<1|1);
        return ans;
    }
    signed main(){
        scanf("%lld",&n);
        for(int i=1;i<=n;i++)
            scanf("%lld",&a[i]);
        build(1,n,1);
        scanf("%lld",&m);
        for(int i=1;i<=m;i++){
            int opt,l,r;
            scanf("%lld %lld %lld",&opt,&l,&r);
            if(l>r)
                swap(l,r);
            if(opt==0)
                modi(l,r,1,n,1);
            else
                printf("%lld
    ",query(l,r,1,n,1));
        }
        return 0;
    }
    
  • 相关阅读:
    撤回本地的提交
    antd Table每列样式修改
    大数组拼树
    滑动加载
    数组合并去除重复内容
    获取前一周期日期
    js 对象根据value获取对应的key
    less git上传问题处理
    5G
    Linux怎么安装node.js
  • 原文地址:https://www.cnblogs.com/dreagonm/p/10549793.html
Copyright © 2020-2023  润新知