P3372线段树 WA0pts 求调
查看原帖
P3372线段树 WA0pts 求调
1046448
Polaris_flame楼主2023/10/6 15:07
#include<bits/stdc++.h>
#define FL(i,a,b) for(int i=(a);i<=(b);i++)
#define FR(i,a,b) for(int i=(a);i>=(b);i--)
#define int long long
#define ls (x<<1)
#define rs (x<<1|1)
#define mid ((l+r)>>1)
using namespace std;
const int MAXN = 1e5 + 10;
int a[MAXN],tag[MAXN<<2],num[MAXN<<2];
void build(int x,int l,int r){
	tag[x]=0;
	if(l==r){
		num[x]=a[l];
		return;
	}
	build(ls,l,mid);
	build(rs,mid+1,r);
}
void pushup(int x){
	num[x]=num[ls]+num[rs];
}
void f(int x,int l,int r,int k){
	tag[x]+=k;
	num[x]+=(r-l+1)*k;
}
void pushdown(int x,int l,int r){
	f(ls,l,mid,tag[x]);
	f(rs,mid+1,r,tag[x]);
	tag[x]=0;
}
void add(int x,int l,int r,int L,int R,int k){
	if(l>=L&&r<=R){
		tag[x]+=k;
		num[x]+=(r-l+1)*k;
		return ;
	}
	pushdown(x,l,r);
	if(L<=mid) add(ls,l,mid,L,R,k);
	if(R>mid) add(rs,mid+1,r,L,R,k);
	pushup(x);
}
int query(int x,int l,int r,int L,int R){
	int res=0;
	if(l>=L&&r<=R) return num[x];
	pushdown(x,l,r);
	if(L<=mid) res+=query(ls,l,mid,L,R);
	if(R>mid) res+=query(rs,mid+1,r,L,R);
	return res;
}
signed main(){
	int n,m;
	scanf("%lld%lld",&n,&m);
	FL(i,1,n) scanf("%lld",&a[i]);
	build(1,1,n);
	FL(i,1,m){
		int op;
		scanf("%lld",&op);
		if(op==1){
			int x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			add(1,1,n,x,y,k);
		}
		else{
			int x,y;
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",query(1,1,n,x,y));
		}
	}
}

QAQ样例过了但是全WA。

2023/10/6 15:07
加载中...