bzoj4627: [BeiJing2016]回转寿司

好题!

这题教会我:写cdq可以不拘一格,只要保证本质是释放左半部分影响于右半部分就可以了。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
int n;LL L,R;
LL a[110000],s[110000],tt[110000],ans;
void cdq(int l,int r)
{
    if(l==r)return ;
    int mid=(l+r)/2;
    cdq(l,mid);cdq(mid+1,r);
    
    LL head=l,tail=l-1;
    for(LL i=mid+1;i<=r;i++)
    {
        while(tail+1<=mid&&L<=s[i]-s[tail+1])tail++;
        while(head<=mid&&s[i]-s[head]>R)head++;
        ans+=max(tail-head+1,0LL);
    }
    sort(s+l,s+r+1);
}
int main()
{
    scanf("%d%lld%lld",&n,&L,&R);
    s[1]=0;
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]), s[i+1]=s[i]+a[i];
    n++;ans=0;
    cdq(1,n);
    printf("%lld
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/AKCqhzdy/p/8622138.html