TLE求调
查看原帖
TLE求调
1029690
Astellar楼主2024/12/29 16:01
#include<bits/stdc++.h>
using namespace std;
long long ans[400004],num[100001],k[400004];
long long n,m;
long long left(long long a){
	return a*2;
}
long long right(long long a){
	return a*2+1;
}
void addd(long long l, long long r, long long nl, long long nr,long long p,long long kk){
	if(l<=nl and r>=nr){
		k[p]+=kk;
		ans[p]+=kk+kk*(nr-nl);
		return;
	}
	if(nl==nr){
		return; 
	}
    addd(l,r,nl,(nl+nr)/2,left(p),kk);
    addd(l,r,((nl+nr)/2)+1,nr,right(p),kk);
    return;
}
void jianzao(long long l,long long r,long long anss){
	//cout<<l<<' '<<r<<' '<<anss<<endl; 
	k[anss]=0;
	if(r==l){
		ans[anss]=num[r];
		return;
	}
	else{
		jianzao(l,(l+r)/2,left(anss));
		jianzao(((l+r)/2)+1,r,right(anss)) ;
		ans[anss]=ans[left(anss)]+ans[right(anss)];
		return;
	} 
	
}
long long find(long long l, long long r, long long nl, long long nr,long long p) {
	//cout<<nl<<' '<<nr<<' '<<p<<endl; 
	if(l<=nl and r>=nr)return ans[p]; 
	if(nl==nr){
		return 0; 
	}
	k[left(p)]+=k[p];
	k[right(p)]+=k[p];
	ans[left(p)]+=k[p]+k[p]*(((nl+nr)/2)-nl);
	ans[right(p)]+=k[p]+k[p]*(nr-(((nl+nr)/2)+1));
    long long sum=0;
    sum+=find(l,r,nl,(nl+nr)/2,left(p));
    sum+=find(l,r,((nl+nr)/2)+1,nr,right(p));
    return sum;
}
int main(){
	cin>>n>>m;
	for(long long i=1;i<=n;i++){
		cin>>num[i];
	}
	jianzao(1,n,1);
	while(m--){
		long long b,x,y,kk;
		cin>>b;
		if(b==1){
			cin>>x>>y>>kk;
			addd(x,y,1,n,1,kk);
		}
		else{
			cin>>x>>y;
			cout<<find(x,y,1,n,1)<<endl;
		}
	}
}
2024/12/29 16:01
加载中...