线段树MLE求空间优化
查看原帖
线段树MLE求空间优化
540822
HotDogSeller楼主2023/2/12 10:02

前四个点MLE了,怎么都过不了

代码如下:

//#pragma GCC optimize(3)

#include<iostream>
#include<algorithm>
#include<cmath>
#include<memory.h>
#include<vector>
#include<queue> 
#include<stack>
#include<set>
#include<ctime>
#include<iomanip>

#define mod 998244353
#define maxn 100005

using namespace std;

int l[4*maxn],r[4*maxn];
int lc[4*maxn],rc[4*maxn];
int delta[4*maxn],sum[4*maxn];
int cnt=1;

int n,m;
int arr[maxn];

int opt;
int lleft,rright,k,d;
int p;

int figure(int x){
	return sum[x]+(r[x]-l[x]+1)*delta[x];
}

void build(int x,int left,int right){
	
//	cout<<x<<" "<<left<<" "<<right<<endl; 
	
	l[x]=left;
	r[x]=right;
	sum[x]=delta[x]=0;
	
	if(left==right){
		return;
	}
	
	int mid=(left+right)>>1;
	
	lc[x]=cnt++;
	build(lc[x],left,mid);
	rc[x]=cnt++;
	build(rc[x],mid+1,right);
	
	sum[x]=figure(lc[x])+figure(rc[x]);
}

void change(int x,int left,int right,int val){
	
//	cout<<x<<" "<<l[x]<<" "<<r[x]<<" ";
	
	if(left<=l[x]&&r[x]<=right){
		delta[x]+=val;
	//	cout<<"plus "<<val<<",now "<<delta[x]<<endl;
		return;
	}
	
//	cout<<"down!"<<endl;
	
	int mid=(l[x]+r[x])>>1;
	
	if(left<=mid){
		change(lc[x],left,right,val);
	}
	if(right>mid){
		change(rc[x],left,right,val);
	}
	
	sum[x]=figure(lc[x])+figure(rc[x]); 
}

int query(int x,int left,int right){
	
	//cout<<x<<" "<<l[x]<<" "<<r[x]<<" ";
	
	if(left<=l[x]&&r[x]<=right){
	//	cout<<"return "<<figure(x)<<endl;
		return figure(x);
	}
	
//	cout<<"down"<<endl;
	
	delta[lc[x]]+=delta[x];
	delta[rc[x]]+=delta[x];
	delta[x]=0;
	sum[x]=figure(lc[x])+figure(rc[x]);
	
	int mid=(l[x]+r[x])>>1,lre=0;
	if(left<=mid){
		lre+=query(lc[x],left,right);
	}
	if(right>mid){
		lre+=query(rc[x],left,right);
	}
	
	sum[x]=figure(lc[x])+figure(rc[x]);
	return lre;
	
}

void post(int x){

//	cout<<x<<" "<<l[x]<<" "<<r[x]<<" "<<delta[x]<<" "<<sum[x]<<" "<<figure(x)<<endl;
	if(lc[x]){
		post(lc[x]);
		post(rc[x]);
	} 
	
}

signed main(){
	
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>arr[i];
	}
	
	build(0,1,n);
	
	//post(0);
	
	while(m--){
		
		cin>>opt;
		if(opt==1){
			cin>>lleft>>rright>>k>>d;
			if(lleft==rright){
				change(0,lleft,lleft,k);
				change(0,lleft+1,lleft+1,(-1)*k);
			}else{
				change(0,lleft,lleft,k);
			//	cout<<"END!"<<endl;
				change(0,lleft+1,rright,d);
			//	cout<<"END!"<<endl;
				change(0,rright+1,rright+1,(-1)*k-(rright-lleft)*d);
			//	cout<<"END!"<<endl;
			}
		}else{
			cin>>p;
			cout<<query(0,1,p)+arr[p]<<endl;
		}
		
	//	post(0);
		
	}
	
	return 0;
}
2023/2/12 10:02
加载中...