求助
  • 板块题目总版
  • 楼主OI_AKed_me
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/2/25 19:59
  • 上次更新2023/10/28 07:46:27
查看原帖
求助
576527
OI_AKed_me楼主2022/2/25 19:59

P3372 【模板】线段树 1
后面7个点全部RE

#include<bits/stdc++.h>
#define ll long long
#define ss stable_sort
#define inf INT_MAX
#define re register
#define tL(p) tree[p].L=L
#define tR(p) tree[p].R=R
#define t0(p) tree[p].add=0
#define TREE(p) tL(p);tR(p);t0(p);
#define IF if(L==R)
#define IF2 if(tree[p].L==L&&tree[p].R==R)
#define Ret return
#pragma GCC opitimize(3)
using namespace std;
const int N(1<<5);
ll n,m,s[N];
struct node{
	ll L,R;
	ll sum,add;
	ll mid(){
		Ret (L+R)>>1;
	}
}tree[4*N];
void up(ll p){
	tree[p].sum=tree[2*p].sum+tree[2*p+1].sum;
}
void down(ll p){
	if(tree[p].add==0)return;
	tree[2*p].sum+=(tree[2*p].R-tree[2*p].L+1)*tree[p].add;
	tree[2*p+1].sum+=(tree[2*p+1].R-tree[2*p+1].L+1)*tree[p].add;
	tree[2*p].add+=tree[p].add;
	tree[2*p+1].add+=tree[p].add;
	tree[p].add=0;
	
}
void build(ll L,ll R,ll p){
	TREE(p)
	IF{
		tree[p].sum=s[L];
		Ret;
	}
	ll mid=tree[p].mid();
	build(L,mid,2*p);
	build(mid+1,R,2*p+1);
	up(p);
}
void update(ll L,ll R,ll a,ll p){
	IF2{
		tree[p].sum+=(R-L+1)*a;
		tree[p].add+=a;
		Ret;
	}
	down(p);
	int mid=tree[p].mid();
	if(R<=mid) update(L,R,a,2*p);
	else if(L>mid) update(L,R,a,2*p+1);
	else{
		update(L,mid,a,2*p);
		update(mid+1,R,a,2*p+1);
	}
	up(p);

}
ll query(ll L,ll R,ll p){
	IF2{
		Ret tree[p].sum;
	}
	down(p);
	ll mid=tree[p].mid();
	if(R<=mid) return query(L,R,2*p);
	else if(L>mid) return query(L,R,2*p+1);
	else return query(L,mid,2*p)+query(mid+1,R,2*p+1);
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>s[i];
	build(1,n,1);
	for(int i=1;i<=m;i++){
		short int op;
		cin>>op;
		if(op==1){
			ll x,y,a;
			cin>>x>>y>>a;
			update(x,y,a,1);
		}else{
			ll x,y;
			cin>>x>>y;
			cout<<query(x,y,1)<<endl;
		}
	}
	Ret 0;
}
2022/2/25 19:59
加载中...