我写了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;
}
而且还能过......