![](https://img-blog.csdnimg.cn/20190918140145169.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
线段树
文章平均质量分 56
线段树
wind__whisper
qwq
展开
-
P4775 [NOI2018] 情报中心(线段树合并)
线段树合并原创 2022-07-29 00:42:30 · 276 阅读 · 1 评论 -
P6773 [NOI2020] 命运(dp、线段树合并)
dp、线段树合并原创 2022-06-30 11:07:42 · 283 阅读 · 0 评论 -
P3293 [SCOI2016]美味
主席树原创 2022-06-01 15:40:51 · 104 阅读 · 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 · 132 阅读 · 3 评论 -
模板:吉司机线段树
区间历史最值原创 2022-05-18 22:26:19 · 331 阅读 · 0 评论 -
CF765F Souvenirs(暴力、线段树)
优雅的暴力原创 2022-05-05 19:37:49 · 241 阅读 · 0 评论 -
P3747 [六省联考 2017] 相逢是问候(欧拉定理、线段树、光速幂)
拓展欧拉定理原创 2022-03-21 00:03:48 · 426 阅读 · 0 评论 -
P4364 [九省联考 2018] IIIDX(线段树、贪心)
很妙的贪心原创 2022-03-18 15:07:51 · 190 阅读 · 0 评论 -
YBTOJ:最短时间(长链剖分、线段树)
长链剖分原创 2022-02-20 13:41:37 · 267 阅读 · 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 · 372 阅读 · 0 评论 -
模板:线段树标记永久化
为了那不可知的询问永远坚守于此解析众所周知线段树的区间修改是需要打懒标记的多数时候,这个标记在询问子区间时需要下传而标记永久化,就是指不下传懒标记的一种操作在某些时候标记不便下传时有所应用比如zkw线段树和二维线段树等然而zkw线段树我并不会还能起到一定的常数优化作用 (这是真的卡常卡疯了)这个操作是有局限性的那就是:不可逆性比如说标记永久化可以维护区间赋值和维护最大值但前提是区间赋值必须不小于区间内原来的值否则就无法操作细节: pushup的时候一定要把自己身上的懒标记.原创 2021-11-16 08:50:59 · 819 阅读 · 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 longconst int N=2e5+100;ll read() { ll x=0,f=1;char原创 2021-11-09 16:56:14 · 176 阅读 · 0 评论 -
P5787 二分图 /【模板】线段树分治(线段树分治、并查集)
关于什么是合理的实现解析本题把并查集写在了题面上然而,我却一直沉浸在一个及其通用的判断二分图的方法中:一个图是二分图的充要条件是它没有奇环怎么维护这个玩意?带权并查集!怎么套线段树分治?可持久化!就这样,口胡完一个写起来几乎不可写的《正解》后,我却没有勇气把它实现…因为可持久化的带权并查集再套个线段树…这玩意一听就没200行写不来啊…而且最关键的是,本大聪明又动了动装着一片大海的脑瓜,发现这个东西似乎是3log了…然后…就恬不知耻的点进了题解然后…看完题解…就无地自容的点了出来.原创 2021-11-08 23:46:31 · 156 阅读 · 0 评论 -
模板:二维线段树(线段树套线段树)
问题给出一个矩形要求支持以下操作:1.询问一个子矩形的最值2.修改某一个单点的值解析使用线段树套线段树,来解决二维动态问题注意这个东西只能支持单点修改,区间查询区间改直接死翘翘对于x轴开一个线段树每个结点对应一个y方向[1,n]的长条时空复杂度qlogn2qlogn^2qlogn2单点修改由于这个矩形可能很大(比如长宽1e5级别)我们可能无法把整棵线段树存下来所以使用x方向直接开,y方向动态开点为什么x方向不动态开点?因为那实在是太不好写了…那如果长宽1e9级别怎么办?原创 2021-10-25 01:01:35 · 987 阅读 · 1 评论 -
YBTOJ&洛谷P2839:最大中位数(主席树、二分答案)
遇事不决,二分试试解析很好的一道题真是把主席树玩明白了一个关于中位数的常用trick:二分答案mid,把>=mid的看成1,<mid的看成-1,然后看最大子段和是否>=0然而如果对离散化后的每一个值建一棵小白逛公园那样的线段树显然时空双炸这里主席树就用上了注意到关于相邻的值域所建的两棵主席树只有个别值从1变成-1所以就用主席树优化时空即可时间复杂度mlogn2mlogn^2mlogn2,空间复杂度nlognnlognnlogn代码#include<bi.原创 2021-10-24 17:26:46 · 108 阅读 · 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 · 263 阅读 · 0 评论 -
YBTOJ:采矿战略(线段树维护dp、树链剖分)
文章目录题目描述解析代码题目描述所谓线段树维护dp,就是在线段树上维护dp(逃)解析把树剖一下后就变成了区间问题考虑建一棵线段树,每一个结点都是一个背包这样就能区间查询,也能带修了这种做法复杂度其实并不理想,是logn*dp合并复杂度本题背包就是m2lognm^2lognm2logn但是如果出题人想考这个肯定会在数据范围上放你一条生路啦(调了半天结果树剖挂了就离谱)代码#include<bits/stdc++.h>using namespace std;#de原创 2021-09-24 23:24:04 · 170 阅读 · 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 · 139 阅读 · 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 · 189 阅读 · 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 · 160 阅读 · 0 评论 -
猜数(二分、线段树)
题目描述对于一个长度为n的数列给出m个描述每一个描述给出一个区间[a,b]的最小值的x求从第几个描述开始矛盾解析本题关键是一个关于矛盾的充要条件:如果存在一个最小值x,其所在的区间的交集(就是它真正可以存在的区间)是比x大的所有最小值的区间的并集的子集,那么就会矛盾(因为x肯定在那些区间中的一个里,那么那个区间的最小值就应该是x了)知道这个之后后面就好做了把所有区间按最小值降序排序二分出现矛盾的位置mid每次按新顺序考虑mid之前的描述用线段树维护之前所有的并集并查询交集判断是否原创 2021-06-12 16:21:01 · 103 阅读 · 0 评论