
数据结构
猹猹猹
编译错误!
展开
-
CF - 484 | 主席树&区间最大连续和
描述给定n个数据,m个询问,每次询问给出l,r,w,问在区间l到r之间,寻找w个连续数据的,使得它们的最小值最大。分析若仅仅一次询问,很明显可以用单调队列来完成,但在这里是多次询问。首先,找最大值,可以用二分方法,转化为判定[l,r]区间内是否有w个连续数据,最小值为mid;考虑一颗维护区间最大连续和的树,每个位置,若代表的数据大于mid,该位置为1,否则为0,则求该树在[l,r]区间内最大连续字段和即可。因为结果一定是a[i](1<=i<=n),所以二分查找下标,同时只需要建立n颗树原创 2020-06-30 13:49:25 · 220 阅读 · 0 评论 -
牛客 - 骚区间 | set妙用&树状数组
描述给定数组a,长度为1e6,保证a是个排列。给出“骚区间”的定义区间的左端为该区间的次小值,右端为该区间的次大值。求给定数组内有多少个“骚区间”。思路对每个元素判定其作为左、右端点时,另一端点所允许的区间,例如[2,4,1,5,3,6],元素4作为做为左端点时,右端点区间可以是从1或5;3作为右端点时,左端点区间可以时1或5。升序遍历下标,若当前下标是一个右端点对应的左端点可行区间的左端,则把树状数组上该右端点位置+1;若当前下标是一个右端点对应的左端点可行区间的右端+1位置,则把树状数组上该右端原创 2020-06-27 23:16:18 · 267 阅读 · 0 评论 -
HDU - 3642 | 扫描线&重复3次以上矩形面积
描述给定n个立方体,求重复3次以上的总体积。分析题目中z轴数据|z|<=500,所以可以逐层判读,每层就是计算重复覆盖3次以上矩形面积此题要注意的地方:所给坐标为点,离散化后,则线段树上,x点维护的是坐标ls[x]到ls[x+1]间长度。线段树维护的是当前区间覆盖次数,更新方式详间代码update。求面积时不要用line[i].x-line[i-1].x作为当前有效宽。代码#include<cmath>#include<cstdio>#include&原创 2020-06-20 22:35:58 · 186 阅读 · 0 评论 -
HDU - 4553 | 区间合并&最大连续字段和
描述1~n区间初始全部为1,每次申请一段长为x的连续区间,返回最靠左的起点位置。此题要求维护两个树的最大连续字段和。分析记录此题主要还是因为这个区间合并于自己之前写的方式不太一样,查询时先看左子树内是否存在,这样的区间,再去看中间,中间满足就直接返回,最后看右子树。递归结束条件就是当前节点的左端最长大于等于请求的长度。代码#include<cmath>#include<cstdio>#include<cstring>#include<iostream原创 2020-06-20 16:38:34 · 188 阅读 · 0 评论 -
HDU - 4614 | 更新区间为l~n
描述n个位置,初始为0,m个操作操作,两种,一:给定x,y,从x位置开始向右选则y个空位置,这些位置置1,空位置不足则最多到n位置结束即可,输出放置的最左端和最右段,一个也不能放就输出“Can not put any one.”;二:清空x~y区间,输出区间内非空位置个数。分析每次操作的区间是x~n,update(int k,int l)。当前区间在范围内、且全空、且长度小于等于y,则当前区间更新为全1,y -= 长度。代码//题目要求编号为0~n-1#include<cmath>原创 2020-06-19 22:40:07 · 148 阅读 · 0 评论 -
HDU - 4578 | 线段树多种Lz标记 or 相等标记妙用
描述n个数,初始全为0;m次操作,4种,包括:区间加x,区间全部改变为x,区间全乘以x,询问区间内各元素的p次方的总和(1<=p<=3)。分析因为p很小,所以维护区间的1次方和s1、2次方和s2、3次方和s3;设定三个lz标记lza、lzm、lzc,表示加、乘、改操作。分析区间更新操作(区间加要注意更新顺序,len为区间长度)区间加:s3=s3+len∗x3+3∗x∗(s2+x∗s1)s3=s3+len*x^3+3*x*(s2+x*s1)s3=s3+len∗x3+3∗x∗(s2+x∗原创 2020-06-18 18:32:46 · 328 阅读 · 0 评论 -
P4198 楼房重建 | 动态最长上升序列 线段树 区间合并
描述n个点,初始为0,m次操作,每次修改第XiX_iXi个数的权值为Xi/YiX_i/Y_iXi/Yi,并要求输出此时最长上升序列长度。输入1≤XiX_iXi≤n,1≤YiY_iYi≤1e9,1≤n,m≤1e5。最后结果是整个区间内最长的上升序列长度,维护区间的最大值以及最长上升序列的长度,合并时,左区间的序列长度时一定要统计的,然后用左区间的最大值,在右区间中递归寻找,大于左区间最大值的最长上升序列。代码#include<cmath>#include<cstd原创 2020-05-14 22:14:27 · 188 阅读 · 0 评论 -
HDU - 5091 | 线段树扫描线(附模板)
题意给定N个点的x、y坐标,一个可平移的W*H的矩阵,问最多能用这个矩阵框住多少个点。 (1<=N<=10000, 1<=W,H<=40000, -20000<=x,y<=20000, )每个点扩展一个W*H的矩阵,点处在左下角,用线段树扫描线来做。每个矩阵左边为进边,权值为1,右边为负边,权值为-1;线段树维护进、出边的两端点的区间最大值,表示更新此边后最多重叠矩形个数。代码#include<cmath>#include<cstdio原创 2020-05-11 22:39:55 · 256 阅读 · 0 评论