日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线段树 单点更新

發(fā)布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线段树 单点更新 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接

?http://acm.hdu.edu.cn/showproblem.php?pid=1166


//線段樹 單點更新


#include <cstdio>
#include <algorithm>


using namespace std;
#define N 50010


int segtree[N*4+10];
int in[N];


void build_tree(int root, int l, int r){


? ?if (l==r){
? ? segtree[root] = in[l];
? ?}else{
? ?int mid = (l+r)>>1;
? ?build_tree(root*2,l,mid);
? ?build_tree(root*2+1,mid+1,r);
? ?segtree[root] = segtree[root*2] + segtree[root*2+1];
? ?}


}
int query_tree(int root , int l , int r, int ll, int rr){


?// ? printf("l=%d r=%d %d\n",l,r,segtree[root]);
? ?if (l>rr || r< ll)
? ? return -1;
? ?if (l>=ll&&r<=rr){
? ? return segtree[root];
? ?}
? ?int mid = (l+r)>>1;
? ? int p1 =query_tree(root*2,l,mid,ll,rr);
? ?int p2= query_tree(root*2+1,mid+1,r,ll,rr);
? ?if (p1==-1)
? ? return p2;
? ?if (p2==-1)
? ? return p1;
? ?return p1+p2;


}
int update_tree(int root,int l ,int r , int pos , int v){


? ? if (pos<l || pos> r)
? ? ? ? return 1;
? ? if (l==r){
? ? ? ? segtree[root]+=v;
? ? }else{
? ? ? ? int mid = (l+r)>>1;
? ? ? ? if (pos<=mid)
? ? ? ? update_tree(root*2,l,mid,pos,v);
? ? ? ? else
? ? ? ? ? ? update_tree(root*2+1,mid+1,r,pos,v);
? ? ? ? segtree[root] = segtree[root*2]+segtree[root*2+1];


? ? }
}


int main (){


? ?int n;
? ? int t ;
? ? scanf("%d",&t);
? ? for (int i = 1 ; i <= t ; i++){
? ? ? ? ? ? printf("Case %d:\n",i);
? ? ? ? scanf("%d",&n);
? ? ? ? for (int j = 1 ; j <= n ; j++){
? ? ? ? ? ? scanf("%d",&in[j]);
? ? ? ? }
? ? ? ? build_tree(1,1,n);
? ? ? ? char s[10];
? ? ? ? int a,b;
? ? ? ? for (;;){
? ? ? ? ? ? scanf("%s",s);
? ? ? ? ? ? if (s[0]=='Q'){
? ? ? ? ? ? ? ? ? ? scanf("%d%d",&a,&b);
? ? ? ? ? ? ? ?printf("%d\n",query_tree(1,1,n,a,b));
? ? ? ? ? ? }else if(s[0] == 'A'){
? ? ? ? ? ? ? ? ?scanf("%d%d",&a,&b);
? ? ? ? ? ? ? ?update_tree(1,1,n,a,b);
? ? ? ? ? ? }else if (s[0] == 'S'){
? ? ? ? ? ? ? ? ?scanf("%d%d",&a,&b);
? ? ? ? ? ? ? ?update_tree(1,1,n,a,-b);
? ? ? ? ? ? }else{
? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }


? ? }
? ?return 0;
}


總結(jié)

以上是生活随笔為你收集整理的线段树 单点更新的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。