论我有多闲
  • 板块灌水区
  • 楼主L_T_L
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/10/17 20:54
  • 上次更新2024/10/17 22:47:26
查看原帖
论我有多闲
1259760
L_T_L楼主2024/10/17 20:54

我写了10分钟写了一个a+b问题的线段树解法......
代码如下

#include<bits/stdc++.h>
using namespace std;
class SegmentTree{
public:
    SegmentTree(int n){
        size=n;
        tree.resize(4*n,0);
    }
    void build(const vector<int>&arr,int node,int start,int end){
        if(start==end){
            tree[node]=arr[start];
        }
		else{
            int mid=(start+end)/2;
            build(arr,2*node+1,start,mid);
            build(arr,2*node+2,mid+1,end);
            tree[node]=tree[2*node+1]+tree[2*node+2];
        }
    }
    void update(int idx,int value,int node,int start,int end){
        if(start==end){
            tree[node]=value;
        }
		else{
            int mid=(start+end)/2;
            if(start<=idx&&idx<=mid){
                update(idx,value,2*node+1,start,mid);
            }
			else{
                update(idx,value,2*node+2,mid+1,end);
            }
            tree[node]=tree[2*node+1]+tree[2*node+2];
        }
    }
    int query(int l,int r,int node,int start,int end){
        if(r<start||end<l){
            return 0;
        }
        if(l<=start&&end<=r){
            return tree[node];
        }
        int mid=(start+end)/2;
        int left_sum=query(l,r,2*node+1,start,mid);
        int right_sum=query(l,r,2*node+2,mid+1,end);
        return left_sum+right_sum;
    }
private:
    vector<int>tree;
    int size;
};
int main(){
    int n=2;
    vector<int>arr(n);
    cin>>arr[0]>>arr[1];
    SegmentTree segTree(n);
    segTree.build(arr,0,0,n-1);
    int sum=segTree.query(0,1,0,0,n-1);
    cout<<sum<<endl;
    return 0;
}

而且还能过......

2024/10/17 20:54
加载中...