首页 > 其他 > 详细

<4>线段树

时间:2020-03-27 23:58:00      阅读:108      评论:0      收藏:0      [点我收藏+]

单点更新与区间更新移步原博客。

单点更新&区间求和例子:

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

struct node
{
    int L, R, val, val1, val2;
    int Mid(){ return (L+R)/2; }
}a[200010*4];

int A, B;

void Build(int id, int L, int R)
{
    a[id].L = L, a[id].R = R;
    a[id].val=a[id].val1=a[id].val2=0;
    if(L == R)return ;
    Build(id*2, L, a[id].Mid());
    Build(id*2+1, a[id].Mid()+1,R);
}

void Update(int id, int x, int y)
{
    if(a[id].L==a[id].R&&a[id].L==x)
    {
        a[id].val+=y;//项目叠加 
        if(a[id].val>=A)
        {
            a[id].val1=A;
            a[id].val2=B;
        }else if(a[id].val<A&&a[id].val>=B){
            a[id].val1=a[id].val;
            a[id].val2=B;
        }else{
            a[id].val1= a[id].val2 = a[id].val;
            
        }return;
           
        
    }
    if(x<=a[id].Mid())
        Update(id*2,x,y);
    else
        Update(id*2+1,x,y);

    a[id].val= a[id*2].val + a[id*2+1].val;
    a[id].val1 = a[id*2].val1 + a[id*2+1].val1;
    a[id].val2 = a[id*2].val2 + a[id*2+1].val2;
}


int Query(int id, int L, int R, int f)
{
    if(L>R) return 0;
    if(a[id].L == L && a[id].R == R)
    {
        if(f==1){
            return a[id].val1;
        }else{
            return a[id].val2;
        }
    }
    if(R<=a[id].Mid())
        return Query(id*2, L, R, f);
    else if(L>a[id].Mid())
        return Query(id*2+1, L, R, f);
    else
    {
        int ans1 = Query(id*2,L,a[id].Mid(), f);
        int ans2 = Query(id*2+1,a[id].Mid()+1,R,f);
        return ans1+ans2;
    }
}

int main()
{
    int n, k, q, t, x, y;
    scanf("%d %d %d %d %d", &n, &k, &A, &B, &q);
    Build(1, 1, n);
    while(q--){
        scanf("%d", &t);
        if(t==1){
            scanf("%d %d", &x, &y);
            Update(1, x, y);
        }else{
            scanf("%d", &x);
            int ans1 = Query(1, 1, x-1, 0);
            int ans2 = Query(1, x+k, n, 1);
            printf("%d\n", ans1 + ans2);
        }
    }
    
    return 0;
}

 

<4>线段树

原文:https://www.cnblogs.com/howiedu/p/12584751.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!