为什么厌氧
查看原帖
为什么厌氧
918478
All_Wrong_Answer楼主2025/2/3 11:33

rt,好久没写代码了,写了一份线段树模板,结果开 O2 全 TLE,不开就 A 了

#include <bits/stdc++.h>
using namespace std;

#define int long long
#define left q*2
#define right q*2+1
#define zqj tre[q].l
#define yqj tre[q].r

struct xds{
	int l;
	int r;
	int sum;
	int add;
	int oin(int q,int p,int t){
		l=q;
		r=p;
		sum=t;
		add=0;
	}
}tre[500005];

int x,y;
int m[100005];

void pushup(int q){
	tre[q].sum=tre[left].sum+tre[right].sum;
}

void pushdown(int q){
	if(tre[q].add>0){
		tre[left].sum+=((tre[left].r-tre[left].l+1)*tre[q].add);
		tre[left].add+=tre[q].add;
		tre[right].sum+=((tre[right].r-tre[right].l+1)*tre[q].add);
		tre[right].add+=tre[q].add;
		tre[q].add=0;
	}
}

void js(int q,int l,int r){
	tre[q].oin(l,r,m[l]);
	if(l==r) return ;
	int mid=l+r>>1;
	js(left,l,mid);
	js(right,mid+1,r);
	pushup(q);
	return ;
}

void qjjf(int q,int ml,int mr,int k){
	if(ml<=zqj&&mr>=yqj){
		tre[q].sum+=((yqj-zqj+1)*k);
		tre[q].add+=k;
		return ;
	}
	pushdown(q);
	int mid=zqj+yqj>>1;
	if(ml<=mid) qjjf(left,ml,mr,k);
	if(mr>mid) qjjf(right,ml,mr,k);
	pushup(q); 
}

int qjqh(int q,int ml,int mr){
	if(zqj>=ml&&yqj<=mr) return tre[q].sum;
	pushdown(q);
	int mid=zqj+yqj>>1;
	int da=0;
	if(ml<=mid) da+=qjqh(left,ml,mr);
	if(mr>mid) da+=qjqh(right,ml,mr); 
	return da;
}

signed main(){
	cin>>x>>y;
	for(int i=1;i<=x;i++){
		cin>>m[i];
	}
	js(1,1,x);
	for(int i=1;i<=y;i++){
		int a;
		cin>>a;
		if(a==1){
			int b,c,d;
			cin>>b>>c>>d;
			qjjf(1,b,c,d);
		}
		if(a==2){
			int b,c;
			cin>>b>>c;
			cout<<qjqh(1,b,c)<<endl;
		}
	}
	return 0; 
}
2025/2/3 11:33
加载中...