线段树
文章平均质量分 56
线段树
wind__whisper
qwq
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
P4775 [NOI2018] 情报中心(线段树合并)
线段树合并原创 2022-07-29 00:42:30 · 409 阅读 · 1 评论 -
P6773 [NOI2020] 命运(dp、线段树合并)
dp、线段树合并原创 2022-06-30 11:07:42 · 439 阅读 · 0 评论 -
P3293 [SCOI2016]美味
主席树原创 2022-06-01 15:40:51 · 197 阅读 · 0 评论 -
P5327 [ZJOI2019]语言(线段树合并、生成树)
解析 只会扫描线树剖的三只log(悲 考虑对每个 uuu 考虑合法的 vvv 的集合,必然是一个联通块。 进一步的,观察到这个联通块就是由所有经过 uuu 的路径的端点形成的最小生成树。 我们有一个最小生成树的经典结论:最小生成树边权和等于按dfs序排列成圆后邻项距离和除以二,不难发现可以线段树维护。 把所有路径做一个树上差分,再结合线段树合并,即可进行求解了。 用欧拉序 st 表 O(1)O(1)O(1)求LCA,总复杂度 O((n+m)logn)O((n+m)\log n)O((n+m)logn) 代原创 2022-05-27 11:38:56 · 238 阅读 · 3 评论 -
模板:吉司机线段树
区间历史最值原创 2022-05-18 22:26:19 · 449 阅读 · 0 评论 -
CF765F Souvenirs(暴力、线段树)
优雅的暴力原创 2022-05-05 19:37:49 · 341 阅读 · 0 评论 -
P3747 [六省联考 2017] 相逢是问候(欧拉定理、线段树、光速幂)
拓展欧拉定理原创 2022-03-21 00:03:48 · 599 阅读 · 0 评论 -
P4364 [九省联考 2018] IIIDX(线段树、贪心)
很妙的贪心原创 2022-03-18 15:07:51 · 268 阅读 · 0 评论 -
YBTOJ:最短时间(长链剖分、线段树)
长链剖分原创 2022-02-20 13:41:37 · 397 阅读 · 0 评论 -
模板:扫描线
那看似平凡的面积,是多少条线的织物啊 前言 突然发现自己之前没发过扫描线的模板 可能是因为之前的实现太差了 这次感觉实现的还是很不错的, 虽然常数比较大,但是好写啊! 原来扫描线也是可以1A的 线段树上利用zld讲解的维护最小值和最小值数量的方法轻松维护 离散化后边化点的细节现在看其实也没有那么难了 代码 #include<bits/stdc++.h> const int N=4e5+100; const int M=50050; const int mod=1e9+7; #define .原创 2021-11-19 11:34:24 · 436 阅读 · 0 评论 -
模板:线段树标记永久化
为了那不可知的询问永远坚守于此 解析 众所周知线段树的区间修改是需要打懒标记的 多数时候,这个标记在询问子区间时需要下传 而标记永久化,就是指不下传懒标记的一种操作 在某些时候标记不便下传时有所应用 比如zkw线段树和二维线段树等 然而zkw线段树我并不会 还能起到一定的常数优化作用 (这是真的卡常卡疯了) 这个操作是有局限性的 那就是:不可逆性 比如说 标记永久化可以维护区间赋值和维护最大值 但前提是区间赋值必须不小于区间内原来的值 否则就无法操作 细节: pushup的时候一定要把自己身上的懒标记.原创 2021-11-16 08:50:59 · 991 阅读 · 0 评论 -
CF1379F1 Chess Strikes Back (easy version)(鸽笼原理、线段树)
解析 很神奇的一道题 关键在于把22的正方形看成一个单位的转化 由于每个22最多有一个国王 因此每个2*2都一定有一个国王 这是本题的关键 个人感觉这个思想很像鸽笼原理 至于后面的线段树就水到渠成了 代码 #include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long const int N=2e5+100; ll read() { ll x=0,f=1;char原创 2021-11-09 16:56:14 · 255 阅读 · 0 评论 -
P5787 二分图 /【模板】线段树分治(线段树分治、并查集)
关于什么是合理的实现 解析 本题把并查集写在了题面上 然而,我却一直沉浸在一个及其通用的判断二分图的方法中: 一个图是二分图的充要条件是它没有奇环 怎么维护这个玩意?带权并查集! 怎么套线段树分治?可持久化! 就这样,口胡完一个写起来几乎不可写的《正解》后,我却没有勇气把它实现… 因为可持久化的带权并查集再套个线段树…这玩意一听就没200行写不来啊… 而且最关键的是,本大聪明又动了动装着一片大海的脑瓜,发现这个东西似乎是3log了… 然后…就恬不知耻的点进了题解 然后…看完题解…就无地自容的点了出来.原创 2021-11-08 23:46:31 · 273 阅读 · 0 评论 -
模板:二维线段树(线段树套线段树)
问题 给出一个矩形 要求支持以下操作: 1.询问一个子矩形的最值 2.修改某一个单点的值 解析 使用线段树套线段树,来解决二维动态问题 注意这个东西只能支持单点修改,区间查询 区间改直接死翘翘 对于x轴开一个线段树 每个结点对应一个y方向[1,n]的长条 时空复杂度qlogn2qlogn^2qlogn2 单点修改 由于这个矩形可能很大(比如长宽1e5级别) 我们可能无法把整棵线段树存下来 所以使用x方向直接开,y方向动态开点 为什么x方向不动态开点?因为那实在是太不好写了… 那如果长宽1e9级别怎么办?原创 2021-10-25 01:01:35 · 1362 阅读 · 1 评论 -
YBTOJ&洛谷P2839:最大中位数(主席树、二分答案)
遇事不决,二分试试 解析 很好的一道题 真是把主席树玩明白了 一个关于中位数的常用trick: 二分答案mid,把>=mid的看成1,<mid的看成-1,然后看最大子段和是否>=0 然而如果对离散化后的每一个值建一棵小白逛公园那样的线段树显然时空双炸 这里主席树就用上了 注意到关于相邻的值域所建的两棵主席树只有个别值从1变成-1 所以就用主席树优化时空即可 时间复杂度mlogn2mlogn^2mlogn2,空间复杂度nlognnlognnlogn 代码 #include<bi.原创 2021-10-24 17:26:46 · 193 阅读 · 0 评论 -
动态区间第k小:树状数组套权值线段树
解析 如何解决静态区间第k小? 使用主席树就ok啦 辣么如何解决动态区间第k小嘞… 我们想想主席树为啥不能解决动态区间第k小 因为如果改了一个点的值,后面所以的权值线段树都需要修改 单次修改的时空复杂度为nlognnlognnlogn,无法承受 仔细想想,静态的主席树似乎就是一个关于值域的高级一点的前缀和 暴力修改前缀和当然是需要修改O(n)O(n)O(n)个了 但是既然是前缀和,我们为就可以想到用树状数组优化 这样需要修改的东西就变成了O(logn)O(logn)O(logn)个了 具体的说,和树状数组的原创 2021-10-23 22:57:57 · 428 阅读 · 0 评论 -
YBTOJ:采矿战略(线段树维护dp、树链剖分)
文章目录题目描述解析代码 题目描述 所谓线段树维护dp,就是在线段树上维护dp (逃) 解析 把树剖一下后就变成了区间问题 考虑建一棵线段树,每一个结点都是一个背包 这样就能区间查询,也能带修了 这种做法复杂度其实并不理想,是logn*dp合并复杂度 本题背包就是m2lognm^2lognm2logn 但是如果出题人想考这个肯定会在数据范围上放你一条生路啦 (调了半天结果树剖挂了就离谱) 代码 #include<bits/stdc++.h> using namespace std; #de原创 2021-09-24 23:24:04 · 289 阅读 · 0 评论 -
YBTOJ:向量问题(线段树分治、凸包)
文章目录题目描述数据范围解析代码 题目描述 你要维护一个向量集合,支持以下操作: 插入一个向量 。 删除插入的第 x 个向量。 查询当前集合与(x,y)(x,y)(x,y) 点积的最大值是多少。如果当前是空集输出0。 数据范围 n<=2e5,x、y∈[1,2e6]n<=2e5,x、y∈[1,2e6]n<=2e5,x、y∈[1,2e6] 解析 考虑作当前向量的垂线,该线自上而下平移截得的第一个向量对应的点就是答案 如果本题没有删除操作,可以利用一个凸包来维护 但是如何支持删除呢? 考虑原创 2021-09-23 09:41:02 · 226 阅读 · 0 评论 -
模板:线段树优化建图
前言 百川到海,天下归一 解析 线段树优化建图是用于对一个区间的点连边时的优化方法 建一棵in树一棵出树分别往上和下指即可 大概长这样 (pia的洛谷的照片) 建树 正常动态开点即可 void build(int &k,int l,int r){ tr[k=++tot]=(tree){0,0}; if(l==r){ addline(k,l); return; } build(tr[k].ls,l,mid);build(tr[k].rs,mid+1,r); addline(k,原创 2021-09-09 13:52:57 · 297 阅读 · 0 评论 -
模版:线段树合并+线段树分裂
文章目录前言合并代码分裂代码 前言 话说天下之树,分久必合,合久必分 合并 所谓合并,就是把两个树合并 以把B树合并到A树为例 如果A没有该节点,改成B的该节点返回 如果B没有该节点,直接返回 否则递归合并子树,最后更新答案即可 特殊的,如果到了叶子,就把A的答案加上B的答案 代码 void merge(int &a,int b,int l,int r){ if(!a){ a=b;return; } if(!b) return; if(l==r){ tr[a].siz+=tr[b原创 2021-09-06 19:31:56 · 248 阅读 · 0 评论 -
猜数(二分、线段树)
题目描述 对于一个长度为n的数列给出m个描述 每一个描述给出一个区间[a,b]的最小值的x 求从第几个描述开始矛盾 解析 本题关键是一个关于矛盾的充要条件: 如果存在一个最小值x,其所在的区间的交集(就是它真正可以存在的区间)是比x大的所有最小值的区间的并集的子集,那么就会矛盾(因为x肯定在那些区间中的一个里,那么那个区间的最小值就应该是x了) 知道这个之后后面就好做了 把所有区间按最小值降序排序 二分出现矛盾的位置mid 每次按新顺序考虑mid之前的描述 用线段树维护之前所有的并集并查询交集 判断是否原创 2021-06-12 16:21:01 · 180 阅读 · 0 评论
分享