• Bzoj4627--BeiJing2016回转寿司


    维护前缀和,枚举区间起点l,则满足条件的区间结尾r必须满足L<=pre[r]-pre[l]<=R

    用值域线段树维护即可

    代码 :

    #include<bits/stdc++.h>
    #define LL long long
    using namespace std;
    
    #define MAXN 100005
    
    const int L=0,R=1;
    int n,a[MAXN],D,U;LL pre[MAXN],ans;
    int sz=1,root=1;
    struct Node{
        int s,son[2];
    }x[MAXN*40];
    
    void Chg(LL l,LL r,LL v,int &now,int p) {
        if(!now) now=++sz;x[now].s+=p;
        if(l==r) return;
        LL mid=l+r>>1;
        if(v>mid) Chg(mid+1,r,v,x[now].son[R],p);
        else Chg(l,mid,v,x[now].son[L],p);
    }
    
    int Query(LL l,LL r,LL ql,LL qr,int now) {
        if(ql==l&&qr==r) return x[now].s;
        LL mid=l+r>>1;
        if(ql>mid) return Query(mid+1,r,ql,qr,x[now].son[R]);
        else if(qr<=mid) return Query(l,mid,ql,qr,x[now].son[L]);
        else return Query(l,mid,ql,mid,x[now].son[L])+Query(mid+1,r,mid+1,qr,x[now].son[R]);
    }
    
    int main() {
        scanf("%d%d%d",&n,&D,&U);
        for(int i=1;i<=n;i++) {
            scanf("%d",&a[i]);
            pre[i]=pre[i-1]+a[i];
        }
        for(int i=0;i<=n;i++) {
            pre[i]+=10000000001ll;
            Chg(1,20000000002ll,pre[i],root,1);    
        }
        for(int i=0;i<n;i++) {
            Chg(1,20000000002ll,pre[i],root,-1);
            ans+=Query(1,20000000002ll,D+pre[i],U+pre[i],root);
        }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    距离某天还有多久
    U3D各键值说明
    一些比较重要的函数
    U3D功能脚本备忘
    沟边
    渲染排序
    字符串转整数备录
    沟边
    U3D优化
    Unity中的四个路径
  • 原文地址:https://www.cnblogs.com/ihopenot/p/6006754.html
Copyright © 2020-2023  润新知