改了一些,不死循环了,输出特别特别大
查看原帖
改了一些,不死循环了,输出特别特别大
261262
WaltVBAlston楼主2021/9/5 15:07

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].r-tree[i*2].l+1);
	tree[i*2+1].w+=tree[i].w*(tree[i*2+1].r-tree[i*2+1].l+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*(tree[i].r-tree[i].l+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);
	tree[i].w=tree[i*2].w+tree[i*2+1].w;
	return;
}
ll sum(ll i,ll l,ll r){
	if(tree[i].l>=l&&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 15:07
加载中...