zoukankan      html  css  js  c++  java
  • 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("");
        }
    }
  • 相关阅读:
    移动平台开发第七周学习总结
    团队作业(2)项目选题
    人工智能汇总---政策-应用--技术
    机器人(人工智能python) arduino编程 scratch2.0 乐高ev3编程 教育政策及考试
    Scratch工具下载及学习视频等资料
    2019人工智能科普--汇总
    2018人工智能应用例子_汇总贴
    北大人工智能前沿讲座--第二讲 嵌入式人工智能
    《焦点访谈》 20180405 美举“大棒”我“亮剑”
    window10下安装python3.6.x 及环境变量的配置
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934386.html
Copyright © 2011-2022 走看看