zoukankan      html  css  js  c++  java
  • 【线段树】线段树系列 0.1单点修改单点求和线段树

    终于搞定了单点修改线段树。。。3个月。。操蛋。。根本没有模板题。。觉得太弱了。。。艹蛋。。。必须进一步更新我的版本啊

    #include<iostream>
    #include<cstdlib>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    struct node
    {
        int left,right,value;
    };
    node point[100];
    int father[100];
    int g;
    void buildtree(int i,int left,int right)
    {
        father[i]=(int)floor(i)/2.0;
        point[i].left=left;
        point[i].right=right;
        point[i].value=0;
        if (left==right) {father[i]=i;}
        else
        {
        buildtree(i<<1, left, (int)floor( (right+left) / 2.0)); 
        buildtree((i<<1) + 1, (int)floor( (right+left) / 2.0) + 1, right);  
        }
    }
    //----------------------------------------------------------------------------
    void update(int x,int add,int left,int right,int now) //left,right是范围,add是加上的值,now是当前节点的标号,x是目标节点 
    {
        int mid=(left+right)>>1;
        point[now].value+=add;
        if ( (right-left)<1 ) {g=left; return;}
        if ( (left<=x) && (x<=mid) ) { update(x,add,left,mid,2*now); }
        if ( ((mid+1)<=x) && (x<=right) ) { update(x,add,mid+1,right,2*now+1); }
    }
    //----------------------------------------------------------------------------
    int search(int x,int now)
    {
        if (point[now].left==point[now].right) {return (point[now].value);}
        int mid=(point[now].left+point[now].right)>>1;
        if ( (point[now].left<=x) && (x<=mid) ) { return (search(x,2*now)); }
        if ( ((mid+1)<=x) && (x<=point[now].right) ) { return (search(x,2*now+1)); }
        return 598460606;
    }
    //----------------------------------------------------------------------------
    int main()
    {
        int n,m,k;
        cin>>n;
        buildtree(1,1,n);
        for (int i=1;i<=n;i++)
        {
            int x,ad;
            cin>>x>>ad;
            update(x,ad,1,n,1); 
        }
        cin>>m;
        for (int i=1;i<=m;i++) 
        {
            int x,ad;
            cin>>x>>ad;
            update(x,ad,1,n,1);
            
        }
        cin>>k;
        for (int i=1;i<=k;i++)
        {
            int s;
            cin>>s;
            cout<<search(s,1)<<endl;
        }
    }
    noip忘记取模的痛
  • 相关阅读:
    揭秘淘宝286亿海量图片存储与处理架构
    从能做的事做起,做越来越多的事
    用表驱动代替switchcase
    文件过滤驱动中的重入处理
    谈谈对APC的一点理解
    StartIo例程的作用
    C++各大名库的介绍
    IRQL
    FastIO
    一道面试题,看这段代码最后抛出什么异常
  • 原文地址:https://www.cnblogs.com/seekdreamer/p/3975589.html
Copyright © 2011-2022 走看看