下面这两行代码只有一处不同,却有截然不同的结果
为什么把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;
}