• bzoj3211花神游历各国 线段树


    3211: 花神游历各国

    Time Limit: 5 Sec  Memory Limit: 128 MB
    Submit: 4252  Solved: 1547
    [Submit][Status][Discuss]

    Description

    Input

    Output

    每次x=1时,每行一个整数,表示这次旅行的开心度

    Sample Input

    4
    1 100 5 5
    5
    1 1 2
    2 1 2
    1 1 2
    2 2 3
    1 1 4

    Sample Output

    101
    11
    11

    HINT

    对于100%的数据, n ≤ 100000,m≤200000 ,data[i]非负且小于10^9

    可以注意到题目中给出的最大数1e9,在开根几次之后都变成了0或1,0或1开根后不变
    也就是说对于每个位置,修改操作次数是有限的,修改次数达到上限以后就不用修改了

    开lazy标记当前区间是否开根开到全是0或1,sum表示区间和
    考虑到修改不超过10次,我们每次修改都深入到最底层节点暴力修改再传给父亲信息即可
    当一个节点的儿子全被lazy标记,它也可以打上lazy标记

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #define ll long long
    #define N 100005
    using namespace std;
    int n,m,a[N],lz[N<<2];ll sum[N<<2];
    void pushup(int u){
        int l=u<<1,r=l|1;
        sum[u]=sum[l]+sum[r];
        lz[u]=lz[l]&lz[r];
    }
    void build(int u,int l,int r){
        if(l==r){
            sum[u]=a[l];
            if(sum[u]<=1)lz[u]=1;
            return;
        }
        int mid=l+r>>1;
        build(u<<1,l,mid);
        build(u<<1|1,mid+1,r);
        pushup(u);
    }
    void update(int u,int L,int R,int l,int r){
        if(lz[u])return;
        if(L==R){
            sum[u]=sqrt(sum[u]);
            if(sum[u]<=1)lz[u]=1;
            return;
        }
        int mid=L+R>>1;
        if(l<=mid)update(u<<1,L,mid,l,r);
        if(r>mid)update(u<<1|1,mid+1,R,l,r);
        pushup(u);
    }
    ll query(int u,int L,int R,int l,int r){
        if(l<=L&&R<=r)return sum[u];
        int mid=L+R>>1;
        ll t=0;
        if(l<=mid)t+=query(u<<1,L,mid,l,r);
        if(r>mid)t+=query(u<<1|1,mid+1,R,l,r);
        return t;
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
        build(1,1,n);
        scanf("%d",&m);
        while(m--){
            int op,l,r;
            scanf("%d%d%d",&op,&l,&r);
            if(l>r)swap(l,r);
            if(op==1)printf("%lld
    ",query(1,1,n,l,r));
            else update(1,1,n,l,r);
        }
        return 0;
    }
  • 相关阅读:
    32位和64位的区别
    Git--版本管理的使用及理解
    Maven使用详解
    记录centos7下tomcat部署war包过程
    SSM三大框架整合教程
    Mybatis 框架搭建实例
    Eclipse 出现select type (? = any character,*= any String,Tz=TimeZone)
    JDBC 操作数据库实例
    mysql 常用命令语法
    MySQL下载安装详情教程(Windows)
  • 原文地址:https://www.cnblogs.com/wsy01/p/8052995.html
Copyright © 2020-2023  润新知