求助,第4个点为什么疯狂TLE啊?
查看原帖
求助,第4个点为什么疯狂TLE啊?
802557
pyiming楼主2023/12/12 23:28
#include<bits/stdc++.h>
using namespace std;

struct node{
	long long pre,suf,maxx,sum;
}a[400001];
void build(){
	memset(a,0,sizeof(a));
}
void read(int l,int r,int p,int pos,int val){
	if(l==r){
		long long t=a[p].sum+val;
		a[p].pre=a[p].suf=a[p].maxx=a[p].sum=t;
		return;
	}
	int mid=(l+r)>>1;
	if(pos<=mid){
		read(l,mid,p*2,pos,val);
	}
	else{
		read(mid+1,r,p*2+1,pos,val);
	}
	a[p].sum=a[p*2].sum+a[p*2+1].sum;
	a[p].pre=max(a[p*2].pre,a[p*2].sum+a[p*2+1].pre);
	a[p].suf=max(a[p*2+1].suf,a[p*2+1].sum+a[p*2].suf);
	a[p].maxx=max(max(a[p*2].maxx,a[p*2+1].maxx),a[p*2].suf+a[p*2+1].pre);
}
node solve(int l,int r,int p,int s,int t){
	if(l==r){
		return a[p];
	}
	int mid=(l+r)>>1;
	if(mid>=t){
		return solve(l,mid,p*2,s,t);
	}
	if(mid<s){
		return solve(mid+1,r,p*2+1,s,t);
	}
	node x=solve(l,mid,p*2,s,t),y=solve(mid+1,r,p*2+1,s,t),z;
	z.sum=x.sum+y.sum;
	z.pre=max(x.pre,x.sum+y.pre);
	z.suf=max(y.suf,y.sum+x.suf);
	z.maxx=max(max(x.maxx,y.maxx),x.suf+y.pre);
	return z;
}

vector<pair<int,int>> op[100002];
struct query{
	int s,t,id;
};
vector<query> qr[100001];
long long ans[100001];
int main(){
//	freopen("1.in","r",stdin);
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int l,r,x;
		scanf("%d%d%d",&l,&r,&x);
		op[l].push_back({i,x});
		op[r+1].push_back({i,-x});
	}
	int q;
	scanf("%d",&q);
	for(int i=1;i<=q;i++){
		int k,s,t;
		scanf("%d%d%d",&k,&s,&t);
		qr[k].push_back({s,t,i});
	}
	build();
	for(int i=1;i<=n;i++){
//		if(i==2){
//			system("pause");
//		}
		for(auto x:op[i]){
			read(1,m,1,x.first,x.second);
		}
		for(auto x:qr[i]){
			ans[x.id]=solve(1,m,1,x.s,x.t).maxx;
		}
	}
	for(int i=1;i<=q;i++){
		printf("%lld\n",ans[i]);
	} 
	return 0;
} 

cf上第四个点疯狂TLE,有大佬知道为什么嘛?

2023/12/12 23:28
加载中...