首页 > TAG信息列表 > 线段

【学习笔记】可持久化权值线段树--主席树 (静态)

001 前置芝士 (1)动态开点线段树 (2)动态开点维护权值线段树 (3)可持久化数组(可持久化线段树) (4)掌握权值线段树以及查询全局第k大/小值 002 动态开点 我们知道,开一棵线段树数组所需空间为4*MAXN,当MAXN过大时,显然会MLE,那有没有什么优化空间的方法呢? 当然有(废话,要是没有我还写什么) 动态开点

线段树的奇幻科技——线段树上二分

线段树如果加上一个操作,询问在 \([l,r]\) 中第一个大于或小于某个数的位置,你会怎么做。 显然的一种想法是,维护一个区间 \(\min,\max\) 然后二分长度,每次 Query。但是明显是两只 \(\log\) 的,太慢啦,有没有快一点的方法呢。当然有。 还是维护区间 \(\min, \max\) 我们假设我们要找到

线段树优化最长上升子序列问题

最长上升子序列 给定一个长度为 $N$ 的数列,求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数 $N$。 第二行包含 $N$ 个整数,表示完整序列。 输出格式 输出一个整数,表示最大长度。 数据范围 $1 \leq N \leq 1000$,${−10}^{9} \leq \text{数列中的数} \leq {10

2984. 线段

题意 在二维平面内有 n 条线段,请你编写一个程序,判断是否存在一条直线满足将这 n 条线段投影到该直线上后,所有的投影线段至少具有一个公共点。 思路 转化题意 我们发现如果可以找到一个直线与所有的线段都相交; 那么所有的线段的投影一定都交于这个直线与其垂线的垂足处。 那么问题

【学习笔记】线段树维护单调栈

线段树维护单调栈 在经过一晚上和某考试题的奋斗后,我终于确定了那道题不能用线段树维护单调栈做,同时对这个算法有了更深的理解。 前言: 众所周知,线段树啥都能干。 求出最长上升/下降子序列,肯定可以 \(O(n)\) 单调栈跑一遍。但是如果套上单点修改和多次询问,\(O(n ^ 2)\) 的复杂度可

HDU 5266 pog loves szh III 题解

错误示范:倍增+暴力 开始看到这题时限 6s 本来想着来一发暴力区间倍增 LCA,后来发现是多测之后自然凉凉,准保 T 飞。 然而没有 T,acc 上 RE(ReCoders),HDU WA。 正解:树剖+线段树 维护区间你想到了什么?当然是线段树啊! 分别考虑线段树的 build 和 query 操作。 build:递归,然后 pushup 维护

NOIP复习(三)线段树

普通线段树 我的线段树 \(debug\)(记录一下做题时犯的错误): 检查 \(build\) 函数是否调用。\(\to segmentation~fault\) 区间操作 \(ql\) 是否有可能大于 \(qr\to segmentation~fault\)。 结构体中元素初值问题(是否赋初值,懒标记初值是否与题目操作冲突)\(\to\) 输出可能变得极大 动

线段树上状压(位运算)

洛谷P1558 分析: 颜色类型只有 \(30\) 种,可以利用二进制进行状压。 线段树维护一个二进制数表示区间的颜色为哪一种,将这个区间的颜色进行状压,每一种颜色对应二进制数的某一位。合并区间时将两个子节点的数按位或即可,题目区间修改为直接覆盖,统计答案时只需统计对应区间的数有多少个

可持久化线段树

现想现写的,没有借鉴别人的任何东西。 可持久化线段树1 考虑不会变得太多,每次该值操作只会改变一个位置的值,其它位置是可以继承的。如果用数组,那就是下标继承。如果把数组分成 \(2\) 半,那改一个值,就一半继承,另一半重新赋值。而用线段树,就可以做到区间继承 \(\log\) 的时间复杂度。

摩尔投票法学习笔记

摩尔投票法 绝对众数 :数列内出现次数超过数列长度一半的数。 摩尔投票法是一个求绝对众数的利器。 例题 1. 洛谷 P2397 yyy loves Maths VI (mode) 摩尔投票法板子题。 假设现在有一个小房子,有一个新的数 \(x\) 需要进来。 如果房子是空的,那么 \(x\) 就直接进去; 如果房子内的数和

XM6138 分糖果(线段树)

XM6138 分糖果 stO jc Orz 解题思路 很神奇的一题。 看到题目首先想到的就是二分答案。那么问题转化为了如何验证一个答案 \(x\)。 我们定义函数 \(f_{i,j}\) 表示考虑前 \(i\) 个小朋友,是否可以分成 \(j\) 段,使得每一段都满足和小于 \(x\)。这个函数很好转移: \[f_{i,j}\leftarrow

扫描线

扫描线的一些经典应用:求n个矩形的面积并和周长并。 面积并(P5490 【模板】扫描线) 首先扫描线的思想就是假设有一条无限长度的线从一个方向到另一个方向扫一遍整个图形,这样这个图形就变成了一大堆小矩形,然后算每个矩形的面积。这个过程可以上棵线段树。 怎么搞?首先我们随便找一维(

树的难题 BJOI2017 点分治 单调队列

P3714 [BJOI2017]树的难题 没时间码 先口胡。 明显有一个n^2的暴力。可以拿到20分。 链的情况也非常容易 一个简单的单调队列 就可以解决 当然可以暴力的采用线段树。 这样可以拿到40分。 对于60分 直接考虑线段树合并 利用线段树维护每种颜色的最大值 由于不考虑边数问题。 对于8

题解 AT5635 Shortest Path on a Line(线段树优化建图)

题解 AT5635 Shortest Path on a Line Description 题目传送门 题面翻译 有一张有 \(N\) 个点,编号为 \(1 - N\) 的无向图。 做 \(M\) 次操作,每次操作给出三个正整数 \(L,R,C\),对于每对 \(≥L\) 且 \(≤R\) 的整数对 \((S,T)\) ,在 \((S,T)\) 之间添加一条长度为 \(C\) 的边 完成操

[NOI2022] 众数 题解

权值线段树 权值线段树即一种线段树,以序列的数值为下标。 权值线段树维护一列数中数的个数。 也就是说,我们的权值线段树就是用线段树维护了一堆桶。 这就是权值线段树的概念。 权值线段树维护的是桶,按值域开空间,维护的是个数。 [NOI2022] 众数 这个题:我们可以不是很显然地知道:众数

[洛谷P5787] 线段树时间分治

题目大意 给 \(n\) 个点 \(m\) 条边,在 \(k\) 时间内,第 \(i\) 条边只在 \([l_i+1,r_i]\) 的时间范围内存在。对于每个 \(i\leq k\),输出 \(i\) 时刻这个图是否是二分图。 题解 因为每条边只在一个范围的时间内存在,我们可以对时间轴建线段树,线段树的每个结点维护一个vector,里面存这个

NOI 2022 众数

1.前言 首先是:关于 \(\rm deque\) ,他死了但没有完全死。 然后是这个大样例说实话有点离谱,最初我在写 \(75\ \rm pts\) 部分分的时候,我动态开点线段树的 \(\rm insert\) ,没有处理好可能会有点被重复使用。我当时没意识到这个问题,就在操作四的时候人为对两个序列做了个启发式合并(不

线段树

线段树真是太强啦! 用途 线段树不同与树状数组,他支持单点查询,单点修改,区间修改,区间查询,需要 \(4\) 个函数进行,分别为 \(build,updata,query,lazy\) 组成,即搭建,更新,查询,懒惰数组。 build 建树 定义一个数组,我们称为 \(tree\) 对于 \(tree_i\) 我们同样保留 \(4\) 个元素

模拟赛 矩形 (扫描线,三维偏序,线段树合并,并查集,线段树上二分)

PRO 题目大意:给定$N$个矩形,求连通块个数。($1 \leq N,x_1,x_2,y_1,y_2 \leq 100000$) SOL 乍一看就能知道是扫描线,不过这题的细节恐怖的要命。 (std同样看不懂,自己魔改了一下) 首先把完全相同的矩形去掉。 之后咱们可以发现,被其他矩形完全包含的小矩形对答案没有任何贡献,所以可以去

线段树 C++实现 树形式

网上看了一圈,看到几个都是用数组实现的 我用树结构重写了一遍 #ifndef SEGMENTTREE_H #define SEGMENTTREE_H #include <vector> template<typename T> class SegmentTree { public: SegmentTree(std::vector<T> &a) { int N = a.size(); this-

Solution - NOI 2022

游记 目前只有两个题题解(代码没有),啥时候数据出了我再来补剩下的。 众数 Solution 有个题叫「POI2014」Couriers,这个题启示我们实际上问题等价于询问哪个数出现次数最多,最后只需要判断是否超过一半即可。 考虑线段树,对于一个序列,开一棵线段树维护上面的权值,单个序列的查询可以在线

相似

相似形  放缩与相似形 形状相同的图形叫相似的图形,或者叫相似形 ps:大小相同的两个相似形,它们可以重合,这时它们是全等形 如果两个多边形是相似形,那么这两个多边形的对应角相等,对应线段成比例ps:当两个相似的多边形是全等形时,它们的对应边的长度的比值都是1 边数相同的多边形

线段树

https://www.luogu.com.cn/problem/P3372 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 #define lson l,mid,rt<<1 5 #define rson mid+1,r,rt<<1|1 6 #define ll long long 7 const int mac=1e5+50; 8 ll tree[m

利用OSGBLab对建筑进行立面出图

利用OSGBLab对倾斜摄影的建筑进行立面出图 OSGBLab 实景三维小助手【微信公众号OSGBLab】     OSGBLab除了能输出顶视的真正射DOM,还能选定范围进行立面出图。这对于立面绘图工作者来说就是一个非常得力的助手了,因为是真实尺寸,直接在图上绘制就能很方便的

势能线段树

势能线段树 什么是势能线段树 所谓势能线段树,是指在懒标记无法正常使用的情况下,暴力到叶子将线段树当成数组一样用进行修改。 大概就是先暴力,在暴力到一个状态的时候再用lazy标记。 D. Lowbit 题意: 一个数组,两个操作 1 L R, add lowbit(ai) each ai in the interval [L,R]. 2 L