输入两个整数 𝑎,𝑏
a,b,输出它们的和(∣𝑎∣,∣𝑏∣≤1e9)。
emmmm
求和!线段树!
#include<bits/stdc++.h>
using namespace std;
int a[2],d[10],b[10];
void build(int s,int t,int p){
//对[s,t]区间建立线段树,当前根编号为p
if(s==t){
d[p]=a[s];
return;
}
int mid=(s+t)/2;
build(s,mid,p*2);
build(mid+1,t,p*2+1);
d[p]=d[p*2]+d[p*2+1];
}
int getsum(int l,int r,int s,int t,int p){
//[l,r]为查询空间,[s,t]为当前节点包含的区间,当前节点编号为p
if(l<=s&&r>=t) return d[p];
int mid=(s+t)/2,sum=0;
if(b[p]){
d[p*2]+=b[p]*(mid-s+1);
d[p*2+1]+=b[p]*(t-mid);
b[p*2]+=b[p];
b[p*2+1]+=b[p];
b[p]=0;
}
if(l<=mid) sum+=getsum(l,r,s,mid,p*2);
if(r>mid) sum+=getsum(l,r,mid+1,t,p*2+1);
return sum;
}
int main(){
cin>>a[0]>>a[1];
build(0,1,1);
cout<<getsum(1,2,1,2,1);
return 0;
}
没有区间运算所以就不写了。
传说中身为红题的A+B problem就做出来了