线段树单点更新
Posted solvit
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线段树单点更新相关的知识,希望对你有一定的参考价值。
单点更新:最基础的线段树,只更新叶子结点,然后用PushUp函数将信息更新上来。
HDU1166 敌兵布阵
线段树功能:update单点增减,query区间求和。
#include<bits/stdc++.h> using namespace std; #define lson l, mid, root << 1 #define rson mid + 1, r, root << 1 | 1 const int maxn = 50005; int sum[maxn << 2]; int t,n; char op[10]; void PushUp(int root){ sum[root] = sum[root << 1] + sum[root << 1 | 1]; } void build(int l,int r,int root) { if(l == r){ scanf("%d",&sum[root]); return; } int mid = (l + r) >> 1; build(lson);build(rson); PushUp(root); } void update(int pos,int add,int l,int r,int root) { if(l == r){ sum[root] += add; return; } int mid = (l + r) >> 1; if(pos <= mid) update(pos,add,lson); else update(pos,add,rson); PushUp(root); } int query(int L,int R,int l,int r,int root) { if(L <= l && r <= R){ return sum[root]; } int mid = (l + r) >> 1; int ret = 0; if(L <= mid) ret += query(L,R,lson); if(R > mid) ret += query(L,R,rson); return ret; } int main() { scanf("%d",&t); for(int cas = 1; cas <= t; cas++) { scanf("%d",&n); build(1,n,1); printf("Case %d: ",cas); while(~scanf("%s",op)) { if(op[0] == ‘E‘) break; int a,b; scanf("%d%d",&a,&b); if(op[0] == ‘Q‘){ printf("%d ",query(a,b,1,n,1)); } else if(op[0] == ‘S‘){ update(a,-b,1,n,1); } else{ update(a,b,1,n,1); } } } return 0; }
HDU1754 I Hate It
线段树功能:update单点替换,query区间最值。
以上是关于线段树单点更新的主要内容,如果未能解决你的问题,请参考以下文章