• hdoj4027【线段树】


    题意:
    给你一个序列,然后给出m个命令,
    每个命令有两种:①:在区间内实现开方;②:求一个区间和;
    思路:
    一开始没思路啊,这个开方又不像加加减减一起来就好了,开方只能自己玩啊,但是仔细一想一个数也才开8次还是7次,那么直接暴力一发就好了。。。中间判断一下区间值是不是已经都是1了,直接返回就好了。能暴力的话,咱就随便搞搞就好啦
    一开始还建树出错了,感觉不对就直接把树输出来看看是不是挂了。。。不过还是要自己检查代码,瞎瘠薄输出不好。。。。
    挫code….

    #include<cstdio>
    #include<math.h>
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    typedef __int64 LL;
    
    const int N=100007;
    struct st{
        int left,right;
        LL sum;
        LL len;
    };
    st q[N*4];
    
    void build(int num,int L,int R)
    {
        q[num].left=L;
        q[num].right=R;
        if(L==R)
        {
            scanf("%lld",&q[num].sum);
            q[num].len=1;
            return;
        }
        build(2*num,L,(L+R)/2);
        build(2*num+1,(L+R)/2+1,R);
        q[num].len=R-L+1;
        q[num].sum=q[2*num].sum+q[2*num+1].sum;
    }
    
    void update(int num,int s,int t)
    {
        if(q[num].left>=s&&q[num].right<=t)
        {
            if(q[num].sum==q[num].len)
                return;
            if(q[num].left==q[num].right)
            {
                q[num].sum=LL(sqrt(q[num].sum));
                return;
            }
            update(2*num,q[num].left,(q[num].left+q[num].right)/2);
            update(2*num+1,(q[num].left+q[num].right)/2+1,q[num].right);
            q[num].sum=q[2*num].sum+q[2*num+1].sum;
            return;
        }
        int mid=(q[num].left+q[num].right)/2;
        if(mid>=t)
            update(2*num,s,t);
        else if(mid<s)
            update(2*num+1,s,t);
        else
        {
            update(2*num,s,mid);
            update(2*num+1,mid+1,t);
        }
        q[num].sum=q[2*num].sum+q[2*num+1].sum;
    }
    
    LL query(int num,int s,int t)
    {
        if(q[num].left>=s&&q[num].right<=t)
            return q[num].sum;
        int mid=(q[num].left+q[num].right)/2;
        LL ans=0;
        if(mid>=t)
            ans+=query(2*num,s,t);
        else if(mid<s)
            ans+=query(2*num+1,s,t);
        else
        {
            ans+=query(2*num,s,mid);
            ans+=query(2*num+1,mid+1,t);
        }
        return ans;
    }
    
    
    int main()
    {
        int n,m;
        int cas=1;
        while(~scanf("%d",&n))
        {
            build(1,1,n);
            /*for(int i=1;i<=19;i++)
            {
                printf("%d %d %lld 
    ",q[i].left,q[i].right,q[i].sum);
            }*/
            printf("Case #%d:
    ",cas++);
            scanf("%d",&m);
            while(m--)
            {
                int t,x,y;
                scanf("%d%d%d",&t,&x,&y);
                if(x>y)
                    swap(x,y);
                if(t)
                    printf("%lld
    ",query(1,x,y));
                else
                    update(1,x,y);
                /*puts("");
                for(int i=1;i<=19;i++)
                {
                    printf("%d %d %lld 
    ",q[i].left,q[i].right,q[i].sum);
                }
                puts("");*/ 
            }
            puts("");
        }
    }
  • 相关阅读:
    1.3 Starting a New Job 1.3.3 Background Reading(I)
    1.3 Starting a New Job 1.3.1 Preparation
    1.2 Interview 1.2.4 Sample Test(IV)
    1.2 Interview 1.2.4 Sample Test(III)
    Jquery获取元素集合并遍历
    Oracle21c RAC+DG生产项目实战(RHEL8+Oracle集群+容灾+CDB/PDB)
    Django
    Linux 实用命令
    Python人工智能:原理、实践及应用-资料分享
    关于HDFS的NameNode和SecondaryNameNode的一些疑问解答
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934386.html
Copyright © 2020-2023  润新知