社区讨论

权值线段树做的,为什么要开64倍空间才能做?

P5459[BJOI2016] 回转寿司参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo1ov0kj
此快照首次捕获于
2023/10/23 00:34
2 年前
此快照最后确认于
2023/11/03 01:15
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ri register int
const ll N=1e5+5;

ll len=N*N;

ll a[N],n,L,R,cnt=1,sum[N<<6];
int ls[N<<6],rs[N<<6],rt;

void insert(int &p,ll l,ll r,ll x){
	if(!p) p=++cnt;
	sum[p]++;
	if(l==r) return ;
	ll mid=l+r>>1;
	if(x<=mid) insert(ls[p],l,mid,x);
	else insert(rs[p],mid+1,r,x);
}

ll query(int &p,ll l,ll r,ll nl,ll nr){
	if(!p) p=++cnt;
	if(nl<=l&&r<=nr){
		return sum[p];
	}
	ll ans=0,mid=l+r>>1;
	if(nl<=mid) ans+=query(ls[p],l,mid,nl,nr);
	if(nr>mid) ans+=query(rs[p],mid+1,r,nl,nr);
	return ans;
}

int main(){
	std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n>>L>>R;
	for(ri i=1;i<=n;i++) cin>>a[i],a[i]+=a[i-1];
	ll res=0;
	for(ri i=1;i<=n;i++){
		insert(rt,-len,len,a[i-1]);
		ll l=a[i]-R,r=a[i]-L;
		res+=query(rt,-len,len,l,r);
		//cout<<query(rt,-len,len,l,r)<<endl;
	}
	cout<<res;
}
N*64插入的节点也就N,开两倍问题是会挂

回复

2 条回复,欢迎继续交流。

正在加载回复...