MLE求调
查看原帖
MLE求调
305891
Eraine楼主2023/9/26 17:08

写了动态开点线段树,6个点MLE,不知为何。大佬求调

#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
#define lc tr[i].ch[0]
#define rc tr[i].ch[1]
#define mid (l+r)/2
using namespace std;
const int N=1e5;
const int Sz=9e6;
const ll inf=1e10;
int n;ll Minn,Maxn,a[N+5];
struct segNode{
	int ch[2],sum;
};
int rt,cnt;
struct segTree{
	segNode tr[Sz+5];
	void pushup(int i){
		tr[i].sum=tr[lc].sum+tr[rc].sum;
	}
	void update(int &i,ll l,ll r,ll val){
		if(!i){
			i=++cnt;
		}
		if(l==r){
			tr[i].sum++;
			return;
		}
		if(val<=mid){
			update(lc,l,mid,val);
		}else{
			update(rc,mid+1,r,val);
		}
		pushup(i);
	}
	int query(int i,ll l,ll r,ll L,ll R){
		if(L<=l&&R>=r||!i){
			return tr[i].sum;
		}
		int res=0;
		if(L<=mid){
			res+=query(lc,l,mid,L,R);
		}
		if(R>mid){
			res+=query(rc,mid+1,r,L,R);
		}
		return res;
	}
}seg;
int main(){
	scanf("%d%lld%lld",&n,&Minn,&Maxn);
	ll sum=0,res=0;
	seg.update(rt,-inf,inf,0);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		sum+=a[i];
		res+=seg.query(rt,-inf,inf,sum-Maxn,sum-Minn);
		seg.update(rt,-inf,inf,sum);
	}
	printf("%lld\n",res);
	return 0;
}
2023/9/26 17:08
加载中...