![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
线段树
文章平均质量分 74
qq_38232157
这个作者很懒,什么都没留下…
展开
-
洛谷 P1438 无聊的数列(线段树,差分)
线段树,差分原创 2022-11-02 18:01:08 · 336 阅读 · 0 评论 -
洛谷 P2023 [AHOI2009] 维护序列(线段树)
线段树延迟标记原创 2022-11-02 17:12:30 · 191 阅读 · 0 评论 -
洛谷 P1168 中位数(权值线段树,离散化)
权值线段树,离散化原创 2022-10-29 23:55:12 · 142 阅读 · 0 评论 -
POJ 2777 Count Color(线段树,区间修改)
线段树,区间修改网上老哥思路:线段树节点存储该区间内的颜色,单点区间肯定就是染成的颜色,大区间如果标记为-1则表示该区间由多种颜色的小区间组成,注意初始情况下木板均为同一种颜色,可以记为1。一共有最多30种颜色,所以用bool vis[30]数组标记,在每次查询的时候清空,查询到点或区间颜色相同时,对该颜色标记为true,最后统计1~T这T种颜色使用的个数即vis是true的情况本题要点:1、节点维护的信息:区间范围: [l, r]区间的颜色: color延迟标记: flag2、 套用线原创 2020-09-29 16:53:08 · 114 阅读 · 0 评论 -
POJ 2828 Buy Tickets(线段树)
线段树题意:第一行输入一个整数n,代表有n个人,以后的n行每行有两个数x,y代表把值为y的数放在第x个数之后(x==0代表值为y的数在第一个位置),要求按顺序输出这个序列本题要点:1、从后往前插入数字,比如第一个样例40 771 511 332 69最后一个数字 69, 插入到 下标3, 然后这个位置就是最终的位置。 倒数第二个数字 33, 插入到从头数 第 2 个空位,在这里,也就是下标2。倒数第3 个数字 51, 插入到 从头数 第 2 个空位, 此时下标 2, 3 都已经有数子了原创 2020-09-29 13:07:43 · 67 阅读 · 0 评论 -
HOJ 1754 I Hate It(线段树,点修改)
线段树,点修改本题要点:1、节点开个 max 表示区间 [l, r] 范围内的最大值。套用线段树 点修改 的模板。执行相应的修改查询操作即可。#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int MaxN = 2e5 + 10;int n, m;int score[MaxN];struct segTree{ int l, r; i原创 2020-09-28 13:03:50 · 80 阅读 · 0 评论 -
HOJ 1698 Just a Hook(线段树,区间修改,延迟标记)
线段树,区间修改,延迟标记本题要点:1、每个节点都有一个延迟标记 add , 一开始,所有的节点的 add 都初始化为0.2、区间修改,这里的某个区间 [l, r], 一下子改成 某个数值。 所有,节点的额sum 值,直接赋值即可tree[p].sum = d * (tree[p].r - tree[p].l + 1);3、向下扩展完成后,把标记 add 置零。#include <cstdio>#include <cstring>#include <iostre原创 2020-09-28 12:19:34 · 67 阅读 · 0 评论 -
HOJ 1394 Minimum Inversion Number(线段树,逆序数)
线段树计算逆序数本题要点:1、本题中n个数,恰好是 0 ~ n - 1,不需要离散化,而且没有任意两个数相同的。2、 先初始化树, 所有节点的sum 赋值为0。 然后每次新加入 一个数 a[i], 先查询 区间 [a[i] + 1, n + 1]这些数出现的总次数。 意味着,查询比 a[i] 先加入的,并且比 a[i] 大的数的总数。 这些数与 a[i] 构成逆序数。然后,执行更新操作, update(1, a[i]), 表示 a[i] 出现的次数加1.3、 求出序列 a[1], a[2], …原创 2020-09-28 00:04:09 · 60 阅读 · 0 评论 -
HOJ 1166 敌兵布阵(线段树,点修改区间查询)
线段树,点修改区间查询本题要点:1、套用 线段树模板,使用延迟标记 add. 某点减去值 d, 相当于加上 -d;#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int MaxN = 50010;int a[MaxN];int T, n;char cmd[10];struct segTree{ int l, r; long long原创 2020-09-27 19:06:59 · 77 阅读 · 0 评论 -
P3373 【模板】线段树 2(线段树,延迟标记)
线段树,延迟标记本题要点:1、同时对某个区间 [L, R] 的每个元素,加上 d, 乘上d。定义结构体时候,加上 add, mul 标记。 struct segTree { int l, r; long long sum; long long add, mul; //区间的加标记,乘标记 }2、细节实现:子树的sum、mulv、addv值分别乘上当前节点的mulv值;当前节点的mulv值还原,即置为1;子树的addv值加上当前节点的addv值;子树的sum值加上(子树包含原创 2020-09-27 17:56:46 · 74 阅读 · 0 评论 -
洛谷 P3372 【模板】线段树 1(延迟标记)
线段树,延迟标记本题要点:1、延迟标记:当前的修改或者查询的区间范围是[l, r], 如果某个节点的区间 p 被 [l, r] 所覆盖(l <= tree[p].l && tree[p].r <= r),并且这个节点p ,在后续再也没有访问到,这个节点的子节点的相关信息可以不修改。 如果 p节点后续访问到了,只有在访问到的时候,先更新 p 节点的所有子节点信息。 至于延迟标记,可以在 节点的结构体中,增加 add 标记。查询到某节点 p, 根据 add 标记, 先原创 2020-09-23 17:26:04 · 154 阅读 · 0 评论 -
POJ 3264 Balanced Lineup(线段树, 裸题)
题目意思:农夫约翰有N头奶牛,每头牛都有差异,现在农夫约翰想进行查询一定范围内的奶牛的高度最大值和最小值的差,奶牛查询操作数量为(1 ≤N ≤ 50,000),查询次数为(1 ≤Q ≤ 200,000)。本题要点:1、线段树,每一段同时记录最大值和最小值。 题目只涉及到 建立线段树 build 和 查询操作 ask 。2、在 ask 函数中,注意不要直接返回整个结构体,不然会超时。 直接用全局变量 ans_max, ans_min来记录每一段的最大值和最小值,然后在 ask 函数的递归边界中,原创 2020-06-21 11:38:34 · 97 阅读 · 0 评论 -
CH 4302 Interval GCD(进阶指南,线段树,树状数组)
算法竞赛进阶指南,215页, 线段树,树状数组本题要点:1、最大公约数 gcd(x, y) = gcd(x, y - x), 三个数的情况:gcd(x, y, z) = gcd(x, y - x, z - y), 联想到差分数组, 令 b[i] = a[i] - a[i - 1],用线段树维护 数组b 的区间最大公约数,a) 每次 询问 “Q L R” ,就是要求出 gcd(a[L], ask(1, L + 1, R))注意, L == R 的情况,直接返回 a[L]即可(也就是gcd(a[L]原创 2020-06-20 00:05:35 · 155 阅读 · 0 评论 -
CH 4301 Can you answer on these queries III(进阶指南,线段树)
算法竞赛进阶指南,215页, 线段树本题要点:1、线段树的每个节点维护的信息线段的左右端点:L 和 Rdat : 区间最大连续子段和sum : 区间所有数的总和lmax: 紧靠左端的最大连续子段的总和rmax: 紧靠右端的最大连续子段的总和2、线段树 的父节点 p 和左孩子 2 * p, 右孩子 2 * p + 1 的信息关系, 在build 和 change函数中维护好节点的信息t[p].sum = t[2 * p].sum + t[2 * p + 1].sum;t[p].lmax原创 2020-06-19 16:59:53 · 119 阅读 · 0 评论