zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Misha and Changing Handles
    Garland CodeForces
    Hyperset
    Common Prefixes
    vue笔记整理
    react学习笔记一些整理
    react和vue项目总结
    Vue+elementUi《后台管理系统》前端实现02
    Vue+elementUi《后台管理系统》后台接口准备01
    React+AntdUi实现《好客租房系统》发布房源08
  • 原文地址:https://www.cnblogs.com/ihopenot/p/6006754.html
Copyright © 2011-2022 走看看