值域线段树 bzoj 4627
2017-05-16 14:10
253 查看
这是题目链接4627: [BeiJing2016]回转寿司
题目大意:
给定n个数,求有多少个字段和在 满足 L<=sum<=R;
解题思路
需要解这个题目,需要有线段树加可持续化的思想,但是这个题目只需要上一棵线段树的信息,所以可以不用主席树,只要用到值域线段树。那么,这样就可以把问题转化为:
先处理处前缀和。 求 L<=sum[j]-sum[i]<=R (0 <=i < j<=n) 有多少个?
那么我们可以用值域线段树搞一下,线段树节点存值的个数,每次把前缀和这个值插入,每次查询,原问题就等同于 当前线段树中有多少个值是在 [ sum[j]-R , sum[j]-L ] 这个区间,
意思就是,每次把上一个前缀和插入需要计算一下上一棵线段树值在[ sum[j]-R , sum[j]-L ] 个数。
#include <cstdio> #include <cstring> #include <cstdlib> #include <vector> #include <iostream> using namespace std; typedef long long int LL; const LL INF=10000000000ll; const int maxn=100000*32; struct ACM { struct Node { LL val; int lson,rson; }seg[maxn]; int sz; int newnode() { sz++; seg[sz].val=0; seg[sz].rson=-1; seg[sz].lson=-1; return sz; } void init() { sz=-1; } void update(int &root,LL l,LL r,LL val) { if(root==-1) root=newnode(); seg[root].val++; if(l==r) return ; LL mid=(l+r)>>1; if(val<=mid) update(seg[root].lson,l,mid,val); else update(seg[root].rson,mid+1,r,val); } LL query(int root,LL l,LL r,LL ql,LL qr) { if(root==-1) return 0; if(l==ql&&r==qr) return seg[root].val; LL mid=(l+r)>>1; if(qr<=mid) return query(seg[root].lson,l,mid,ql,qr); else if(ql>mid) return query(seg[root].rson,mid+1,r,ql,qr); else return query(seg[root].lson,l,mid,ql,mid)+query(seg[root].rson,mid+1,r,mid+1,qr); } /** void debug(int i) { if(i==-1) return ; printf("node=%d val=%lld lson=%d rson=%d\n",i,seg[i].val,seg[i].lson,seg[i].rson); debug(seg[i].lson),debug(seg[i].rson); } */ }AC; int main() { int n,L,R,root=-1; scanf("%d%d%d",&n,&L,&R); LL sum=0,ans=0; AC.init(); for(int i=1; i<=n; i++) { int num; scanf("%d",&num); AC.update(root,-INF,INF,sum); sum+=num; ans+=AC.query(root,-INF,INF,sum-R,sum-L); } printf("%lld\n",ans); return 0; }
相关文章推荐
- 值域线段树 bzoj 4627
- BZOJ4627 回转寿司 值域线段树
- BZOJ 4627: [BeiJing2016]回转寿司【前缀和,值域线段树
- BZOJ4627 回转寿司(值域线段树)
- bzoj 4627 值域线段树
- BZOJ 2124 浅谈线段树动态维护双HASH判值域回文串
- BZOJ 3218(a + b Problem-二分图套值域线段树)
- BZOJ 3218(a + b Problem-二分图套值域线段树)
- bzoj 4627: [BeiJing2016]回转寿司 线段树
- bzoj-4627 [BeiJing2016]回转寿司 hash+权值线段树
- BZOJ 3339 Rmq Problem【离线,值域线段树
- bzoj 4627: [BeiJing2016]回转寿司 -- 权值线段树
- Bzoj1798 Ahoi2009行星序列 双标记线段树
- BZOJ 4094 [Usaco2013 Dec]Optimal Milking 线段树
- BZOJ4597 SHOI2016随机序列(线段树)
- bzoj 2653 二分答案+可持久化线段树
- BZOJ 2243: [SDOI2011]染色 (树链剖分+线段树合并)
- 【BZOJ3531】旅行(树链剖分,线段树)
- bzoj 4582: [Usaco2016 Open]Diamond Collector (单调队列+线段树)
- bzoj 4771: 七彩树 树链的并+可持久化线段树