求助MLE80pts
查看原帖
求助MLE80pts
755847
SJS_z楼主2024/10/21 18:29

rt,15-20subtask能过,且只用了11mb,11-14不明原因MLE,怀疑栈溢出,但认为代码没有问题,求大佬调试/解释

评测结果

#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+5;
int n,a[MAXN];
struct yrd{
	long long val,laz;
}tree[4*MAXN];
void push_up(int rt){
	tree[rt].val=tree[rt*2].val+tree[rt*2+1].val;
	return;
}
void push_down(int rt,int nl,int nr){
	tree[rt*2].val+=nl*tree[rt].laz;
	tree[rt*2+1].val+=nr*tree[rt].laz;
	tree[rt*2].laz+=tree[rt].laz;
	tree[rt*2+1].laz+=tree[rt].laz;
	tree[rt].laz=0;
	return;
}
void build(int l,int r,int rt){
	if (l==r){
		tree[rt].val=a[l];
		tree[rt].laz=0;
		return;
	}
	tree[rt].laz=0;
	int mid=(l+r)/2;
	build(l,mid,rt*2);
	build(mid+1,r,rt*2+1);
	push_up(rt);
	return;
}
void add(int l,int r,int rt,int ql,int qr,int w){
	if (ql>r || qr<l){
		return;
	}
	if (ql<=l && qr>=r){
		tree[rt].val+=(r-l+1)*w;
		tree[rt].laz+=w;
		return;
	}
	int mid=(l+r)/2;
	push_down(rt,mid-l+1,r-mid);
	add(l,mid,rt*2,ql,qr,w);
	add(mid+1,r,rt*2+1,ql,qr,w);
	push_up(rt);
	return;
}
int qs(int l,int r,int rt,long long s,int tw){
	if (l==r){
		if (s<=0){
			return 0;
		}
		return 1;
	}
	int mid=(l+r)/2;
	push_down(rt,mid-l+1,r-mid);
	if (tree[rt*2].val*tw<s){
		s-=tree[rt*2].val*tw;
		return mid-l+1+qs(mid+1,r,rt*2+1,s,tw);
	}else if (tree[rt*2].val*tw==s){
		return mid-l;
	}else{
		return qs(l,mid,rt*2,s,tw);
	}
}
int query(long long s,int tw){
	if (tree[1].val*tw<s){
		return query(s-tree[1].val*tw,tw*2)+n;
	}
	return qs(1,n,1,s,tw);
}
int main(){
	int q;
	long long W;
	scanf("%d%d%lld",&n,&q,&W);
	for (int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	build(1,n,1);
	int l,r;
	long long d;
	for (int i=1;i<=q;i++){
		scanf("%d%d%lld",&l,&r,&d);
		add(1,n,1,l,r,d);
		printf("%d\n",query(W,1)-1);
	}
	return 0;
}
2024/10/21 18:29
加载中...