90分求调
查看原帖
90分求调
1457414
Icyyy楼主2025/8/1 19:12

写的数组的线段树 调的要崩溃了TT到后面都对着老师的代码一行行对了,结果还是只有90分,老师的代码只有95分 求助TT

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;

int n,m;
int a[1000005];
int top;
struct st{
	int l,r;
	ll d,tag;
	int ls,rs;
}pool[2000005];

ll cal(int p){
	return pool[p].d+pool[p].tag*(pool[p].r-pool[p].l+1);
}

void pushup(int p){
	pool[p].d=cal(pool[p].ls)+cal(pool[p].rs);
}

void pushd(int p){
	if(pool[p].tag==0) return;
	pool[pool[p].ls].tag+=pool[p].tag;
	pool[pool[p].rs].tag+=pool[p].tag;
	pool[p].tag=0;
	pushup(p);
}

int build(int l,int r){
	int p=++top;
	pool[p]=st{l,r,0,0};
	if(l==r){
		pool[p].d=a[l];
		return p;
	} 
	int mid=(l+r)/2;
	pool[p].ls=build(l,mid);
	pool[p].rs=build(mid+1,r);
	pushup(p);
	return p;
}

ll query(int p,int ql,int qr){
	if(pool[p].l==ql && pool[p].r==qr){
		return cal(p);
	}
	pushd(p);
	int mid=(pool[p].l+pool[p].r)/2;
	if(ql>=mid+1) return query(pool[p].rs,ql,qr);
	else if(qr<=mid) return query(pool[p].ls,ql,qr);
	else{
		ll ld=query(pool[p].ls,ql,mid);
		ll rd=query(pool[p].rs,mid+1,qr);
		return ld+rd;
	}
}

void change(int p,int ql,int qr,int dv){
	if(pool[p].l==ql && pool[p].r==qr){
		pool[p].tag+=dv;
		return;
	}
	pushd(p);
	int mid=(pool[p].l+pool[p].r)/2;
	if(ql>=mid+1) change(pool[p].rs,ql,qr,dv);
	else if(qr<=mid) change(pool[p].ls,ql,qr,dv);
	else{
		change(pool[p].ls,ql,mid,dv);
		change(pool[p].rs,mid+1,qr,dv);
	}
	pushup(p);
	return;
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int rt = build(1,n);
	int op,l,r;
	ll k;
	for(int i=1;i<=m;i++){
		cin>>op>>l>>r;
		if(op==1){
			cin>>k;
			change(rt,l,r,k);
		} else{
			cout<<query(rt,l,r)<<"\n";
		}
	}
return 0;
}
2025/8/1 19:12
加载中...