虽然AC了,但还是有一点问题
查看原帖
虽然AC了,但还是有一点问题
754467
f_hxr_楼主2023/9/19 16:36

下面这两行代码只有一处不同,却有截然不同的结果

为什么把22行CDQ(1,N)改成CDQ(0,N)就能从0pts变成100pts?

WA代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL N,L,R,sum[200005],ans;
void CDQ(LL l,LL r){
	if(l==r)return;
	LL mid=(l+r)>>1;
	CDQ(l,mid);CDQ(mid+1,r);
	sort(sum+l,sum+mid+1);
	sort(sum+mid+1,sum+r+1);
	LL head=l,tail=l-1;
	for(int i=mid+1;i<=r;i++){
		while(tail+1<=mid&&sum[tail+1]+L<=sum[i])tail++;
		while(head<=mid&&sum[i]>sum[head]+R)head++;
		ans+=tail-head+1;
	}
}
int main(){
	cin>>N>>L>>R;
	for(int i=1,t;i<=N;i++)
		cin>>t,sum[i]=sum[i-1]+t;
	CDQ(1,N);//##########
	cout<<ans;
	return 0;
}

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL N,L,R,sum[200005],ans;
void CDQ(LL l,LL r){
	if(l==r)return;
	LL mid=(l+r)>>1;
	CDQ(l,mid);CDQ(mid+1,r);
	sort(sum+l,sum+mid+1);
	sort(sum+mid+1,sum+r+1);
	LL head=l,tail=l-1;
	for(int i=mid+1;i<=r;i++){
		while(tail+1<=mid&&sum[tail+1]+L<=sum[i])tail++;
		while(head<=mid&&sum[i]>sum[head]+R)head++;
		ans+=tail-head+1;
	}
}
int main(){
	cin>>N>>L>>R;
	for(int i=1,t;i<=N;i++)
		cin>>t,sum[i]=sum[i-1]+t;
	CDQ(1,N);
	cout<<ans;
	return 0;
}
2023/9/19 16:36
加载中...