初涉值域线段树

其实就是线段树啦

什么是值域线段树

我们(初学者)都知道线段树是拿来维护数列区间的信息的。但是如果我们想要查询的重点在于数值而不是区间信息呢?这时候就要对于值域区间维护线段树了。

例题

bzoj4627: [BeiJing2016]回转寿司

题目大意

给定$n$个数和$L,R$,问其中区间和满足$L<=sum[r]-sum[l-1]<=R$的区间有多少

N≤100000,|Ai|≤100000,0≤L, R≤10^9

题目分析

值域线段树中每个节点代表一个值的区间,其实和基础的线段树差不多。

还有这题由于LR很大,并且没办法离散化,所以还要动态开点线段树。

hint:注意一下数组的范围。

 1 #include<bits/stdc++.h>
 2 typedef long long ll;
 3 const ll INF = 1e10;
 4 const int maxn = 6000035;
 5
 6 struct node
 7 {
 8     int d[2];
 9     ll val;
10     int &operator [](int a)
11     {
12         return d[a];
13     }
14 }a[maxn];
15 int n,l,r,root,tot;
16 ll s[maxn],ans;
17
18 int read()
19 {
20     char ch = getchar();
21     int num = 0;
22     bool fl = 0;
23     for (; !isdigit(ch); ch = getchar())
24         if (ch==‘-‘) fl = 1;
25     for (; isdigit(ch); ch = getchar())
26         num = (num<<1)+(num<<3)+ch-48;
27     if (fl) num = -num;
28     return num;
29 }
30 void update(int &x, ll L, ll R, ll c)
31 {
32     if (!x){
33         x = ++tot;
34         a[x][0] = a[x][1] = a[x].val = 0;
35     }
36     a[x].val++;
37     if (L==R) return;
38     ll mid = (L+R)>>1;
39     if (mid >= c)
40         update(a[x][0], L, mid, c);
41     else update(a[x][1], mid+1, R, c);
42 }
43 ll query(int x, ll L, ll R, ll l, ll r)
44 {
45     if (L <= l&&r <= R) return a[x].val;
46     ll mid = (l+r)>>1, ret = 0;
47     if (L <= mid && a[x][0]) ret += query(a[x][0], L, R, l, mid);
48     if (R > mid && a[x][1]) ret += query(a[x][1], L, R, mid+1, r);
49     return ret;
50 }
51 int main()
52 {
53     n = read(), l = read(), r = read();
54     for (int i=1; i<=n; i++)
55         s[i] = s[i-1]+read();
56     update(root, -INF, INF, 0);
57     for (int i=1; i<=n; i++)
58     {
59         ans += query(root, s[i]-r, s[i]-l, -INF, INF);
60         update(root, -INF, INF, s[i]);
61     }
62     printf("%lld\n",ans);
63     return 0;
64 } 

END

原文地址:https://www.cnblogs.com/antiquality/p/9152760.html

时间: 2024-12-14 07:30:41

初涉值域线段树的相关文章

[BZOJ3065]带插入区间K小值 解题报告 替罪羊树+值域线段树

刚了一天的题终于切掉了,数据结构题的代码真**难调,这是我做过的第一道树套树题,做完后感觉对树套树都有阴影了......下面写一下做题记录. Portal Gun:[BZOJ3065]带插入区间k小值. 这道题的题面其实都提醒怎么做了,维护区间k小值用值域线段树,但要维护一个插入操作,树状数组套主席树也用不了,那么这道题还剩下平衡树可以搞,那就上平衡树吧. 我这里的做法,因为要维护序列的顺序,所以我这里用到替罪羊树套值域线段树:我们在替罪羊树的每个节点都套一颗值域线段树,记录以该节点为根的子树的

bzoj 4627 值域线段树

4627: [BeiJing2016]回转寿司 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 523  Solved: 227[Submit][Status][Discuss] Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 司带给小Z的味觉感受是不一样的,我们定义小Z对每盘寿司都有一个满意度,例如小Z酷爱三文鱼,他对一盘三文 鱼寿司的满意度为10:小Z觉得金枪鱼没有

玲珑oj 1117 线段树+离线+离散化,laz大法

1117 - RE:从零开始的异世界生活 Time Limit:1s Memory Limit:256MByte Submissions:438Solved:68 DESCRIPTION 486到了异世界,看到了一群可爱的妹子比如蕾姆啊,艾米莉亚啊,拉姆啊,白鲸啊,怠惰啊等等!有一天膜女告诉486说她的能力可能不能再用了,因为膜女在思考一个数据结构题,没心情管486了.486说我来帮你做,膜女说你很棒棒哦! 给一个集合,最开始为空(不是数学上的集合)五个操作: 1.插入x2.把小于x的数变成x3

【BZOJ2733】永无乡[splay启发式合并or线段树合并]

题目大意:给你一些点,修改是在在两个点之间连一条无向边,查询时求某个点能走到的点中重要度第k大的点.题目中给定的是每个节点的排名,所以实际上是求第k小:题目求的是编号,不是重要度的排名.我一开始差点被这坑了. 网址:http://www.lydsy.com/JudgeOnline/problem.php?id=2733 这道题似乎挺经典的(至少我看许多神犇很早就做了这道题).这道题有两种写法:并查集+(splay启发式合并or线段树合并).我写的是线段树合并,因为--splay不会打+懒得学.

线段树合并与分裂

http://blog.csdn.net/zawedx/article/details/51818475 由于上面这篇文章讲的很清楚了,不打算再讲一遍......骗访问量也要按基本法 利用这种动态开点的值域线段树可以解决一堆有序集合进行合并/分裂/查询k小的问题,最好用的就是在排序问题中. 例1 bzoj4552 m次排序,每次对一个区间升序或降序排序,最后询问一个位置的值. 有一种比较咸鱼的做法是二分答案然后转化为01序列来做,这里就不说了= = 我们可以把排序好的一坨当做一个有序集合,用一个

hdu 4366 Successor - CDQ分治 - 线段树 - 树分块

Sean owns a company and he is the BOSS.The other Staff has one Superior.every staff has a loyalty and ability.Some times Sean will fire one staff.Then one of the fired man’s Subordinates will replace him whose ability is higher than him and has the h

洛谷P3380 【模板】二逼平衡树(树套树,树状数组,线段树)

洛谷题目传送门 emm...题目名写了个平衡树,但是这道题的理论复杂度最优解应该还是树状数组套值域线段树吧. 就像dynamic ranking那样(蒟蒻的Sol,放一个link骗访问量233) 所有的值(包括初始a数组,操作1.3.4.5的k)全部先丢进去离散化 对于1操作查比它小的数,挑log棵线段树,找区间小于这个数的个数+1,这个还比较好像 操作2就是dynamic ranking,log棵线段树一起加减,像静态主席树求第k小一样跳,操作3 dynamic ranking里也有 操作4先

可持久化专题(一)——浅谈主席树:可持久化线段树

前言 不得不说,可持久化数据结构真是太难了! 由于数据结构这东西真的太玄学了,学这个主席树我真的学了很久. 简介 主席树为什么叫主席树?据说因为它是一个名字缩写为\(HJT\)的神犇发明的,与当时主席的名字缩写一样...... 主席树实质上就是一棵可持久化线段树,它的具体实现可以看下面. 让我们从值域线段树开始说起 要学主席树,我们就要先学值域线段树. 值域线段树的区间存的并不是节点信息,而是在值在某一范围内的数的个数. 如图就是一棵值域线段树,其中1号节点存储的是大于等于1小于等于4的数字个数

[Apio2012]dispatching(派遣)——线段树合并

题面 Bzoj2809 解析 按照贪心策略我们想选尽量多的人,所以就会选费用少的人,那么对于每个节点可以建一棵值域线段树,父亲的线段树由他的所有儿子的线段树合并再单点修改而来,这样就可以快速查询有多少个数满足要求, 线段树上维护人数以及费用和, 考虑到值域有1e9, 而人数只有1e5,我们考虑离散化,因为每个节点都有一棵对应的线段树,所以我们动态开点,以压缩空间.那么接下来的问题就在于如何合并线段树了,我们设要把y号节点合并到x号节点内,分别考虑左右儿子,如果x有左儿子,则向下递归, 如果y号节