社区讨论

求助,线段树,一直死循环

P3372【模板】线段树 1参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@locli8bu
此快照首次捕获于
2023/10/30 15:45
2 年前
此快照最后确认于
2023/11/05 02:55
2 年前
查看原帖
rt,应该是add函数出错了,但一直都找不出来,老师也找不出来
CPP
#include<bits/stdc++.h>
using namespace std;
#define lid (id<<1)
#define rid (id<<1|1)
struct tree{
	int l,r,s,lz=0;
}t[40005];
int a[10005],n;
void pd(int id){
	if(t[id].lz&&t[id].l!=t[id].r){
		t[lid].lz+=t[id].lz;
		t[rid].lz+=t[id].lz;
		t[lid].s+=t[id].lz*(t[lid].r-t[lid].l+1);
		t[rid].s+=t[id].lz*(t[rid].r-t[rid].l+1);
		t[id].lz=0;
	}
}
void bt(int id,int l,int r){
	t[id].l=l;t[id].r=r;
	if(l==r){
		t[id].s=a[l];return;
	}
	int mid=(l+r)/2;
	bt(lid,l,mid);
	bt(rid,mid+1,r);
	t[id].s=t[lid].s+t[rid].s;
}
void add(int id,int l,int r,int val){
	pd(id);
	if(t[id].l==l&&t[id].r==r){
		t[id].lz+=val;
		t[id].s+=val*(t[id].r-t[id].l+1);
		return;
	}
	int mid=(l+r)/2;
	if(r<=mid)add(lid,l,r,val);
	else if(l>mid)add(rid,l,r,val);
	else add(lid,l,mid,val),add(rid,mid+1,r,val);
	t[id].s=t[lid].s+t[rid].s;
}
int get(int id,int l,int r){
	pd(id);
	if(t[id].l==l&&t[id].r==r)return t[id].s;
	int mid=(t[id].l+t[id].r)/2;
	if(mid>=r)return get(lid,l,r);
	if(l>mid)return get(rid,l,r);
	return get(lid,l,mid)+get(rid,mid+1,r);
}
int main(){
	int q;
	cin>>n>>q;
	for(int i=1;i<=n;i++)cin>>a[i];
	bt(1,1,n);
	for(int i=1;i<=q;i++){
		int tp,x,y,z;
		cin>>tp;
		if(tp==1){
			cin>>x>>y>>z;
			add(1,x,y,z);
		}
		else{
			cin>>x>>y;
			cout<<get(1,x,y)<<endl;
		}
	}
}

回复

4 条回复,欢迎继续交流。

正在加载回复...