和题解对比了一下,感觉没问题,为什么死循环了?
查看原帖
和题解对比了一下,感觉没问题,为什么死循环了?
261262
WaltVBAlston楼主2021/9/5 14:48

RT,查找的时候就会死循环,样例都会,求大佬帮忙调错!

#include<iostream>
using namespace std;
#define MAXN 100000
#define ll long long
struct node{
	int l,r,w,tag;
}tree[4*MAXN];
ll n,m,a[MAXN];
void pushdown(ll i){
	tree[i*2].tag+=tree[i].tag;
	tree[i*2+1].tag+=tree[i].tag;
	tree[i*2].w+=tree[i].w*(tree[i*2].l-tree[i*2].r+1);
	tree[i*2+1].w+=tree[i].w*(tree[i*2+1].l-tree[i*2+1].r+1);
	tree[i].tag=0;
	return;
}
void update(ll i,ll l,ll r,ll k){
	if(tree[i].l>=l&&tree[i].r<=r){
		tree[i].w+=k*(l-r+1);
		tree[i].tag+=k;
		return;
	}
	pushdown(i);
	ll mid=(tree[i].l+tree[i].r)/2;
	if(mid>=l)
		update(i*2,l,r,k);
	if(mid+1<=r)
		update(i*2+1,l,r,k);
	return;
}
ll sum(ll i,ll l,ll r){
	if(tree[i].l>=r&&tree[i].r<=r)
		return tree[i].w;
	pushdown(i);
	ll ans=0,mid=(tree[i].l+tree[i].r)/2;
	if(mid>=l)
		ans+=sum(i*2,l,r);
	if(mid+1<=r)
		ans+=sum(i*2+1,l,r);
	return ans;
}
void build(ll i,ll l,ll r){
	tree[i].l=l,tree[i].r=r;
	if(l==r){
		tree[i].w=a[l];
		return;
	}
	ll mid=(l+r)/2;
	build(i*2,l,mid);
	build(i*2+1,mid+1,r);
	tree[i].w=tree[i*2].w+tree[i*2+1].w;
	return;
}
int main(){
	cin>>n>>m;
	for(ll i=1;i<=n;i++)
		cin>>a[i];
	build(1,1,n);
	while(m--){
		int t;
		cin>>t;
		if(t==1){
			ll x,y,k;
			cin>>x>>y>>k;
			update(1,x,y,k);
		}
		else{
			ll x,y;
			cin>>x>>y;
			cout<<sum(1,x,y)<<endl;
		}
	}
	return 0;
}
2021/9/5 14:48
加载中...