• Wikioi 1081 线段树成段更新单点查询


    线段树练习飘逸的写法,自从自己改成这样的写法之后,线段树就没再练过,如今最终练得上了。

    由于这里查询仅仅是查询了叶子结点,所以pushUp函数就用不上了,只是我没去掉之前是3ms。去掉之后反而变成4ms了,搞不懂怎么原因,没用到,去掉之后应该更快才对啊,居然变慢了,真搞不明确?

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <deque>
    #include <vector>
    #include <queue>
    #include <string>
    #include <cstring>
    #include <map>
    #include <stack>
    #include <set>
    #define PI acos(-1.0)
    #define mem(a,b) memset(a,b,sizeof(a))
    #define sca(a) scanf("%d",&a)
    #define sc(a,b) scanf("%d%d",&a,&b)
    #define pri(a) printf("%d
    ",a)
    #define lson i<<1,l,mid
    #define rson i<<1|1,mid+1,r
    #define MM 100004
    #define MN 1008
    #define INF 2000000000
    #define eps 1e-8
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ULL;
    int sum[MM],val[MM];
    //void pushUp(int i)
    //{
    //    sum[i]=sum[i<<1]+sum[i<<1|1];
    //}
    void pushDown(int i) //处理lazy标记
    {
        if(val[i])
        {
            val[i<<1]+=val[i],val[i<<1|1]+=val[i];
            sum[i<<1]+=val[i],sum[i<<1|1]+=val[i];
            val[i]=0;
        }
    }
    void build(int i,int l,int r)
    {
        sum[i]=val[i]=0;
        if(l==r) return ;
        int mid=(l+r)>>1;
        build(lson),build(rson);
    }
    void update(int i,int l,int r,int L,int R,int v)
    {
        if(L<=l&&r<=R)
        {
            val[i]+=v;
            sum[i]+=v;
            return ;
        }
        int mid=(l+r)>>1;
        pushDown(i);
        if(L<=mid) update(lson,L,R,v);
        if(R>mid) update(rson,L,R,v);
        //pushUp(i);
    }
    int query(int i,int l,int r,int x)
    {
        if(l==x&&r==x) return sum[i];
        int mid=(l+r)>>1;
        pushDown(i);
        if(x<=mid) return query(lson,x);
        else return query(rson,x);
    }
    int main()
    {
        int n,q,mm,i,a,b,s;
        sca(n);
        build(1,1,n);
        for(i=1;i<=n;i++)
        {
            sca(a);
            update(1,1,n,i,i,a);
        }
        sca(q);
        while(q--)
        {
            sca(mm);
            if(mm==1)
            {
                scanf("%d%d%d",&a,&b,&s);
                update(1,1,n,a,b,s);
            }
            else
            {
                sca(s);
                pri(query(1,1,n,s));
            }
        }
        return 0;
    }
    



  • 相关阅读:
    QuickStart系列:docker部署之Gitlab本地代码仓库
    https环境搭建(本地搭建)
    docker搭建elk
    使用本机IP调试web项目
    VC++ 异常处理 __try __except的用法
    Delphi编程常用快捷键大全
    Delphi2007安装报Invalid Serial Number问题
    Cannot create file "C:UsersADMINI~1AppDataLocalTempEditorLineEnds.ttr"
    delphi 调试的时候变量全部显示Inaccessible value的解决办法
    Delphi idhttp解决获取UTF-8网页中文乱码问题
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6877203.html
Copyright © 2020-2023  润新知