线段树
克莉丝汀娜
此时一名自称平民的玩家路过
展开
-
hdu 1166 敌兵布阵 (单点更新,区间求和)
复习线段树。线段树(Segment Tree)是一种二叉搜索树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。对于线段树中的每一个非叶子节点[a,b],它的左子树表示的区间为[a,(a+b)/2],右子树表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二叉树。叶节点数目为N,即整个线段区间的长度。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数原创 2015-03-14 10:34:22 · 378 阅读 · 0 评论 -
hdu 1754 I Hate It (单点更新,区间最值)
#include#include#include#includeusing namespace std;#define lson i<<1,l,m#define rson i<<1|1,m+1,r#define maxn 200005int Max[maxn<<2];void PushUp(int i){ Max[i]=max(Max[i<<1],Max[i<<1|1]原创 2015-03-14 10:54:12 · 392 阅读 · 0 评论 -
hdu 5172 GTY's gay friends (区间最值)
GTY 有n个朋友站成一排,每个朋友有一个值a[i](1 先判断区间[L,R]内的和是否等于1~R-L+1全排列的和,用前缀和实现。.若相等,由于数值可能会有相等的,所以还需要对区间内元素进行判重。如何进行判重呢?用pre[i]记录数a[i]上一次出现的位置,然后对于区间[L,R]内的每一个数判断其pre是否都小于L。这里用线段树查询区间内pre的最大值,看其是否小于L即可。原创 2015-03-14 15:16:21 · 456 阅读 · 0 评论 -
hdu 1394 Minimum Inversion Number(单点更新,区间求和)
给n个数组成的序列,由0~n-1构成。每次把第一个数移动到最后一个数,可以形成一个新的序列。总共可形成n个序列,求这n个序列中最小的逆序数。 先求原始序列的逆序数个数:每输入一个数,统计其之前的比它大的数的个数。这里用线段树记录区间内数的个数。对于每一个数,将其挪到后面之后,新的序列的逆序数个数=原序列逆序数个数-比该数小的数个数+比该数大的数的个数。 #include#in原创 2015-03-14 11:34:59 · 332 阅读 · 0 评论 -
线段树成段更新
hdu 1698n个hook,每个初始化为1,m次操作,更新区间[x,y]的值为z,操作完毕后求所有hook之和。用g++超时。。。#includeusing namespace std;#define maxn 100000#define lson i<<1,l,m#define rson i<<1|1,m+1,rint sum[maxn<<2],col[ma原创 2015-03-24 21:23:53 · 414 阅读 · 0 评论 -
sdut 2880 Devour Magic
打错一个变量,调了一个晚上。。。。给跪了。题目大意:一条线上有n个单元,每个单元含有一定数量的mana,初始值为0,每经过一个时刻,每个单元的mana会增加1。现有m次操作(按时间顺序给出),每次给出t,l,r,表示在t时刻取走区间[l,r]内的所有mana。问最终能获得多少mana。分析:典型的成段更新,区间查询问题。使用线段树维护区间和。更新时,使用两个标记原创 2015-05-08 20:32:55 · 414 阅读 · 0 评论 -
codeforces 445E - DZY Loves Colors
n个结点,每个结点有一个颜色和一个权值,初始颜色依次为1-n,权值初始均为0.现在有两种操作:1、将区间[L,R]内的所有结点染色为c,每个结点的权值增加量为原来的颜色和当前颜色之差的绝对值。2、求区间[L,R]的结点权值和。分析:对于第二种操作,显然是线段树的基本操作之一:区间求和。对于第一种操作,可以用一个标记数组col来表示区间的颜色情况。若col为0,则表示原创 2015-07-26 12:03:05 · 614 阅读 · 0 评论