线段树
Wuliwuliii
谁无暴风劲雨时,守得云开见日明!
展开
-
Art Class【HDU-6888】【吉司机线段树】
题目链接 有一张二维平面,现在全是空白的,我们的操作是给为左下角,为右上角的面涂黑,现在我们想知道所有的黑色块的周长。 可以发现对于上部和下部的周长我们可以利用区间覆盖来进行计算,但是竖着的边我们该如何计算呢?容易想到的是,我们可以通过把“区间点”变成“区间块”这样的做法,使得原本表示的区间点,变成表示的区间块,表示块第到第。然后我们求的就是任意相邻两块之间的高度差之和。 这个东西可以怎样维护呢?我们易发现,只有变大才会改变这个答案,所以其实就是维护最大值的这样一个操作。 那么对于区...原创 2020-09-23 21:33:58 · 525 阅读 · 0 评论 -
Three Occurrences【CF-1418G】【线段树】
题目链接 题意:有一个长度为N的数组,现在我们要查询合法区间的数量,合法区间定义为“在区间中出现的数值都是刚好只出现3次的区间”。譬如“1 1 2 2 1 2”是一个合法区间,每个数值都恰好出现三次。 那么,我们可以知道一点,我们定义为值为i的数在此之前第j次出现的位置(倒叙的),我们只需要知道前面三个的位置,就可以确定我们想知道的东西了,因为合法区间就在之间,此时保证了价值为i的这个数取了刚好三次。 所以我们不妨做一个“滑动”一样的操作,现在我们知道,那么我们来做这样的一个东西:给定...原创 2020-09-16 10:17:44 · 572 阅读 · 0 评论 -
Controversial Rounds【CF-1398 F】【线段树】
题目链接 题意:有由字符集{0,1,?}构成的长度为N的字符串,知道"?"可以变成0、1中的任意一个数,现在问长度为1到N的最多0、1连续段的个数。 很显然一点,如果我们直接跑N次,假设查询可以O(1)的完成,那么时间复杂度是一个调和级数,也就是级别的,但是很显然我们需要查询这样的一个东西。 现在需要有这样的一个操作:查询区间内第一个出现的连续长度大于等于i的连续段的首地址,那么,我们不妨维护这样的一个线段树,记录每个位置的最远连续长度,那么实际上就是找到区间范围内第一次出现的长度大于等于...原创 2020-08-17 21:41:45 · 231 阅读 · 0 评论 -
树数数【智算之道复赛E】【树链剖分+dfs序】
题目链接 我们可以考虑一个黑点u,它作为LBCA点所产生贡献次数为,其中,指的是u的子孙节点们,那么,u点作为LBCA点的贡献值就可以求出来了,就是了。 根据这样的关系,我们可以推导改变所带来的信息变化。 白点变黑点 那么,它的影响只会对它向上最近的黑色节点产生直接影响,对于再往上的黑色节点,由于被给阻断了,所以受不到影响,同时,它会产生贡献,它产生的贡献就可以通过来计算得到。 对于节点的影响呢?那么,其实相当于节点就会少去了这些部分了,所以它要减去的部分,似乎这样就达成...原创 2020-08-14 21:42:30 · 204 阅读 · 0 评论 -
Breaking Down News【HDU-6856】【线段树+单调队列/栈】
2020 Multi-University Training Contest 8 B 有N个权值,每个权值只能是{-1, 0, 1}中的一个,然后现在分成几段区间,每一段的长度在[L, R]之间,每一个段的权值为:>0时候,权值=1 <0时候,权值=-1 =0时候,权值=0 现在,要求这几个段的∑之和最大值。可以列出dp方程,简单的说,我们可以看成三种情况,我们维护一个前缀和,然后维护这样的三种情况:时候, 时候, 时候, 分别讨论三种情况,然后求出对应的最...原创 2020-08-14 11:38:58 · 323 阅读 · 0 评论 -
[BJOI2017]树的难题【点分治+线段树】
题目链接 很容易想到的是,我们可以对首先对每个点连出去的边按照边颜色进行排序,这样就可以保证一段相同的是会在一起出现的,然后我们可以进行点分治,再利用线段树维护深度对应的最大权,我们需要两棵线段树,一棵维护不同值,一棵维护相同值,另外要保证我们每次初始化需要到位,不然很有可能被卡70或80pts就比较的难受了。8 2 4 4-5 31 2 21 5 11 8 22 3 12 4 15 6 25 7 1ans:-48 4 1 5-7 9 6 11 2 11 3 21.原创 2020-06-11 08:55:18 · 294 阅读 · 0 评论 -
[HNOI2016]序列【笛卡尔树/单调栈+扫描线】
题目链接 对于一个数,它是位于pos位上的数的值,假设它左边第一个比他小的数的位置+1是,假设它右边第一个不大于它的数的位置-1是。那么以pos这位数产生的贡献可以考虑成。 如果我们将贡献作为二维平面上的话,我们可以更加清楚的看到它的变化,我定义为点i到点j的i~j区间内的最小值,于是有。 于是,对于题目中的数据“5 2 4 1 3”,我们可以看成: 不难发现,我们如果要查询的答案,实际上就是坐标系中到的这个二维覆盖区间,当然,这里有的人会说到可持久化四叉树(也行,写好点就是了)...原创 2020-06-07 15:40:16 · 420 阅读 · 0 评论 -
签到题【牛客算法周周练6E】【暴力枚举+线段树】
题目链接 题目保证数据随机,数据随机真的是太强了,直接可以跑最坏时候是的复杂度。 直接暴力建线段树,然后更新的时候更新到底,查询的时候也是查询到底,因为数据随机,所以其实被处理的次数是很少的,因为要刚好是set里有的,或者是set里没有的,这就使得更新的操作变得很少。#include <iostream>#include <cstdio>#include <cmath>#include <string>#include <cst..原创 2020-05-13 09:15:17 · 247 阅读 · 0 评论 -
LIS on Tree【线段树+堆优化】
题目链接 题意:有一棵N个点的树,每个点都有对应的权值,现在我们要求从起点1到达某点K的路径上的最长上生子序列长度,可以让最终的结尾不是以K结尾的。 那么,我们可以用一棵权值线段树维护最大值DP这样的做法来进行,但是有删除操作,并且删除操作是对于权值,可能删除了另外一个相同权值的答案,而影响了最大值的更新,所以要注意的是我们需要自己手写一个堆来维护他。32 1 11 21 ...原创 2020-05-03 23:45:59 · 469 阅读 · 0 评论 -
牛牛的等差数列【线段树】
题目链接 这里的突破口在于小于等于25且大于等于3的质数连乘在1e8左右,所以,我们可以在操作上,将其看作对1e8去求模,而不是对每个都进行预处理。时间复杂度。也就是说,我们排除这个预处理之后,直接就是降了10倍左右的复杂度。 然后,给区间一个等差数列,可以看成给这段区间赋一个基础值和递增一个值,所以我们在线段树上操作的时候,维护两个懒标记,分别是基础值,和等差值。因为存在累加...原创 2020-04-19 17:08:49 · 548 阅读 · 0 评论 -
稳定桌【权值线段树】
题目链接 51nod 1461 稳定桌有一张桌子,有n个腿。第i根腿的长度是li。现在要拿掉一些腿,使得桌子稳定,拿掉第i根腿需要di的能量。稳定的条件是,假如拿掉若干条腿之后,桌子还有k个腿,那么长度最长的腿的数目要超过一半。比如桌子有5根腿,那么至少要有三根腿是最长的。另外,只有一根腿的桌子是稳定的,两个腿的桌子想要稳定,必需长度是一样的。你的任务是拿掉若干腿,使得桌子稳定,并...原创 2020-04-04 22:45:18 · 193 阅读 · 0 评论 -
[TJOI2018]数学计算
题目链接 如果把这个问题看作是区间问题,那么会简单的多了,一开始整个区间都是1,所有的值都是1,然后就像是分治的做法,我们将他们分开来,算每个小子集的乘积取模,然后修改的时候其实就是置1或者是置当前数值。#include <iostream>#include <cstdio>#include <cmath>#include <string...原创 2020-03-28 16:15:40 · 231 阅读 · 0 评论 -
XOR TREE【牛客练习赛58 F】【树链剖分】
题目链接这个问题很容易想到之间的关系,假设现在所要查询的这条链上有V1、V2、…… VK个点,那么第i个点的贡献在抑或中出现的次数XOR为当K为偶数时候,F(i)恒定为奇数 当K为奇数的时候,F(i)在i为偶数的时候F(i)为奇数 只有F(i)为奇数的时候,在抑或XOR中才有作用 于是,如果K为偶数的时候,我们直接求这条链上所有值的抑或XOR和即可,树链剖分就可以很好的维护了。...原创 2020-03-17 15:44:11 · 342 阅读 · 0 评论 -
[USACO13DEC]Optimal Milking G【线段树维护最大独立集】
题目链接 P3097 [USACO13DEC]Optimal Milking G 很明显的是这道题有4e4个点,直接跑最大独立集的话,那么测评机承受不起啊!所以,这里要维护一个区间dp的形式。 每个区间有左右两个端点,我们现在要合并两个区间的话,会有一些情况:【0,0】:左右端点都不选; 【0,1】:左端点不选,右端点选; 【1,0】:左端点选,右端点不选; 【1,1】:左端...原创 2020-03-15 10:47:08 · 222 阅读 · 0 评论 -
New Year Tree【dfs序】
New Year TreeCodeForces - 620E给你一颗n个节点的树,每个节点被染上了颜色,然后就是m次查询。 查询的方式有两种:将以z为根的子树的结点全部更新为颜色X 问以z为根的子树的结点的不同颜色数量。第一行输入n,m(4*10^5) 第二行 输入每个节点的颜色(n个) 颜色X<=60 接下来n-1行就是两个点相连 最后m行查询 其中 1 z X 代表...原创 2020-03-11 21:01:08 · 307 阅读 · 0 评论 -
求函数【线段树】【2020牛客寒假算法基础集训营2】
首先,这个区间很容易让人想到是区间操作,那么就是来推公式吧。我们从中不难发现,从两个值到四个值可以是相当于其中,两个“[ ]”括号中的值是不是有点相似,我们是不是可以将它放在线段树上来进行维护了?#include <iostream>#include <cstdio>#include <cmath>...原创 2020-02-06 19:51:35 · 145 阅读 · 0 评论 -
Color it【HDU-6183】【CDQ分治套线段树】
题目链接 题目中有这样的三种操作:清空 添加颜色进(x,y)这个点颜色c 查询(1,y1)到(x,y2)区间内有几种颜色 一开始的时候我直接写了个二维主席树,但是就是RE过不去,但是开大点就会TLE了,所以实在没法,只能想别的办法来做。 这里的突破口还是在这个“1”上面,我们其实可以看作是查询一个前缀和的形式,但是限制条件y的范围在[y1, y2]之间。 所以,我的做...原创 2020-01-14 22:02:04 · 227 阅读 · 0 评论 -
Second Sum 【AtCoder - 5206】
vjudge链接VJ原题链接(推荐) 其实,他就是问了这么一个问题,问所有区间的第二大的数之和,那么我们其实很容易发现一个规律,就是每个数会对答案产生的贡献。 每个数,在它的左边和右边,分别有第一个大于它的数,和第二个大于它的数,我们可以首先处理出来这个。然后看一下图例:蓝色区间长度相乘加上红色区间长度相乘,所以不就是“本身”这个值产生的贡献的次数了吗?然后就可以计算出...原创 2019-11-05 13:30:32 · 308 阅读 · 0 评论 -
Friends and Subsequences【Codeforces 689 D】【线段树+二分答案】
Codeforces Round #361 (Div. 2) D 我们现在有两个长度为N的区间,我们现在想知道满足在第一个区间的最大值与第二个区间的最小值相等的区间的这样的区间个数有多少个? 首先,我们可以知道,区间的最大值如果按某个端点来升序的话一定是线性关系的,同理最小值,所以我们完全可以枚举一维,然后二分一维,又有查询区间最值的复杂度是log()级别的,所以总的复杂度就是。...原创 2019-10-30 19:34:42 · 192 阅读 · 0 评论 -
敌兵布阵 HDU - 1166(萌新谈线段树体会)
对我个人而言,什么是线段树?就是将一个长长的大区间分为一段段小区间,然后,每段小区间按照某种方式分配了大区间里的值或者元素。 上题之前讲一下怎么制造这个树?怎么初步的用这个树?这个树的功能。(因为初学,讲的会有点通熟易懂)就像学软机的链表,二叉树一样,我们构造一个线段树也将用结构体类型去定义它:这个线段树需要有它在当前位置上的值,需要有它的区间段(左右端点),同时如果它有子树...原创 2018-05-28 11:24:56 · 180 阅读 · 4 评论 -
线段树详解【几个易错点】【功能】
线段树就要比RMQ算法高级了,上午刚学完RMQ下午公关了线段树就来写一下自己的认知了。对于线段树,就是一个由根结点往下出发的过程,把最最最上头的那个根结点定义为序号1,可以知道每个根结点(序号为rt、范围l~r)的左子树序号都为rt<<1(即rt*2)且他们的右子树节点都为rt<<1|1(即rt*2+1),然后左右子树平分根结点的长度,即左子树的范围为l~mid,右...原创 2018-07-28 15:47:15 · 524 阅读 · 0 评论 -
Count Color 【POJ - 2777】【线段树】
题目链接 这道题一开始觉得处理颜色很繁琐,但是后来发现了个东西——T<=30,对于这个数据,似乎可以开成比特位(二进制)然后进行处理,会发现,这就是区间更新的线段树了。 有几个坑,我跳进去过了,一个是初始化要为1(颜色1),其次A和B的大小是不固定,只说在[A, B]围成区间内,还有个WA就是因为我处理Query时候,之间返回的是颜色个数,这样显然不对,应当返回的就是比特位,然后...原创 2018-10-09 21:23:07 · 191 阅读 · 0 评论 -
Can you answer these queries? 【HDU - 4027】【线段树】【RE的好伤心~】
题目链接题意:就是给你一串数,让你对一段区间操作,要么是询问,要么是把这段区间的每个点开根号。比赛看到这道题的时候,我还真高兴呢,终于有线段树了,我推了下,发现前期单点更新就行,后期的时候判断是否为1,也就是此时节点的权值是否等于(r-l+1),于是我兴高采烈的敲完了,并且过了测试样例就交了,想必也应该没什么问题,但是RE了,那时候距离比赛结束还有近一小时,我开始debug,看到是“ACC...原创 2018-10-28 19:43:36 · 470 阅读 · 0 评论 -
二维线段树的讲解【建立在线段树上的提升】
二维线段树 二维线段树最主要用于平面统计问题。类似一维线段树,最经典的就是求区间最值(或区间和),推广到二维,求得就是矩形区域最值(或矩形区域和),对于矩形区域和,二维树状数组更加高效,而矩形区域最值,更加高效的方法是二维RMQ,但是二维RMQ不支持动态更新,所以二维线段树还是有用武之地的。 如果对一维线段树已经驾轻就熟,那么直接来看下面两段对比,就可以轻松理解二维线段...转载 2018-11-15 16:37:24 · 609 阅读 · 0 评论 -
Mayor's posters 【POJ - 2528】【线段树:讲解离散化后TLE的原因】
题目链接 题目是一道很好的题,他用很神奇的数据告诉了我们——少用map,会TLE的。。。所以,这道题怎样避免N*log(N)的map??我们可以换成lower_bound()来进行优化,但是在此之前可以用unique()进行去重操作(自己懒,所以用已有的STL文件)。 顺便说一句,这有一组数据(这组数据在常理上应该是正解,但是好像在本题中视作假的。。。)131 101 ...原创 2018-11-15 20:33:50 · 197 阅读 · 0 评论 -
Mobile phones 【POJ - 1195】【二维线段树】
题目链接 关于这道题,我用了二维线段树来做的,但是,我这里又一个疑问,就是我用了个四叉树的线段树的代码却是始终过不了一直在WA,若恰好有大佬经过,能帮小生看一下我不成器的代码吗? 先放上讨论哪里错的代码供大家讨论,帮我修改,谢谢!#include <iostream>#include <cstdio>#include <cmath>#in...原创 2018-11-20 21:22:21 · 220 阅读 · 2 评论 -
Luck and Love 【HDU - 1823】【二维线段树】
题目链接 最近敲了些二维线段树,这也是我题单里的一道题,无非多出来的操作就是对区间端点的处理问题,给出的是浮点数,不如就把他向取整咯,一开始取整的时候总是会遇到些问题就是总是取不到恰好,会少位,怎么办呢?于是我这里学到了个骚操作:(int)(x*10. + efs);其中,efs指的是1e-6。 这道题还有另外的坑点,就是对与区间,并没有告诉你是左上角与右下角的关系,你得自己进行处理。...原创 2018-11-21 11:18:03 · 199 阅读 · 0 评论 -
Get Many Persimmon Trees 【POJ - 2029】【二维线段树】
题目链接【简单题】 一道简单的二维线段树,查询的是一个规定长宽的长方形内的最多点数,因为W、H都比较的小,所以不妨可以直接上暴力二维线段树查找即可。#include <iostream>#include <cstdio>#include <cmath>#include <string>#include <cstring>...原创 2018-11-21 16:03:20 · 136 阅读 · 0 评论 -
Matrix 【POJ - 2155】【二维线段树+永久化标记】
题目链接 挺好的一道题,一开始用lazy标记往下推,总是推不出样例的正解,然后就去看了相关博客,发现却确实如此,在这里是无法用lazy标记来层层推的,并且还会出现超内存的情况,所以,便改用了永久化标记来解这道题。 还有一件是,关于discuss里的讨论区有一块这样的讨论:12 10C 2 1 2 2Q 2 3C 2 1 2 1Q 1 1C 1 1 2 1C 1 2 1...原创 2018-11-21 20:43:49 · 278 阅读 · 0 评论 -
Census 【UVA - 11297】【二维线段树】
题面This year, there have been many problems with population calculations, since in some cities, there are many emigrants, or the population growth is very high. Every year the ACM (for Association fo...原创 2018-11-21 22:03:37 · 218 阅读 · 0 评论 -
Matrix Searching 【ZOJ - 2859】【二维线段树】
题目链接 简单的二维线段树求区间最小值问题,还不用修改操作。#include <iostream>#include <cstdio>#include <cmath>#include <string>#include <cstring>#include <algorithm>#include <li...原创 2018-11-22 13:09:35 · 190 阅读 · 0 评论 -
Mosaic 【HDU - 4819】【二维线段树】
题目链接 这道题难就只是难在题目难读,题意读懂后就是一道普通的二维线段树更新查找问题。 题意:给你一个N*N的矩阵,并且已经建立了初始值,然后给你个点以及L,很多人不解其义,其实就是给你个点,然后查的是以(x, y)为基础的点,在以左上角(x-L/2, y-L/2)为其中一个端点,另一个端点右下角(x+L/2, y+L/2)的所覆盖区间内的最大值与最小值的平均值赋给(x, y)这个点,...原创 2018-11-22 14:53:29 · 192 阅读 · 0 评论 -
Check Corners 【HDU - 2888】【二维线段树】
题目链接 很多人写这道题都用的是二维RMQ,但是,我觉得这道题可以锻炼一下我二维线段树的思维,但是,无独有偶,这道题会卡一些二维线段树的模板,一开始我想也没想,直接敲了刚学的线段树,然后不停的RE,后来改了下,换成单点更新与区间更新二维线段树,还是不行TLE了,于是,就开始想,我们该如何把二维线段树双重区间写出来,然后,研究了下他的向下更新操作,我们不妨可以结合一下单点更新作出改进,譬如看向...原创 2018-11-19 19:02:27 · 204 阅读 · 0 评论 -
Counting Black 【POJ - 1656】【二维线段树+内存优化】
题目链接 这道题卡了内存,但是处理这个内存的方式却也简单,可以直接用short int来减少内存的使用,于是就可以用四叉树——二维线段树过了。#include <iostream>#include <cstdio>#include <cmath>#include <string>#include <cstring>#...原创 2018-11-22 18:45:29 · 193 阅读 · 0 评论 -
A Magic Lamp 【HDU - 3183】【线段树区间最小值】
题目链接 简单而言,这道题就是RMQ问题,但是我个人更喜欢用线段树来写区间最大值,因为这样子会好更新些(奈何这道题不需要更新)。 我们要从长度为N的字符串中删除M个元素,那么岂不是只剩下(N-M)个字符串的长度,所以,我们不妨来找(N-M)的长度来的会更加简单一些,查找从(1~1+M)开始,然后找到最先出现的最小值(如果有相等结果取先出现的),然后再从这一位之后开始找到~(2+M),就...原创 2018-11-20 08:37:38 · 225 阅读 · 0 评论 -
二维线段树【模板——给出对应注释】
闲话少说,直接看注释反而会更容易读懂这段二维线段树的模板:#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<map>#include<cmath>#define max(x,y) ((x)>(y)...原创 2018-11-18 16:13:37 · 444 阅读 · 0 评论 -
红球进黑洞【线段树区间更新+二进制异或处理】【牛客小白月赛9-C】
题目链接 给你N个点,M次查询,问的是(一)、区间【l, r】的数的总和;(二)、把区间【l, r】上的所有点去异或(xor)一个数X。 一开始用了点更新,然后T了,想了一会,最后在比赛结束前终于美滋滋的完成了AC,庆幸,我的想法是这样的,将每个点的值用一个另开的[22]位二进制来存。放心,22位是绝对够的,然后向上更新的是每一位的个数和。这样,就能保证线段树区间更新的速率了。具体...原创 2018-11-18 16:22:40 · 283 阅读 · 0 评论 -
Rikka with Phi 【HDU - 5634】【线段树+欧拉函数】
题目链接 很好的一道题,也算是开阔了我的思维,一开始,我的想法是既然是区间求欧拉,那么到一定地步的时候,数的欧拉值就会降到1,那我们维护区间值等于区间长度不就是可以了吗?然后T了。 然后我再想,是不是哪里可以优化?毕竟还有另外一个条件没用优化(区间赋予相同值),那我们需要怎么做?区间值为“1”就是意味着区间上每个值都相等,那么我们让区间上如果每个值都相等,那么直接赋予其等价欧拉,然后利...原创 2018-11-30 09:00:08 · 264 阅读 · 0 评论 -
Aragorn's Story 【HDU - 3966】【树链剖分】
题目链接树链剖分的学习笔记(更新中) 这道题所给的Hint好有迷惑性,它跟我们说注意士兵的数量可能为负数,我的第一反应是,士兵的数量是不是不能为负数,那么我们是不是要做出些什么调整,然而,语文不好的我看了Discuss才知道说的是:士兵的数量可以为负数。这样也好,题目就变成了一道简单的树链剖分问题了,我们只需要记录每个节点的深度,以及它的最顶节点,然后边更新就是了。#include...原创 2018-11-28 16:21:08 · 195 阅读 · 0 评论 -
Jiu Yuan Wants to Eat【2018焦作网络赛】【树链剖分】
题目链接树链剖分学习笔记,可以看这里 这道题还真挺好的,以前不会做,现在想了发现,学过树链剖分之后,剩下的部分就是处理去反那块比较的不容易些了,但是想了一下午,现在还是给我敲出来了,我们主要难处理的就是关于求反,那么怎么处理求反? 一开始读题的时候,我还在想,是不是求反是与此数的最大2次幂系数开始,后来推了测试样例,发现,是直接对64为比特位都求反,那么我们似乎可以推一个公式了,因...原创 2018-11-28 20:36:05 · 219 阅读 · 0 评论