线段树
Sxy_Limit
活着.
展开
-
CF911G Mass Change Queries
题目大意给出一个序列,支持区间将某个数变为某个数,输出最终的序列.分析序列中的元素只有 100100100 种,所以直接线段树上每个节点记录每个数出现的次数就好了.但是,这样的做法时间复杂度并不优秀.那么就从这个输出去考虑,可以发现在最终结果前没有必要知道每个点确切的值,那么考虑对每一种数建一颗线段树,将一种颜色变为令一种颜色只需要在原来的线段树中将修改区间部分分裂出来,在合并到变成的颜...原创 2020-04-10 14:01:36 · 139 阅读 · 0 评论 -
P6242 【模板】线段树 3
吉老师线段树模板题,如果想要知道更多可以去看看2016年的国集论文.分析先来看5个操作(第一感觉):区间加,只要用懒标记搞一下就好了.区间取min,吉老师线段树基本操作,记录一下最大值,最大值出现次数,严格次大值就好了.区间和,直接维护就好了.区间max,已经维护了.区间历史max,维护一下最大加标记就好了.然后您就可以得到30分的好成绩.考虑一下这个做法有什么问题.可以发...原创 2020-04-07 10:11:59 · 238 阅读 · 0 评论 -
P2824 [HEOI2016/TJOI2016]排序(在线做法)
分享一种本题不用STL的在线做法.题目大意给出一个 111 到 nnn 的排列,区间排序和单点查询.分析本题有一种通过二分做到的 O(mlog22n)\mathcal{O}(mlog_2^2n)O(mlog22n) 的做法,但是理解起来比较麻烦,而且时间复杂度也比较高,而且只可以查询一个数,甚至不可以在线做,显然这个方法并不优秀,那么是否存在一种容易理解且有着优秀时间复杂度的做法呢,这显...原创 2020-03-23 17:22:19 · 191 阅读 · 0 评论 -
P6166 [IOI2012]scrivener
题目大意给出一个空字符串支持在末尾加上一个字符,查询某个位置的字符,回到 kkk 个操作前.分析显然的可持久化数组,可以通过可持久化线段树实现,为了方便处理,开始的区间是 111 到 100000010000001000000 开始,这样保证不会出问题,加上一个数就直接单点修改,查询也只要直接单点查询,对于每次修改对于修改的区间部分产生一个新的版本,其他仍然用之前版本的部分.代码#inc...原创 2020-03-18 20:25:16 · 160 阅读 · 0 评论 -
P4175 [CTSC2008]网络管理
题目大意给出一棵树,每个点有一个权值,支持查询树链上第 kkk 大数和单点修改.分析先把修改操作去掉开始(题目),不带修改树链第 kkk 大,要查询第 kkk 大就很容易想到用一些数据结构维护(废话),例如权值线段树,平衡树等等.先从一个看似不相关的问题开始考虑,计算一条树链上所有数的和需要怎么办?很显然这个东西可以树剖一下,再用前缀和优化,可以做到 O(log2N)\mathcal{O...原创 2020-03-10 19:47:01 · 159 阅读 · 0 评论 -
P6157 有趣的游戏
本篇题解不需要维护严格前四大值,也不需要会STL,适合各种语言的选手看思路.题目大意给出一颗有点权的无根树,支持单点修改(加上一个数),在树链上插叙两个点的点权(wi,wjw_i,w_jwi,wj)使得 wimod wjw_i \mod w_jwimodwj 最大,且 wi≠wjw_i \not= w_jwi=wj,以及在去掉这两个点后的整颗树上查询两个点的点权(wq,wp...原创 2020-03-03 14:43:08 · 278 阅读 · 0 评论 -
P5826 【模板】子序列自动机
不会用STL的路过题目大意给出一个序列 aaa 和一些序列,需要判断这些序列是否是 aaa 的字序列.分析这篇文章不会用到vector,保证可以让pascal等语言的用户也看懂并且可以轻松实现.序列自动机如何快速判断一个序列是否是另一个序列的子序列,这时就可以用到序列自动机了,对于暴力的做法可以枚举需要查询的序列的第 iii 个位置,在用一个类似指针的东西枚举在原序列中的下一个相等的位...原创 2020-02-29 18:47:18 · 220 阅读 · 0 评论 -
P4247 [清华集训2012]序列操作
题目大意给出一个序列,支持区间加,区间变为相反数,查询区间中取 ccc 个数的乘积的所有方案的总和.分析先从没有修改开始,查询区间中选 ccc 个数乘积的所有方案的总和,ccc 的范围很小,所以可以想到用线段树维护,对于每个节点维护一个数组 fff,fif_ifi 表示这个节点的区间中选 iii 个数的乘积的所有方案的总和,至于合并,可以枚举两颗子树中选取的数的个数,然后相乘计算贡献(相当...原创 2020-02-28 20:20:19 · 167 阅读 · 0 评论 -
P1975 [国家集训队]排队
题目大意给出一个序列 hhh,支持交换其中的两数,求出每一时刻的逆序对个数.分析求逆序对是 O(Nlog2N)O(N\log_2N)O(Nlog2N) 的,有 MMM 个操作,如果暴力求的话时间复杂度就是 O(MNlog2N)O(MN\log_2N)O(MNlog2N) 虽然数据范围不大,但是还是可能因为评测机浮动而TLE,所以就不要想着折腾这些东西了,还是要用一些正经点的方法去过这...原创 2020-02-24 19:03:50 · 170 阅读 · 0 评论 -
CF1313C Skyscrapers
题目大意给出一个长度为 NNN 的序列 aaa 需要构造出一个长度为 NNN 的序列 hhh 使得 ∀i∈[1,N]\forall i \in [1,N]∀i∈[1,N],∄∀j∈[1,i),k∈(i,N],hj≥hi≤hk\nexists \forall j \in [1,i),k \in (i,N],h_j \geq h_i \leq h_k∄∀j∈[1,i),k∈(i,N],hj≥hi...原创 2020-02-24 08:54:59 · 269 阅读 · 0 评论 -
线段树入门
本文会比线段树学习笔记中写得更详细(可能).线段树(Segment Tree)入门线段树的作用&原理线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化...原创 2020-02-22 17:22:59 · 100 阅读 · 0 评论 -
CF383C Propagating tree
这应该属于一个比较麻烦的数据结构处理树上问题.题目大意给出一颗根节点编号为 111 的树,对于一个节点修改时在它的子树中对于深度奇偶性相同的节点加上这个权值,不同则减去这个值,单点查询.分析先给出这个问题的弱化版:给出一颗根节点编号为 111 的树,对于一个节点修改时在它的子树中节点也加上这个权值,单点查询.对于上面这个问题就好处理很多了,DFS序有一个性质,又称括号定理,在树中这个就...原创 2020-02-19 15:57:03 · 141 阅读 · 0 评论 -
P5368 [PKUSC2018]真实排名
PKUSC签到题题目大意给出一个长度为 NNN 的序列,序列中有 KKK 个数会乘二,对于每个数计算在乘二后大于等于这个数的个数与乘二前没有发生变化的方案数.分析思路很清晰,可以将答案分为两个部分计算当前位置的数没有乘二时当前位置没有乘二,所以所有大于等于自己的元素是否乘二每有影响,如果一个数小于这个数的一半(不可以等于)那么这个数如果乘二也不会产生影响.于是可以计算出大于等于这个数...原创 2020-02-18 17:40:18 · 153 阅读 · 0 评论 -
P2468 [SDOI2010]粟粟的书架
这道题分为两个部分Part1(R,C≤200R,C\le 200R,C≤200,M≤200000M \le 200000M≤200000)前置芝士前缀和(后缀和,二维前缀和):可以预处理一下数据.二分查找:可以在较短的时间内找出答案.具体做法可以发现R,CR,CR,C不大,只有200200200,于是可以先预处理出一个数组a[i][j][k]a[i][j][k]a[i][j][k]...原创 2020-02-12 19:28:10 · 105 阅读 · 0 评论 -
P3168 [CQOI2015]任务查询系统
介绍本题的两种做法:方法1前置芝士线段树:一个很重要的数据结构.树状数组:一个很重要的数据结构.具体实现区间修改,单点查询很容易就会想到树状数组了,至于查询前k个数的和又可以丢给权值线段树去干,所以第一种很显然的方法就是树状数组套一个线段树实现.代码#include<bits/stdc++.h>#define REP(i,first,last) for(int i...原创 2020-02-08 10:54:13 · 157 阅读 · 0 评论 -
SP10628 COT - Count on a tree
主席树的综合运用题.前置芝士可持久化线段树:其实就是主席树了.LCA:最近公共祖先,本题需要在log2N\log_2Nlog2N及以内的时间复杂度内解决这个问题.具体做法主席树维护每个点到根节点这一条链上不同树出现的次数,然后发现这个东西是可以相减的,于是这条链上每个数出现的次数就变成了sum[u]+sum[v]−2∗sum[LCA(u,v)]sum[u]+sum[v]-2*su...原创 2020-01-31 19:22:07 · 139 阅读 · 0 评论 -
P1383 高级打字机
一道非常基础的可持久化数据结构题.前置芝士可持久化线段树:实现的方法主要是主席树.具体做法这个基本就是一个模板题了,记录一下每一个版本的字符串的长度,在修改的时候就只要在上一个版本后面加上一个字符,撤销操作就之久回到x个版本前就好了.用主席树维护,每次修改和查询都是log2N\log_2Nlog2N的,且可以做到在线.代码#include<bits/stdc++.h>...原创 2020-01-31 16:07:25 · 123 阅读 · 0 评论 -
P3078 [USACO13MAR]扑克牌型Poker Hands
本题有O(N)O(N)O(N)的优秀做法,但是因为在考场上不一定能想到,就来分享一种O(Nlog2N)O(N\log_2N)O(Nlog2N)的做法.虽然有点慢,但是可以过.前置芝士线段树:提高组及以上必备内容,不会的同学可以学习一下.具体做法只要会线段树就珂以了,是不是很简单.先考虑贪心,连续的一定是一次去掉,不可能分成多次去取.于是答案就是每一行连续的段数之和.如图,第...原创 2020-01-25 18:22:55 · 270 阅读 · 0 评论 -
P6012 【模板】线段树分裂
线段树分裂用到的地方确实并不多,luogu上以前也没有这道模板题,所以就出了一道,实在是想不出怎么出模板了,所以这道题可能可以用一下其他的算法水过去....原创 2020-01-26 08:35:19 · 527 阅读 · 3 评论 -
CF438D The Child and Sequence
一道CF线段树好题.前置芝士1.线段树:一个很有用数据结构.2.势能分析:用来证明复杂度,其实不会也没什么关系啦.具体做法不难发现,对于一个数膜一个大于它的数后,这个数至少减少一半,每个数最多只能被膜log2N\log_2Nlog2N次,所以就可以暴力修改了,如果当前子树的最大值也比膜数要大,那这个膜数肯定就没什么用了,所以可以再记录一个区间最大值.代码#...原创 2020-01-17 19:40:58 · 69 阅读 · 0 评论 -
P2824 [HEOI2016/TJOI2016]排序
一道十分神奇的线段树题,做法十分的有趣.前置芝士1.线段树:一个十分基础的数据结构,在这道题中起了至关重要的作用.2.一种基于01串的神奇的二分思想:在模拟赛中出现了这道题,可以先去做一下,这样可能有助于理解.具体做法可以发现sort是非常慢的,每次多要O(Nlog2N)O(N\log_2N)O(Nlog2N),最后的时间复杂度为O(MNlog2N)O(MN\log...原创 2020-01-15 20:02:14 · 94 阅读 · 0 评论 -
P3740 [HAOI2014]贴海报
区间覆盖怎么能不用线段树数呢(线段树又短又好写).可以发现每次覆盖的是一个区间,但是这个区间很大所以需要离散化.如果直接离散化会出现一些很奇怪的情况:如这样一个图,在普通的离散化后会变成:红色的海报本来是可以看见的但是在离散化就看不见了,所以,在离散化时,如果两个相邻的值的差不是1(即中间有缝隙),需要在中间空一个位置出来.下面放上完整的代码:#include<bits/std...原创 2020-01-04 13:25:20 · 106 阅读 · 0 评论 -
P3531 [POI2012]LIT-Letters
求逆序对怎么能少了线段树呢.建一棵权值线段树,倒着将每个数放入,每放入一个数之前先查询这颗线段树内有多少比它小的数,最后统计起来(注意用long long),废话不多说,直接上代码.#include<bits/stdc++.h>#define rap(i,first,last) for(int i=first;i<=last;++i)#define sing(i,firs...原创 2020-01-04 10:20:17 · 124 阅读 · 0 评论 -
线段树学习笔记
线段树是什么线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化让空间压缩。以上内容摘抄自百度百科(虽然这句话并没有讲到什么,只是知道了线段树NB)...原创 2020-01-04 09:38:35 · 348 阅读 · 0 评论 -
P2253 好一个一中腰鼓!
就这道题的理论难度来说绿题是有点低了,但是这道题的实际难度来看,顶多黄题,所以建议加强数据或出数据升级版.暴力的方法想必都会,所以来讲一下正解.看到标签是线段树,所以正解就是线段树了(毫无问题的逻辑).这颗线段树上的节点如果只记录区间中的最长的符合条件的区间长度想必是无法转移的,所以需要记录一下的量:当前区间最左端开始的最长的符合条件的区间的长度当前区间最右端开始的最长的符合条件的区间...原创 2020-01-02 20:05:37 · 63 阅读 · 0 评论 -
P1637 三元上升子序列
暴力是三重循环,枚举三个数判断是否组成三元上升子序列,但是N有30000,O(N3)直接枚举肯定是会T的,不难发现当中间的数为a[i]时它所贡献出的三元上升子序列的个数为1~i-1中比a[i]小的数的个数乘i+1~N中比a[i]打的数的个数.这很容易就会想到逆序对(虽然还是有点不同),逆序对的常用方法归并没法求出每个数的逆序对个数(可能可以只不过我不会),所以就很容易想到线段树.做法和权值线段...原创 2020-01-01 10:23:38 · 340 阅读 · 0 评论