求助!为什么会超时?
查看原帖
求助!为什么会超时?
270373
Ayi11楼主2021/1/12 15:48
#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
#define ll long long

struct Node{
	int l,r;
	ll sum;
	ll lz;
}tree[4*maxn+2];


void push_down(ll i){
	if(tree[i].lz!=0){
		tree[i<<1].lz+=tree[i].lz;
		tree[i<<1|1].lz+=tree[i].lz;
		tree[i<<1].sum+=tree[i<<1].lz*(tree[i<<1].r-tree[i<<1].l+1);
		tree[i<<1|1].sum+=tree[i<<1|1].lz*(tree[i<<1|1].r-tree[i<<1|1].l+1);
		tree[i].lz=0;
	}
}

ll input[maxn];
void BuildTree(ll i,ll l,ll r){
	ll mid=(l+r)>>1;
	tree[i].l=l;
	tree[i].r=r;
	if(l==r){
		tree[i].sum=input[l];
		return;
	}
	BuildTree(i<<1,l,mid);
	BuildTree(i<<1|1,mid+1,r);
	tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
}

void add(ll i,ll x,ll y,ll k){
	if(tree[i].l==tree[i].r){
		tree[i].sum+=k*(tree[i].r-tree[i].l+1);
		tree[i].lz+=k;
		return;
	}
	push_down(i);
	int mid=(tree[i].l+tree[i].r)>>1;
	if(mid>=x){
		add(i<<1,x,y,k);
	}
	if(mid<y){
		add(i<<1|1,x,y,k);
	}
	tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
}

ll Search(ll i,ll x,ll y){
	if(x<=tree[i].l&&y>=tree[i].r) {
		return tree[i].sum;
	}
	if(tree[i].r<x||tree[i].l>y) return 0;
	push_down(i);
	int mid=(tree[i].l+tree[i].r)>>1;
	ll s=0;
	if(mid>=x){
		s+=Search(i<<1,x,y);
	}
	if(mid<y){
		s+=Search(i<<1|1,x,y);
	}
	return s;
}

int main(){
	//freopen("P3372_8.in","r",stdin);
	//freopen("Pww.out","w",stdout);
	ll m,n;
	scanf("%lld%lld",&n,&m);
	for(ll i=1;i<=n;i++) {
		scanf("%lld",&input[i]);
	}
	BuildTree(1,1,n);
	for(int c=0;c<m;c++){
		ll op,x,y,k;
		scanf("%lld",&op);
		if(op==1){
			scanf("%lld%lld%lld",&x,&y,&k);
			add(1,x,y,k);
		}
		if(op==2){
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",Search(1,x,y));
		}
	}
}
2021/1/12 15:48
加载中...