
线段树
OriginalRecipe
这个作者很懒,什么都没留下…
展开
-
线段树板子
最近学到线段树,于是就写了个板子.#include<cstdio>struct node{ int L,R; long long add,sum; void Add(int t){ sum+=t*(R-L+1); add+=t; }};struct Segmenttree{ node tree[400005];//注意要开四倍的数组 int A[4000...原创 2018-07-17 21:27:45 · 249 阅读 · 0 评论 -
大根堆 HYSBZ - 4919 线段树合并
Part 0由这题,可以联想到最长不下降子序列。对于每个节点,我们定义DP[i]为这个子树内所有节点堆顶元素等于i时的最大的堆的大小。我们可以把这个数组放在线段树上维护。线段树的叶子节点存的就是DP[i]。线段树节点[L—R]存的是这段区间DP值的最大值。Part 1线段树合并时就可以一直更新这个DP数组。由于每个子节点是互不干扰的,故合并时记录两颗线段树前面的DP最大值。(若当前操作区间...原创 2019-01-19 19:49:15 · 349 阅读 · 0 评论 -
DZY Loves Sorting HDU - 5649 线段树合并和分裂
Part 0这道题就是[Tjoi2016&Heoi2016]排序的升级版。可以直接改成多Case过去的。本题有两种做法,一种是普通线段树+二分(复杂度n⋅log2(n)n \cdot \log^{2}(n)n⋅log2(n))还有的就是现在要讲的线段树合并+线段树分裂(复杂度n⋅log2(n)n \cdot \log^{2} (n)n⋅log2(n))Part 1其实讲一个区...原创 2019-01-18 21:28:46 · 312 阅读 · 0 评论 -
魔法少女LJJ HYSBZ - 4399 线段树合并
Part 0这道题其实就是一个码农题,考的是代码功底,没有太多思维难点。注意题目的HINT说的请认真阅读题面,你会发现c≤7c \leq 7c≤7然后再看一下询问。剩下唯一的难点只剩下维护一个联通块内所有节点权值的积。首先,要知道以下公式。 lnab=lna+lnb\ln ab = \ln a + \ln blnab=lna+lnbln\lnln函数是单调的,故判断...原创 2019-01-18 20:38:23 · 197 阅读 · 0 评论 -
七彩树 HYSBZ - 4771线段树合并
Part1本题是查找一个节点x的字树内深度与其相差不超过d的节点有多少种颜色。如果单纯考虑有多少个点,应该如何求,如何维护深度在一个区间内且是x的后代的信息呢?我们可以每个节点用一颗以下标为权值的线段树来维护(后面记为线段树X)。用线段树合并来完成所有信息的处理。但如何查找深度在一个区间里的信息呢?我们可以将每个节点重新以深度编号,编号与深度正相关(也就是编号越大的点深度越大),在预处理处每个深...原创 2019-01-18 19:30:11 · 356 阅读 · 0 评论 -
rausen loves cakes HDU - 5997线段树合并
Part1 感觉本题与梦幻布丁(题解)十分相似。只不过由全局查找变为区间查找。若是此时对于每种颜色都查询一遍区间内颜色段数复杂度必定超。但由梦幻布丁这道题做铺垫后,可以想到维护一个区间内所有颜色的段数,可以另外拿一个线段树来维护,查询时在这个线段树上回答即可。Part2 为了快速确定某两个相邻的点是否颜色相同,可以用并查集。把每种颜色的代表点存下来(也就是随便存下一个这种颜色的点的位置)...原创 2019-01-11 16:38:05 · 295 阅读 · 0 评论 -
梦幻布丁HYSBZ-1483 线段树合并
Part 1 本题要求当前有多少段颜色,其实可以看成有多少个相同颜色的联通块,我们可以一个一个颜色进行计数。在颜色转换时利用线段树合并(归并思想)来维护当前有多少个相同颜色的联通块。Part 2 对于每种颜色,可以用一颗动点线段树来维护其颜色段数,每个叶子节点存的就是这个节点是否为当前这种颜色。然后在Up操作里维护当前区间内这种颜色的段数。同时还要记录每个区间左端点以及右端点是否为这种颜...原创 2019-01-11 15:05:04 · 229 阅读 · 0 评论 -
NOIP2017 列队 动点线段树
题目链接:列队主要思路:和前面的思路有些相似。首先,若用数组存地图(即排列的状态)肯定会MLE,但是若本次查询为第x行,第y行,记这个学生的编号为X。若那么只用在最后一列操作即可。在最后一列建一颗线段树(大小为n+q),初始化每个位置上的数值都为1。每次找这一列的第k个位置就找第一个前面有k个1的位置(包括他自己)并将该位置数值赋值为0,这样找到的位置的值在赋值为0前时一定...原创 2018-10-02 22:06:59 · 231 阅读 · 0 评论 -
POJ-3667 Hotel 线段树
题目链接:POJ-3667主要思路:为了书写方便,记Llen为该区间从其左端点向右开始的最长合法区间,Rlen为从右端点向左开始的最长合法区间.此题用线段树写应该是很好看出来的(从那么多的区间操作中).维护每个区间的Llen与Rlen,还有一个区间中最长的合法区间(方便1操作判断是否有位置).查找时从最大的区间[1,n]开始,先判断这个区间Llen是否满足,再判断这个区间的左子区间的最...原创 2018-07-22 20:58:15 · 185 阅读 · 0 评论 -
POJ-2452 Sticks Problem 单调栈+线段树
题目链接:POJ-2452主要思路:对于每一个,从它后面找第一个比它小的数(若没有则为结尾+1),即为R,在这段区间内找到最大值,其位置即为j,左端点为i的最长合法区间即为.对于每个i,若它的R=i则跳过.PS:若这段区间的最大值有多个,则必须取前面那个,否则会取出非法区间,如:83 11 6 8 9 10 11 1其答案应为4而不是6.找i后面第一个比它小...原创 2018-07-21 10:54:23 · 967 阅读 · 0 评论 -
Billboard HDU-2795 线段树
题目链接:HDU-2795思路分析:对于每一个公告,都要贴在能贴的最上面的最左端,故用线段树维护一段区间内的空余的空间最大值,每次若最上面可以贴就贴上面.若最大的区间最大值小于公告的宽度则输出-1,其他操作都与普通线段树相似.#include<cstdio>int max(int x,int y) { return x>y?x:y;}struct node ...原创 2018-07-20 17:37:56 · 153 阅读 · 0 评论 -
离散化 Hihocoder-1079 线段树+离散化
题目链接:Hihocoder-1079主要思路:由于本题数值范围较大,又只用比较大小关系即可,故用离散化来离散左端点和右端点即可.又因为这道题是连续性线段树,故我们只用将编号便给每条线段.故点1到点2这条线段编为1,点2到点3这条线段编为2,以此类推.故每个点区间[L,R]为线段区间[L,R-1].用线段树存下区间内海报的状态(如有一张海报则存该海报的编号,若多张或是没有则存-1).最...原创 2018-07-20 11:21:55 · 247 阅读 · 0 评论 -
ZJOI[2010]基站选址 线段树优化DP
ZJOI[2010]基站选址Part -1这是一个很神仙的dp题,也可以算是线段树优化dp的一道入门题(神仙说的)。Part 0首先得打出暴力的写法。要注意dp的无后效性。(还有注意要仔细看题)定义dp[i][k]dp[i][k]dp[i][k]为对于前iii个村落,建kkk个通讯基站,且最后一个建在第iii个村庄的最小花费。那么就有dp[i][k]=min(dp[j][k−1]+co...原创 2019-07-13 14:41:16 · 196 阅读 · 0 评论