![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
线段树
EMber _
人但有追求,世界亦会让路。
展开
-
BZOJ4653 NOI2016DAY2T1区间 线段树
题目:Description在数轴上有 n个闭区间 [l1,r1],[l2,r2],…,[ln,rn]。现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置。换句话说,就是使得存在一个 x,使得对于每一个被选中的区间 [li,ri],都有 li≤x≤ri。 对于一个合法的选取方案,它的花费为被选中的最长区间长度减去被选中的最短区间长度。区间 [li,ri] 的长度定义为 ri−li,即原创 2016-08-18 20:16:28 · 372 阅读 · 0 评论 -
bzoj3110[Zjoi2013]K大数查询 主席树套线段树
题意很简单,就是带修改的K大数查询。 查询自不用说,怎么修改? 由于数字都在1-n范围内,所以他的权值就是他的排名,直接插入,然后建立区间线段树,在线段树内找到修改的范围,然后用主席树区间修改。 因为多打两个else而调了一上午的sb。。。 权值线段树本来也可以,但是数据加强以后被卡了。#include<cstdio>#include<cstring>#include<algorithm原创 2017-06-08 11:12:46 · 486 阅读 · 0 评论 -
【GDOI2018模拟7.12】A 线段树+树状数组
这题用光了我所有的脑细胞,还没A,成功导致我今天比赛瞬间爆炸。。题意略。首先肯定不能用归并无脑求。。。否则你怎么处理后面一问,这里明显提示我们第一问的某些东西可以用到第二问中。 先用树状数组求出总逆序对数,同时算出每一位的贡献。 然后对于第二问我们离线处理,先把所有的处理记录一下,记录每一位被更新的时间。 然后我们按照序列的顺序处理。 对于一个数来说,他的贡献变为0的时刻就是在他前面比他大的原创 2017-07-12 15:59:32 · 278 阅读 · 0 评论 -
bzoj1593[Usaco2008 Feb]Hotel 旅馆 线段树标记
辣鸡vs,毁我青春坏我人生。 题意很简单,就是给你一段区间,让你每次标记一段,或者去掉一段的标记,但是不能重复标记标记过的,每次标记给你一个长度x,要求长度为x的连续一段都要是空的,然后输出左端点。 标记与删除都很简单,问题是怎么询问,二分不能做,不满足二分性。然后想着用树套树强艹过去,但是觉得不大科学,gold怎么可能搞树套树出来。。 其实就是线段树上打标记,问题就在于怎么统计连续的区间和跨原创 2017-07-04 21:40:17 · 373 阅读 · 0 评论 -
bzoj4869&&jzoj5214[Shoi2017]相逢是问候 线段树+欧拉定理
题意:给你a[1-n],b[1-n]选出n-k个数使得这n-k个数的sigma(a[i]/b[i])最大。 模板,d[i]=a[i]-mid*b[i]列出来直接二分上。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<cmath>#define fo(i,a,b) for(int原创 2017-07-09 20:18:31 · 493 阅读 · 0 评论 -
bzoj4094[Usaco2013 Dec]Optimal Milking 线段树
一开始死刚DP,刚了半天感觉不大对劲,好像不大像dp,突然发现原来这不就是一个线段吗= =,维护一下左边右边是否选择就好了。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int原创 2017-07-19 22:34:24 · 271 阅读 · 0 评论 -
bzoj 1513 [POI2006]Tet-Tetris 3D二维线段树
一句话题意:给你一个矩形,给出两种操作,一种询问区间最大值,一种区间加。 由于刚学习二维树状数组,所以想试试,但是想了想发现没法维护最大值,或者说强行维护的话好像会到达log^4。。。因为一维树状数组维护最大值是log^2的,这就得不偿失了。 所以还是二维线段树,一开始打错了,删掉3000多b重打,一阵酸爽。 其实就是树套树辣,对于行维护一个线段树,每一行维护一个线段树,然后发现矩阵的信息没法原创 2017-08-16 22:01:58 · 255 阅读 · 0 评论 -
bzoj3196 Tyvj 1730 二逼平衡树 线段树套treap
裸的树套树,其实本来是想练习treap,后来想想算了,顺手学一波咯,反正是入门题。 t[k].s表示子树大小,t[k].w表示k这个点含有多少相同的数。#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a原创 2017-07-27 16:56:33 · 391 阅读 · 0 评论 -
codeforces 413E 线段树
题意:给你一个2*n的矩形,X不可以走,给你一些询问,问你两点之间的最短路. 不是很难的线段树,维护一下左边到右边的四种路径就好。 维护炸了,基本看王队长的代码QWQ#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for原创 2017-09-15 00:22:54 · 282 阅读 · 0 评论 -
bzoj2962 序列操作 线段树
题意:一段序列,三种操作: 1.I a b c表示将[a,b]这一段区间的元素集体增加c,2.R a b表示将[a,b]区间内所有元素变成相反数,3.Q a b c表示询问[a,b]这一段区间中选择c个数相乘的所有方案的和mod 19940417的值。一开始没看到k<=20,觉得不可做,后来一看,哦这不就水了很多了。。 操作3的话维护f[i]表示当前区间选择i个的答案,那么n^2更新,明显有:原创 2017-09-16 08:40:04 · 1499 阅读 · 0 评论 -
JZOJ5365. 【GDOI2018模拟9.14】通信 线段树+重链剖分
我们考虑每条边的贡献。 把已经走过的点染色为1,未走过的为0,那么我们对于序号序列维护一颗线段树,x-v这条边的贡献就是序列中不连续01序列包含x的个数,那么我们反过来,答案=总序列-经过x的极大连续序列,这个东西明显可以用线段树维护,维护一个从左右开始的最长01长度和最长连续就好了。 问题是直接遍历操作明显会T,我们重链剖分一下,对于一个点,先把其他的轻儿子暴力扫掉,然后再递归处理重儿子。原创 2017-09-16 11:47:57 · 562 阅读 · 0 评论 -
bzoj3244 NOI2013树的计数 神奇脑洞题+线段树
题意:给你两串序列,分别为dfs序和bfs序,让你求树的期望高度。 这题脑洞是真的大。。说实话我都不知道这道题的tag应该是什么。。 copy一下百度文库的题解 void copy(){ 我们可以发现,所求的树之所以会有很多种,是因为出现了这种情况: 对于A、B,A既可以做B的兄弟,又可以做B的父亲。 (显然其中的一个前提是A、B在dfs、bfs序列中都必须相邻) 而这样除去A,B的原创 2016-08-16 16:00:06 · 479 阅读 · 0 评论 -
JZOJ5417. 【NOIP2017提高A组集训10.24】 二维线段树
题意:给一个矩阵,q次询问子矩阵,查询最大值最小值,区间和, 每个询问的方阵的长不超过宽的两倍。屁股后面那个两倍什么玩意儿的你想用就用,我不想用,懒得打什么鬼畜的rmq,去他的,二维线段树多爽,直接过。 然后我比赛把前缀和打错了啊啊啊啊啊!!! /喷血 犯了史上最傻逼错误没有之一,更让我绝望的是,我打拍的时候直接把前缀和那个地方黏过去用所以根本没拍出来/喷血。 血的教训,希望我能铭记。#inc原创 2017-10-24 14:49:43 · 292 阅读 · 0 评论 -
JZOJ5419. 【NOIP2017提高A组集训10.24】线段树
很烦人的线段树= =。不过理解了以后还是挺好打的,就是太长。 具体的话就是维护每一个区间内到左端点右端点的最小代价和最左边,最右边的可用的位置,然后直接更新就好了,至于查询的话,就是查询中位数咯,查询一下中位数左右两边最靠近他的可用的点,然后取个代价最小的。#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b原创 2017-10-24 17:16:00 · 244 阅读 · 0 评论 -
JZOJ5457. 【NOIP2017提高A组冲刺11.6】项链
题意:nodgd的粉丝太多了,每天都会有很多人排队要签名。今天有n个人排队,每个人的身高都是一个整数,且互不相同。很不巧,nodgd今天去忙别的事情去了,就只好让这些粉丝们明天再来。同时nodgd提出了一个要求,每个人都要记住自己前面与多少个比自己高的人,以便于明天恢复到今天的顺序。但是,粉丝们或多或少都是有些失望的,失望使她们晕头转向、神魂颠倒,已经分不清楚哪一边是“前面”了,于是她们可能是记原创 2017-11-06 15:34:54 · 277 阅读 · 0 评论 -
bzoj3702二叉树 线段树合并
二倍经验:2212. 很久以前就打了这题,现在回来填坑。。 这题的话是标准的线段树合并。 线段树合并的话,对于一些(大部分)情况,比启发式合并要好很多,时间复杂度少一个log,实现也简单。。 这题来说的话,就是直接合并两个子树,子树中的答案=左子树中的逆序对+右子树中的逆序对+跨越左右的逆序对,前两个扫一遍就可以统计了,问题是最后那个跨越左右子树的逆序对。 假设我们现在合并两颗子树,一颗的原创 2017-06-03 21:48:59 · 340 阅读 · 0 评论 -
bzoj1577 [Usaco2009 Feb]庙会捷运Fair Shuttle 贪心+线段树
题意比较明显就不说了。 其实贪心很明显,我一开始还以为要dp(把序列变成一个图就要dp了 以后可以出毒瘤题目祸害世界) 然后一开始是想用STL硬上的,但是不熟悉所以打挂了,然后看网上有线段树打法,思路很明显但是想了半天才知道线段树干什么用的。。 具体来说就是每次能往车上塞,就塞,不然就跳。#include<cstdio>#include<cstring>#include<algorithm原创 2017-05-20 16:18:38 · 547 阅读 · 0 评论 -
51nod 1485字母排序
这题目的原题是CF 558E但是加强了。 问题非常简单,给定一个长度为n的字符串S,有q个操作,每次操作的形式为 i j k,表示对从i到j的这一段子串进行排序,如果k=1进行非降序排序,否则进行非升序排序。 输出最后的字符串。 样例解释:Input 单组测试数据。 第一行有两个整数n, q (1 ≤ n ≤ 10^5, 0 ≤ q ≤ 50 000),表示字符串的长度和操作次数。原创 2016-08-13 21:24:30 · 889 阅读 · 4 评论 -
HDU5283 线段树
题意就不讲了,挺好理解的。。暴力很好打。。 其实正解一眼看出来是线段树。。。 题目关键在于在 x 轴和 y 轴上,鱼的坐标变化都是单调的,因为 d 是正值。我们把在一个 矩形内部有多少个点的询问拆分成四个在某个点的左下角有多少个点的询问,然后用一棵线 段树维护鱼的 x 坐标,一棵线段树维护鱼的 y 坐标。对于移动操作,在对应的线段树上进行 区间更新,更新完成后询问该区间内的最大值,若最大值原创 2016-08-14 15:33:36 · 549 阅读 · 0 评论 -
NOIP11.15模拟 T2 三部曲
。。没想到正解,大概知道是线段树,但是不知道怎么处理,出来才知道是用dfs序,也有dalao用树剖怒艹。。然而我明明打的50分结果只有30分,A了之后看了一下别人50分的做法。。感觉我就算是暴力都打的很复杂。。有很多可以简化的东西。。要学习一下。 简洁的50分做法(来自hhh)#include<iostream>#include<stdio.h>#include<string.h>#incl原创 2016-11-15 15:23:07 · 444 阅读 · 0 评论 -
NOIP模拟降雷皇&51nod 1376 最长递增子序列的数量
这两道题目都一样,只不过一个a[i]<=n,51nod 则a[i]<=10^9; 都是用树状数组做,找到那个当前值得最小位置然后插入更新,51nod上因为a[i]<=10^9所以要离散一下。uses math;const mo=1000000007;type node=record x,y:longint;end;var i,j,k,p,n,m,t1,t2,l,tot:lo原创 2016-12-12 21:15:41 · 323 阅读 · 0 评论 -
51nod 1463找朋友
给定: 两个长度为n的数列A 、B 一个有m个元素的集合K 询问Q次 每次询问[l,r],输出区间内满足|Bi-Bj|∈K 的最大Ai+Aj数据约定: n,Q<=100000 m <= 10 0<=A[i]<=1000000000 1<=B[i]<=n 1<=K[i]<=n 保证B[i]互不相等 Input n Q m A1 A2 ….An B1 B2 ….Bn K1原创 2016-12-23 22:06:55 · 312 阅读 · 0 评论 -
BZOJ1012
sb单调队列随便做,不要问我为什么刷水因为我已经被数据结构摧残的身心俱疲。#include<cstdio>int m,d,a[200001],t,max[200001],l=0,p;char q[1];int main(){ scanf("%d%d", &m, &d); while (m--) { scanf("%s%d",q,&p);原创 2017-02-25 20:45:49 · 251 阅读 · 0 评论 -
bzoj1636
去吧线段树! 然而被卡了。。加了读入输出优化也过不了。。后来发现线段树传递的参数少一些的话速度会飞起来~~,以后注意一下,能用空间存储尽量不要传参。。#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;原创 2017-03-06 21:18:12 · 206 阅读 · 0 评论 -
bzoj3888
分析:这题还是比较容易想的。直接算出每个区间l,r然后按照y排序,求最多的不重叠区间。 然后我就sb了,居然没想到离散以后用数据结构做。。因为以前这种题目做多了,老是想着用差分也许可以做??。。#include<cstdio>#include<cstring>#include<algorithm>#include<map>#define fo(i,a,b) for(int i=a;i<=b原创 2017-03-11 23:43:54 · 234 阅读 · 0 评论 -
bzoj3038上帝造题的七分钟2
比较经典的题目,给你一串数,每次有两个操作,一个修改,把区间内每个数开方(向下取整),另一种求和。分析:我们直接线段树肯定超时,因为是每个数开平方,这样时间复杂度就会退化到n^2,我们可以通过优化来解决这种尴尬的局面。一个比较简单的优化,就是当这个点的权值已经为0或1时,明显这个节点的值不会改动,那么给这个节点打上标记,而且这个节点的所有子树也不用遍历。 速度还行,500ms多一点。。#inclu原创 2017-04-07 10:39:58 · 212 阅读 · 0 评论 -
bzoj1818[Cqoi2010]内部白点
Description无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点)。每秒钟,所有内部白点同时变黑,直到不存在内部白点为止。你的任务是统计最后网格中的黑点个数。 内部白点的定义:一个白色的整点P(x,y)是内部白点当且仅当P在水平线的左边和右边各至少有一个黑点(即存在x1 < x < x2使得(x1,y)和(x2,y)都是黑点),且在竖直线的上边和原创 2017-04-07 21:01:32 · 255 阅读 · 0 评论 -
bzoj3211花神游历各国
分析:同上帝造题的七分钟。。#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace s原创 2017-04-10 15:20:24 · 262 阅读 · 0 评论 -
bzoj1645
分析:具体就是做扫描线,然后把坐标存储下来离散化以后,在线段树上打标记。。连续一段直接横坐标乘最小纵坐标就好。#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;原创 2017-03-24 21:32:11 · 258 阅读 · 0 评论 -
bzoj2157 旅游 树链剖分
其实就是个树链剖分,但是变成了边权而已,把边权移到他深度更大的端点上就行了。问题是操作太多了,而且还有个改变权值和取反我还要单独拉出来打。。打了半个小时,,编译调了半天,6000多B,都不想肉眼检查结果1A了。。有点窃喜。。 注意取反哪里的最大最小值的维护,要倒过来。#include<cstdio>#include<cstring>#include<iostream>#include<alg原创 2017-04-15 21:39:05 · 273 阅读 · 0 评论 -
bzoj1828: [Usaco2010 Mar]balloc 农场分配 线段树+贪心
。。其实是区间覆盖的加强版。。 区间覆盖基本上都是右端点排序以后贪心做,这题看了一下好像也是这样。。 直接排序以后线段树上就可以了,好像不用延迟标记会wa。。不知道为啥。。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)原创 2017-05-13 10:36:45 · 400 阅读 · 0 评论 -
bzoj1230[Usaco2008 Nov]lites 开关灯 线段树lazy标记
明明就是个裸的线段树还不让我一遍过。 tmd标记每次要取反而不能直接标记1或者0。。因为有可能传递下来的标记和修改的标记重叠了。。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for原创 2017-05-25 16:11:28 · 314 阅读 · 0 评论 -
Atcoder Regular contest 085F NRE 线段树+DP
题意:给你两个序列,a全部为0,b给出,给出一些区间,可以把a上的这些区间变为全1,要求操作以后两个序列对应位置不相同的个数最小,n<=2e5. 说实话这种区间操作很容易想到线段树,但是我没想到DP,水了水了。。 主要还是题目的模型没化出来吧,直接做其实是不可做的。。 把(ai,bi)看成是一个数对,那么答案其实就是(1,0)和(0,1)的数量,也就相当于(0,1)+(0/1,0)-(0,0)原创 2017-12-07 17:11:44 · 382 阅读 · 0 评论