线段树
无名蒟蒻
苟利国家生死以,岂因祸福避趋之
展开
-
[SMOJ1421]栅栏
题意:在平面直角坐标系中,有 N 条平行于 x 轴且端点 y 值分别为 1 至 n 的线段。要求从 (S,N) 开始,每次走到一条线段的左端点或右端点,然后可以往下跳,到达第一条能“接住”该点的线段(这里的接住定义为:设下跳点为 x,则 Ai≤x≤Bi 的线段可以“接住”该点),又选择走到新线段的左端或右端,最后掉到 y=0 时要到达 (0, 0)。求出在此过程中,x 方向上最小的移动距离。原创 2017-04-27 15:17:22 · 316 阅读 · 0 评论 -
[SMOJ1833]小球染色
有N个小球从左往右排成一行,小球编号1至N。刚开始所有小球都是0号颜色。现在有M个操作,每个操作是如下两种类型之一: 一、染色操作。格式是:1 a b c,表示的意义是把编号是a到b连续一段的小球全部染成c号颜色。1 <= a,b,c <= 200000。注意:被染色的小球会把之前的颜色覆盖掉。 二、查询操作。格式是:2 x,表示询问编号是x的小球当前的颜色是什么。原创 2017-04-27 15:04:03 · 962 阅读 · 0 评论 -
[SMOJ1700]数组排序
你的任务:对于给定的数组,上述算法每个步骤需要交换元素的次数。原创 2017-03-14 14:08:36 · 211 阅读 · 0 评论 -
poj2823 -- Sliding Window
题目大意:有一个长度为n(n≤10^6)的数列,依次查询区间[1,k],[2,k+1],[3,k+2]……[n-k+1,n]的最值。显然,每次直接求k个数的最值,时间复杂度达到O(n*k),会TLE。所以,我们要换位思考。其实我们可以很容易地发现:第一次查询时,建立一棵范围为[1,k]的胜者树即可。而第二次我们要做的就是:把第1个元素从这棵树中删去,把第k+1个元素插入这棵树中。这一过程可以简化为原创 2016-08-07 11:08:56 · 343 阅读 · 0 评论 -
poj3264 -- Balanced Lineup
题目大意:给定n(1 ≤ N ≤ 50,000)个数,每次求指定区间内的最大值减去最小值的差。分析:这道题目实际上就是一道简单RMQ,可以用st算法解决,也可以用胜者树。st算法代码如下:# include # define max(a,b) a>b?a:b # define min(a,b) a<b?a:b const int SIZE = 50000+5 ; int N , Q , l原创 2016-08-07 11:08:53 · 346 阅读 · 0 评论 -
Winner Tree-胜者树
胜者树是一种数据结构,特点如下:它是一棵完全二叉树。也就是说,除最后一层外,每一层上的节点数均达到最大值;在最后一层上只缺少右边的若干结点。这棵树的所有叶子结点是原始数据(见下文样例)。对于所有非叶子结点,取两个儿子中更优秀的值,就是父亲结点的值,故名胜者树。由于胜者树是完全二叉树,因此如果把根结点编号为1,第二层的结点分别是2、3,第三层是4、5、6、7……那么我们就能发现:每一个非叶子结点的左原创 2016-08-07 11:08:50 · 1736 阅读 · 0 评论