
数据结构-线段树(Segment tree)
数论只会GCD
研二在读
展开
-
线段树小结
所谓线段树, 就是一种支持在线更新和查询的数据结构, 建树的时间复杂度为O(nlogn), 而大多数情况能保证每次查询的复杂度为O(logn), 搞笑快速。建树:大概就是这样, 每个区间都有一个父节点, 设父节点下标为rt, 区间为[l, r], rt存的是该区间内的信息;当 l == r时, rt代表下标为l的单点信息。rt的左孩子下标为rt 左孩原创 2016-09-19 13:38:44 · 394 阅读 · 0 评论 -
ZOJ 3772 矩阵 + 线段树
传送门 :zoj 3772 题解 还是节点存储矩阵, 不过这题各哥节点基矩阵不同, 所以要考虑方向,wa + 3, pe + 1AC code:#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define mid ((l + r) >> 1)#define ls rt << 1, l, mi原创 2016-12-10 18:41:33 · 499 阅读 · 0 评论 -
ZOJ 2671 线段树 + 矩阵区间乘积
传送门 : zoj 2671summary 下次, 线段树不用cin, cout了有毒啊AC code:#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int maxn = 30000 + 5;int R, n, M, q;struct Matrix { int v[2][2原创 2016-12-10 23:11:16 · 758 阅读 · 0 评论 -
HihoCoder 1079 线段树 + 离散化
传送门:HIHO 1079题解: 区间离散化, 可以参考hihocoder的提示, 大体意思就是解决问题所需要的区间可以通过离散化缩小规模, 只要区间端点相对大小不变就可以 然后用线段树设置lazy标记, 更新所有海报情况后, 查询未被覆盖的海报细节 离散区间和连续区间有区别, 这里是连续区间, 最小区间:[n, n +1], 所以到最小区间判断标志是r - 1 == l; l原创 2016-11-21 22:36:56 · 1003 阅读 · 0 评论 -
HDU 3333 树状数组(线段树) + 离散化 + 离线处理
传送门:HDU 3333题意 给定一个长为n的序列, 做m次查询, 查询结果为区间内只出现一次的数字集合之和题解 刚开始想的读入时用map映射,如果前面出现过, 线段树之前出现位置结点为0当前点原值, 没出现的话直接原值, 但是发现这样只能查询右端为当前位置左端为1的结点, 所以要先对查询做处理 查询预处理是对查询做r递增排序, 同时要有个idx对应查询下标 所以为了实现全部原创 2016-11-22 13:34:19 · 568 阅读 · 0 评论 -
POJ 3667 线段树
传送门: poj 3667题解: 优先左边, 区间合并/* adrui's submission Language : C++ Result : Accepted Favorite : Dragon Balls Love : yy Motto : Choose & Quit Standing in the Hall of Fame*/#include<iostr原创 2016-11-27 21:53:29 · 386 阅读 · 0 评论 -
CodeForces - 719E Sasha and Array 线段树 + 矩阵快速幂
传送门:CF 719 E题解 区间更新 注意这里节点是矩阵, 所以初始化要是E 矩阵结合律 + Fibo la表示lazy不过这里是矩阵, 所以初始是E, sum是区间的ans矩阵, lazy纯粹的标记AC code:/*adrui's submissionLanguage : C++Favorite : Dragon BallsLover : yyMotto :原创 2016-12-09 23:05:41 · 567 阅读 · 0 评论 -
线段树模板--C++
无合并/* adrui's Segment Tree*///无区间合并的区间更新 & 查询const int N = 100000 + 5;int ans[N << 2], lazy[N << 2]; //数组, 不需要区间合并的时候数组可以#define mid ((l + r) >> 1)原创 2016-12-21 19:25:52 · 1889 阅读 · 0 评论 -
HDU 5997 & bestcoder #90 C 线段树
传送门 : HDU 5997题解 最初想过用vector存储, 但是没敢写…. 区间合并 + 成段更新 这题和普通线段树区间更新的区别就是待更新的区间不确定, 所以只要把要更新区间表示出来, 就行了 x -> y找到x代表的vector存储的多个成段区间, 一个个更新, 这些段加到y的段里, 然后清楚x的段 今天水过结果920MS,目前垫底。。。。打不动AC Co原创 2016-12-18 15:55:23 · 646 阅读 · 0 评论 -
HDU 4288 线段树 + 离线处理
传送门 :HDU 4288题解 先上代码, 候补AC code:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;#define mid ((l + r) >> 1)#define ls rt << 1, l, mid#原创 2016-12-30 15:15:39 · 965 阅读 · 0 评论 -
BUAA 173 区间求和线段树 裸题
传送门 : BUAA 173 期末了, 要复习, 所以刷水题防手生 ps :BUAA自动生成的头注释不错, 打算写个脚本AC code/* Author: YY & 8023 Result: AC Submission_id: 228165 Created at: Tue Dec 20 2016 22:59:18 GMT+0800 (CST) Problem_id: 173原创 2016-12-20 23:08:21 · 472 阅读 · 0 评论 -
HDU 4747 线段树 + 区间更新 + java
传送门 : HDU 4747题外话 13年杭州网络赛的一题, 同学推荐做的, 算是磨练一下自己的线段树, 最近在系统的学java, 确实很骚气, 就用java写了, 搞事情啊 看来线段树还是有点成果的, 虽然慢了一点, 但是1A 有大神这题40行dp, 太可怕了, 附个链接:DP递推计数(ORZ)题意 给定n个数找出Sum{mex(i, j)} mex(i, j )指[i原创 2017-01-13 16:04:24 · 779 阅读 · 0 评论 -
SPOJ 1716 GSS3 Can you answer these queries III 线段树区间合并
传送门:SPOJ 1716 题意 求动态区间最大子段和题解 线段树区间合并维护区间和, 左右连续最大字段和, 最大字段和AC code:#include<iostream>#include<cstring>#include<cstdio>using namespace std;typedef long long ll;#define lch(x) x << 1#define r原创 2017-01-17 17:21:04 · 500 阅读 · 0 评论 -
HDU 4548 素数打表 + 线段树
传送门:HDU 4548题解 因为数据量和查询次数较大, 所以要用线段树求解 同时要注意美素数打表, 方法是对每个素数判断是否为美素数, 因为一个数字必定大于等于其各位数字之和,找到素数后它的各位数字之和是否为素数是已知的, 所以判断时比较容易实现美素数打表(下附素数打表模板)建树查询//打出1 ~ n 之间的素数用数组p[]保存;(n >= 2)void get_prime(原创 2016-11-02 16:11:12 · 520 阅读 · 0 评论 -
HDU 3308 线段树区间合并 + 单点修改
传送门: HDU 3308题解: 维护最大连续和左右连续 区间合并查询/* adrui's submission Language : C++ Result : Accepted Favorite : Dragon Balls Love : yy Motto : Choose & Quit Standing in the Hall of Fame*/#in原创 2016-11-27 19:35:44 · 415 阅读 · 0 评论 -
UVA 11992 线段树区间更新 + 两个lazy(二维线段树)
传送门:UVA 11992题解 最多有20行, 可以建20棵线段树, 然后更新查询时按维数维护 线段树区间合并, 两个lazy有主次之分(set比add优先) pushDown()和pushUp();/*adrui's submissionLanguage : C++Result : AcceptedLove : llFavorite : Dragon BallsSta原创 2016-10-21 23:15:12 · 607 阅读 · 0 评论 -
UVA 11235 线段树区间合并 & 离散化
传送门 : UVA 11235题意 给定一个长为n的数列, 给定q个查询, 查询[l, r]内出现最多数字的出现次数 题解 常规解法: 线段树区间合并, 需要注意的是, 查询时的区间合并不能忽略 离散化,离散的运用:将连续的相等的一个区间的点集,聚集为线段树的一个节点,并且在这个节点上有信息能体现出这个区间的性质。 code:/* *adrui's submi原创 2016-10-22 23:12:32 · 497 阅读 · 0 评论 -
HihoCoder 1078 线段树区间更新
传送门:HihoCoder 1078题解 就是一个lazy标记 code:/*adrui's submissionLanguage : C++Result : AcceptedLove : llFavorite : Dragon BallsStanding in the Hall of Fame*/#include<cstdio>#include<cstring>#i原创 2016-10-13 18:47:36 · 400 阅读 · 0 评论 -
POJ 2828 线段树单点更新
POJ 2828题解:这题最巧的是, 最后一个人的顺序是固定的, 反向更新运用线段树比较简单。比如, 最后一名选在第i个人后面, 那么他的位置就是i + 1, 以此类推倒数第二个.....这题是早前训练做的一道, 今天补上题解AC code://adruill's submission#include#原创 2016-09-17 16:12:47 · 444 阅读 · 0 评论 -
HDU 2795 单点更新 + 区间最值
HDU 2795这题有点特殊, 要在查询的时候更新, 而且 因为是找最小的行数, 所以非左即右,优先考虑左(存在解情况下)AC code:#include #include #include #include #includeusing namespace std;#define debug 0#define inf 0x3f3f原创 2016-09-15 14:02:05 · 308 阅读 · 0 评论 -
HDU 1754 单点更新 区间求和 zkw线段树 + 递归线段树
HDOJ 1754线段树裸题,直接上代码。AC code:递归线段树://lrl's submission#include#include#includeusing namespace std;#define debug 0#define ls root << 1, l, mid#define rs root << 1 | 1,原创 2016-09-14 13:03:01 · 779 阅读 · 0 评论 -
hdu 1698 区间更新
HDU 1698AC code://lrl's submission#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define debug 0#define LL l原创 2016-09-14 12:59:27 · 404 阅读 · 0 评论 -
POJ 3468 线段树 区间更新+区间求和
POJ 3468经典区间更新题, 第一次完整敲完, 很不熟练, 要好好提升姿势水平。。AC code://lrl's submission#include#include#include#include#include#include#include#include#include#include#includeusing原创 2016-09-13 19:40:26 · 405 阅读 · 0 评论 -
HDU 1166 单点更新 区间求和(ZKW 线段树)
题目链接:HDU 1166题解:没啥特殊的, zkw线段树直接在单点更新时向上更新就可AC code://lrl's submission#include#include#include#include#include#include#include#include#include#includeusing name原创 2016-09-11 10:02:46 · 515 阅读 · 0 评论 -
poj 3264 RMQ问题 zkw线段树
题目链接:POJ 3264题意:RMQ问题题解:采用非递归线段树,orz神牛真是太强了,这种线段树好理解, 我成功1A,本蒻苣简直不敢相信....上代码://lrl's submission#include#include#include#include#include#include#include#include#inc原创 2016-09-09 15:00:53 · 403 阅读 · 0 评论 -
hihoCoder 1116 计算 线段树 + 区间合并
hihoCoder 1116题解: 线段树区间合并题, 这题需要考虑前缀积(lAns)、后缀积(rAns)、 区间积(multiAns)以及区间ans:∑1 <= i <= j <= n f(i, j的合并. 区间[a, b]和[c, d]合并的时候只要合并两区间各自的ans以及[a, b]的后缀积和[c, d]的前缀积的乘积(因为只有[a, b]的后缀可以和[c, d]的前缀合并), lAns原创 2016-10-08 16:41:27 · 639 阅读 · 0 评论 -
POJ 3511 && AOJ 299 素数筛法 + 线段树
题意 比较明显了, 细节题, 惨code#include<iostream>#include<cstring>using namespace std;const int N = 1000005;const int M = 1 << 20;int sum[N << 2], ans[N << 2], s, a;bool f[N];void init(){ memset(f, 0,原创 2017-03-01 15:44:14 · 655 阅读 · 0 评论