随笔分类 - 线段树
摘要:线段树题单练习题解 题单 1 hdu 1166 #include <bits/stdc++.h> using namespace std; const int N = 5e4+5; typedef long long ll; int t, n, p, a, b; char op[10]; ll va
阅读全文
摘要:线段树二分 - Luogu P5579 [PA2015] - Siano 经过排序后,每次操作都可以转化为一个连续区间。在割草时,只需要查询最小的高于v的草,然后修改从它开始的整个后缀区间。本题难点在于如果查询最小的高于v的草,如果简单的用二分内套线段树单点查询,是logn * logn的复杂度,会
阅读全文
摘要:可持久化线段树(主席树) - AcWing - 255 - 第k小数 update 2020-12-28 推荐一种非常好看的写法良心的可持久化线段树教程 本题思路: 对于询问,利用主席树处理右端点,利用两个版本的线段树作差解决左端点. 本题代码: #include <cstdio> #include
阅读全文
摘要:吉司机线段树用于维护区间[l,r]对x取最小值,区间查询最小值和区间求和. #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6+10; struct node{ int l,r;
阅读全文
摘要:这题实在把我心态搞崩了 WA了一万发 错误答案吧先留着吧,以后补,今天实在没心情补了 #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N
阅读全文
摘要:线段树 + 扫描线 - HDU 1255 - 覆盖的面积 对于每个区间结点,建立两个变量len1,len2 len1表示区间内被覆盖过一次且仅以次的线段长度 len2表示区间内被覆盖过大于等于两次的线段长度 因此,对于叶子结点: if(l+1==r){ if(cover[rt]==1){ tree[
阅读全文
摘要:题目不难,用权值线段树维护逆序对. 用树状数组也可解.常数更小 #include <cstdio> #include <cstdlib> using namespace std; #define MAX(a,b) (a>b?a:b) typedef long long ll; const int N
阅读全文
摘要:/* * 权值线段树 * 仅能维护小数值数据.对于大数值数据需离散化,但会从在线数据结构退化为离线数据结构. * 本质上,权值线段树就是线段树的一种特殊维护 * * 权值线段树是主席树前置知识 */ /* * Description * [模板]权值线段树: 请使用权值线段树,实现以下操作 * -1
阅读全文
摘要:关于扫描线的一点理解 扫描线本质上是一个只需上传的线段树. int cover[N]; // 记录线段是否被完全覆盖的次数. int length[N]; // 记录线段被覆盖过的长度 我们在进行扫描时,线段树的结点是什么? void update(int l,int r,int rt,int ul
阅读全文
摘要:扫描线 原理比较易懂 参考: [1] 一文读懂扫描线算法 面积并 面积并只需要选择x或y其一做扫描线.每次扫描更新线段树,将扫描线长度 * 两次扫描线距离得到子矩形面积,累加统计答案. /* 扫描线算法 */ /* * 前置知识: 线段树,离散化 * 矩形面积并 */ #include <cstdi
阅读全文
摘要:线段树 二分 - HDU - 4614 - Vases and Flowers 二分查找求解区间左右端点的解法相对较简单. 我的代码里的注释应该写的比较清楚了. 刚刚提交过发现998ms,一个人提交只用了200ms.震惊(以后可能会回头做做这题) #include <cstdio> #include
阅读全文
摘要:在写线段树的时候,经常因为pushdown是否需要更新父节点,子节点,以及update,query哪里需要pushdown纠结半天 这篇文章较好的解释了这个问题 原文链接
阅读全文
摘要:线段树 - dfs序映射至线段树解决区间染色问题 / 时间戳 - HDU 3974 - Assign the task 解法1: 模拟多叉树(数据极端的情况下,复杂度极大) 1. 分配任务操作 对于每一个分配任务操作,我们可以记录分配的任务编号以及分配任务时间. 由于可能存在大量的任务分配操作,我们
阅读全文
摘要:线段树小结 最近几天连着做了十几道线段树的题,虽然是初学,但仍有些许经验想要总结一下. 关于什么样的题考虑使用线段树这一数据结构: 需要维护任意给定区间的某一特征 频繁的区间修改,区间查询 线段树本质上是采用空间换时间,对于给定数据量N,采用N<<2的空间复杂度,以二分的思想构造若干的区间的子段.这
阅读全文
摘要:线段树 区间合并 - HDU - 1540 - Tunnel Warfare 个人解法 思路介绍 1. 建树 所需要的全局变量 int stk_ptr = 0; // 栈顶指针 int stk[N]; // 模拟栈 char cmd[5]; // 接受命令'D','R','Q' int find_l
阅读全文
摘要:题目要求维护区间开方和,但由于 \[ tree[root] \neq sqrt(tree[leftroot] +tree[rightroot]) \] 因此每一个更新操作都需要深入到叶子结点 由于这么做复杂度太高,甚至弱于普通数组,因此考虑优化 \[ tree[root] = right - lef
阅读全文
摘要:POJ - 2528 - Mayor's posters 先说结论,这题数据太弱 这题直接按照1,2,3...离散化有问题,例如数据 1 3 2 4 1 2 4 5 应该输出3,但是直接错误的离散化导致输出为2 对于相邻两个点,如果距离差大于1,则额外增加一个点,即可解决问题 这一题的数据范围为1e
阅读全文
摘要:线段树模板 HDU - 1166 - 敌兵布阵 本题为单点修改+区间查询 求和 #include <cstdio> // #include <cstdlib> using namespace std; #define N (50000+5) int arr[N]; int tree[N<<2]; v
阅读全文