线段树/RMQ/扫描线
Anxdada
多读书多看报, 少吃零食多睡觉
展开
-
HDU 1540 Tunnel Warfare 【线段树 + 思维】
传送门 // 题意: 初始1-n村庄全部相连, 然后有三种操作D x 表示摧毁x村, R 表示修复最近一个被摧毁的村, Q x 询问与x存间接或者直接相连的村有多少个,首先询问很明显的就是最接近该询问村的的一段区间的maxx, 和minn值,可以用线段树来维护, 所以终点是找那段区间, 其实也比较好找,也就是二分找下即可.AC Codeconst int maxn = 5e4+5;int cas原创 2018-02-07 17:29:49 · 248 阅读 · 0 评论 -
HDU 5239 Doom 【打表找规律 + 线段树区间更新中的单点更新】好题!
传送门 // 题意: 开始有一个计数器为0, 然后每次询问给出一个区间, 将l-r之间所有的数每一个都平方一下. 平方之前先将sum[l-r] 的和加到s上. 然后每次询问输出s, 注意每次修改操作都要mod 9223372034707292160.思路: 看到提示”线段树区间更新中的单点更新”, 就已经猜出了每个点被更新的次数不会太多次吧? 答案也确实是这样的, 我们先打表, 注意这个lo...原创 2018-03-19 20:52:58 · 261 阅读 · 0 评论 -
Wannafly 挑战赛13 E VVQ 与线段 【思维 + 线段树】
传送门 题意: 一维数轴上给定很多线段, 求任意两条相交线段的异或最小值, 定义线段的异或值为它们并的长度减他们交的长度.思路: 我们随便画出一个样例可得, 对于两条相交直线[l1, r1], [l2, r2], 他们的异或值为(r2+l2) - (r1+l1), 且l2 <= r1 <= r2, 所以很明显可以得出ans = max((r2+l2) - (r1+l1)), 且l2 <= r1原创 2018-04-08 16:44:43 · 286 阅读 · 0 评论 -
CodeForces - 786B Legacy 【思维最短路 and 线段树优化建图】
传送门 题意: 有n个点, q次操作, 操作有三种: 1 u v w 表示u -> v 有有一条权值为w的边. 2 u l r w 表示 u 到 下标在[l, r] 的城市 有一条权值为w的边 3 u l r w 表示 下标在[l, r] 的城市 到 u 有一条权值为w的边 然后求给出起点s, 输出s到每一个点的最小花费. 不能到达输出-1.思路: 很明显直接暴力建边, 建的过...原创 2018-05-24 10:11:15 · 539 阅读 · 0 评论 -
HDU - 5669 Road 【线段树优化建图 and 思维类dp最短路】
传送门 题意: q次描述, 每次描述给出两个区间 a b 和 c d, 表示这里存在一条路在节点 (x,y)之间 ,a ≤ x ≤ b,c ≤ y ≤ d. 权值给出, 问1到n的最短路是多少, 其中你可以使用不超过k次的技能, 每使用一次, 那么你使用的那条道路的权值可以不进行累加, 即该条道路权值为零. 思路: 这道题很明显的线段树优化建图了, 具体建图方法可以参照我另一篇博客 一样的建...原创 2018-05-24 13:47:18 · 444 阅读 · 0 评论 -
HDU 6315 Naive Operations 【线段树区间更新中的单点更新 + 思维】
传送门 题目大意: 对一段区间有两种操作, 一种是区间加一, 一种是询问区间和, 不过区间和的计算方式为改位置元素/起始给定的元素. 其实会给定一个1-n的排列相对应.思路: 区间加不说了,, 主要说询问怎么回答, 实际上我们可以发现对于全体最多进位1e5次, 也就是说我们如果暴力的修改要累加的答案的区间, 实际上只会修改1e5次, 并不多, 但是我们怎么只修改会累加答案的了? 我们发现正...原创 2018-07-29 19:07:29 · 166 阅读 · 0 评论 -
HDU 5828 Rikka with Sequence 【线段树区间更新中单点更新】 好题!!!
传送门 题目大意: 有三种操作: 1. 区间开根 2.区间加 3.询问区间和思路: 如果没有第二种操作, 就非常简单了, BZOJ上面有一道就是这种题, 因为开根的话每个数会下降的很快, 所以暴力的搞也不会搞太久, 但是有了区间加就不一样了.. 比如 3 4 3 4 3 4 3 4 …. 这段区间暴力搞的话, 会变成 1 2 1 2 1 2 1 2 …. 但是如果在区间加2, 有...原创 2018-07-30 09:35:50 · 192 阅读 · 0 评论 -
牛客挑战赛21 E 题 未来城市规划 【树链剖分 + 线段树 + 思维】
传送门 题目大意: 给定一颗以1为根有根树, 树上有边权, 每次询问有两种操作, INC u v w 代表把u到v的路径上所有边权都增加w ASK P 询问以P为根的子树内任意两点之间的距离和思路: 增加操作很好做, 直接在树剖上做就可以了, 关键时怎么处理查询, 很明显我们要找每条边被覆盖的次数的关系来解决, 在树上的一条边, 如果考虑所有经过节点对数经过它次数, 假设连接这条边的时...原创 2018-08-04 16:04:48 · 287 阅读 · 0 评论 -
HDU - 6110 路径交 【LCA + 线段树 + 思维】
传送门 悟: 树上路径相交问题一定和他们之间的LCA的最深的那一两个有关系!!!题目大意: 给定一棵n个点的树,以及m条路径,每次询问第L条到第R条路径的交集部分的长度(如果一条边同时出现在2条路径上,那么它属于路径的交集)思路: 首先我们考虑两条路径相交的情况, A - > B, C - > D, 很明显这两条相交路径为LCA(A, C), LCA(A, D), ...原创 2018-07-31 15:30:41 · 802 阅读 · 0 评论 -
HDU 6406 Taotao Picks Apples 【预处理 + 二分 + 思维(rmq || 线段树)】 多校。 好题!!
传送门 题意: 题意相当于问你改变一个位置之后,从左往右扫描最大值, 这个最大值会改变多少次. 每次改变独立思路:我们首先要预处理出每一个位置从前往后的答案数, 以及前缀最大值, 还有从后往前的答案数, 前面两个可以边读入边处理, 后面那个需要用到单调队列维护一个最大值来处理, 上次多校出过这样的题. 然后有了这三个东西后, 对于每次的修改, 我们要找的就是修改位置前面是否有比修改后的这个数...原创 2018-08-16 15:08:43 · 303 阅读 · 0 评论 -
线段树区间排序问题两道经典问题 UESTC 1919 和 CF 558E
CF - 558E题意: 给定一个字符串, q次操作, 每次操作一个区间, 0表示让这个区间降序, 1 表示升序, 问最后字符串的样子.思路: 区间排序问题, 凡是区间排序问题, 并且里面涉及到的种类不多大概60左右, 都是可以用线段树维护的, 并且种类越少越好排, 所以我们直接用线段树维护当前这个区间每个种类的数量, 这里只有26种, 然后对于每次排序, 我们首先计算出这个区间的每一种种类数...原创 2018-10-09 09:37:00 · 2043 阅读 · 0 评论 -
线段树区间修改之双标记 【lazy两重标记并且分类讨论】
//前面说了单标记的, 那如果都有了? 这个时候就要用双标记了, 并且讨论下之前标记的情况.板子题 模板 : const int maxn = 1e5+5;int cas=1;ll a[maxn];struct node{ int tl, tr; ll val, lazyset,lazyadd; void funset(ll tmp1,ll tmp2) { ...原创 2017-07-26 18:19:14 · 781 阅读 · 0 评论 -
线段树 -- 区间修改 【下放懒人标记】
//分为区间覆盖,区间加或减. 这里只写一种区间覆盖(其他的照着改一下就可以了). 如果都有那就要是双标记, 下一篇讲 . 模板题 板子:const int maxn = 1e5+5;int cas=1;int a[maxn];struct node{ int tl, tr; ll val, maxx, lazy; void fun(ll tmp) { ...原创 2017-07-26 15:50:24 · 899 阅读 · 0 评论 -
RMQ----不更新点
RMQ算法全称为(Range Minimum/Maximum Query)意思是给你一个长度为n的数组A,求出给定区间的最值的下标。当然我们可以采用枚举,但是我们也可以使用线段树来优化,复杂度为(nlogn),但是最好的办法是采用Sparse_Table算法,简称ST算法。他能在进行(nlogn)的预处理后达到n(1)的效率。下面来分析下最大值和最小值,都要用到DP的思想。最小值(Mininu原创 2017-07-17 10:11:23 · 256 阅读 · 0 评论 -
HDU -- 5700 区间交 【思维 + 线段树】
传送门 //中文题面就不说题意了. //思路: 暴力枚举左端点, 在这个左端点上的右端点++, 然后对于每一个左端点找到刚好出现了k次的右端点, 并且这个右端点应该尽可能的靠右, 这样包含的数才尽可能的多. 还要满足位置关系. 那么找刚好出现了k次的右端点, 就用线段树维护, 二分的去找这个点. 最后求一个前缀更新答案就可以了.AC Code/** @Cain */const int maxn原创 2017-09-03 21:41:10 · 476 阅读 · 0 评论 -
POJ - 3162 Walking Race 【树上最远距离 + 线段树处理区间最值 + 尺取法 】
传送门 //一棵树, wc第i天从第i个节点开始跑, 记录一个最大值., 然后可以获得n个最大值, 然后从中选取连续的尽可能长的天数使得其中的最大值 - 最小值 <= m 问这个最大的天数是多少.//思路: 每个点的最大值可由树的直径求出, 然后问题转变为给你一串数字, 从中选取最长的区间, 使得其中的最大最小值之差<=m, 所以处理区间问题当然是用线段树呀, 然后进行尺取, 双指针i,j, 一起原创 2017-10-13 11:14:05 · 423 阅读 · 0 评论 -
codeforces 877 problem E Danil and a Part-time Job 【dfs序 + 线段树区间异或修改】
传送门 //题意: 给定一颗有根(1 )树,树上每一个点起始都有一个值(0或1),然后有两个操作,pow x把以 x为根的子树全部异或1, get x输出以x为根的子树中有多少个1. //思路: 就是一个最裸的dfs序 + 线段树异或修改的,细节请看代码. 注意就是求一个区间中的1,那么就是区间长度-此时区间的值, 然后就是修改下lazy标记处就是了. 还有就是线段树中是dfs序的一些线段,所以原创 2017-11-06 15:11:51 · 520 阅读 · 0 评论 -
HDU 5726 GCD 【区间GCD + 暴力预处理】
传送门 // 题意: 给定n个数. 给出q个询问, 每次询问一个区间的GCD, 以及这n个数中有多少个区间的GCD等于该询问的区间gcd.// 第一个问题用线段树很好维护, 关键是第二个问题的处理, 我们可以利用gcd的种类并不多的特性, 来暴力预处理出所有gcd种类的区间个数. 这样完全是行的通的.AC Codeconst int maxn = 1e5+5;int cas=1;ll a[ma原创 2018-02-01 22:57:42 · 543 阅读 · 0 评论 -
ZOJ 1610 Count the Colors 【线段树区间更新 + 节点为区间】
传送门 // 题意: 定义一种新的数字加humble数字, 它的素因子只有2,3,5,7. 问你n个humble数字是多少.// 思路: 这道题和寻找丑数很像. 就只是多了一个因子7. 但是套路还是不变的. 因为后面的每一个数都是前面的某个数*2, *3, *5, *7得出的. 还是预处理出所有的humble数字, 用一个优先值为小的优先队列来预处理, 有一个问题就是有重复值, 那么每次取出来的原创 2018-01-26 09:07:05 · 305 阅读 · 0 评论 -
CF EDU 37 F SUM and REPLACE 【线段树区间更新中的单点更新】 好题!
传送门题意: 先给出d(i) 的定义为i的因子个数, d(2) = 2, d(1) = 1. 给出n个数, q次操作, 1 l r 代表把l - r 中所有的数变成对应的a[l]; 2 l r 求∑ri=la[i]思路: 当然我们先nlogn预处理出d数组, 然后这种问题是经典的区间更新中的单点更新, 这种问题一般是每个点被修改的次数有限, 像这里应该是被修改6次左右(当a[i] <= 2时修原创 2018-02-03 18:59:22 · 386 阅读 · 0 评论 -
线段树 之 离散化
//有一些题给出的区间很大, 但区间数量不多, 这个时候数组肯定是开不了这么大的, 所以需要进行离散化.板子题 //模板const int maxn=2e5+5;int n,m;int a[maxn], vis[maxn];vector&amp;lt;int &amp;gt;v;struct node{ int tl, tr; ll val, lazy; void fun(...原创 2017-07-26 20:03:46 · 855 阅读 · 0 评论 -
POJ 2528 Mayor's posters 【线段树(区间为节点问题)】
传送门 // 首先说下这道题数据应该是有问题的… 推荐这道题 题意一模一样, 但是这道题更严谨一点. 就是给出n个区间的覆盖信息, 问最后有多少张海拔被看见. 很明显的线段树区间问题, 以一段区间为线段树的一个节点, 然后做区间更新和区间覆盖, 由于区间信息较大, 要进行离散化,这道题唯一有坑的就是它会出现(1, 1), (2, 2)这种长度为0的数据(那里说贴海报怎么可能贴长度为0的), 但原创 2018-02-03 22:10:45 · 263 阅读 · 0 评论 -
线段树 --- 单点修改 以及 区间更新中的单点更新
这里说的是单点修改. 模板题 不同于RMQ,RMQ修改后再去处理,复杂度就会很高. 而线段树修改和询问都还是会保持在logn的复杂度之内.AC Code 和 板子: (求区间最大,最小,区间和稍微修改下就行了, 如果有多种东西(比如说有lazy标记, 或者同时维护多种关系等)要存,直接在结构体中添加相应的元素即可,然后修改一些地方的判断) //直接用就行了.const int ...原创 2017-07-26 13:31:24 · 652 阅读 · 0 评论 -
BZOJ 2957 楼房重建 【线段树经典模型维护区间LIS】
传送门题意:每次会在一个坐标上修建一个新楼房, 问每天修建完后能看到多少栋楼房.思路:如果一栋楼房它的斜率大于前面的任何一个那么就能被看到, 所以我们要维护一个区间之间的合并问题, 其实用分块很好写 , 但是时线段树的一个经典模型, 所以我们就用线段树了.AC Codeconst int maxn = 1e5+5;int n, q;struct node { int tl, ...原创 2018-10-09 09:56:28 · 479 阅读 · 0 评论