洛谷P1001题解

输入两个整数 𝑎,𝑏
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就做出来了

2 个赞

我会,但我认为没必要
你太6了 :rofl: :rofl:

2 个赞