线段树及数据结构
文章平均质量分 81
shiqi_614
这个作者很懒,什么都没留下…
展开
-
hdu 4288 Coder & CF85-D Sum of Medians (单点更新)
题意:有三种类型的操作,1."add x"表示往集合里添加数x。2.“del x”表示将集合中数x删除。3.“sum”求出从小到大排列的集合中下标模5为3的数的和。集合中的数都是唯一的。线段树。在线段树中维护当前这个集合中数的个数cnt,和所有的数模5为0……4内的数的和设为mod[0...4]。在进行区间合并的时候,父区间里的mod[0...4]首先等于左子区间里的mod[0...4],设要原创 2012-09-16 20:22:16 · 2824 阅读 · 0 评论 -
Codeforces Beta Round #35 (Div. 2) E. Parade(成段更新)
题意:给你n个建筑的楼顶的高度,以及楼顶的左坐标l,右坐标r(可以看成是线段),问整个建筑的轮廓的转折点。 易得,当两个建筑和交叉的部分时,那么显现出的轮廓的,一定是比较高的那个建筑,那么我们在线段树中放下每个线段,重叠部分取较大值,然后遍历线段树中的每个叶子结点,如果与前一个结点的高度不同,那么就一定是出现了转折。 l与r很大,要用离散化。#inclu原创 2013-03-29 16:58:05 · 1788 阅读 · 2 评论 -
uestc 1425 Another LCIS(成段更新)
题意:有T(t 要记录区间里的最长的序列长度是多少,用mx来记录。由于最长的连续上升序列可以在区间的左端点,右端点,所以在线段树里增加两个域lmx和rmx,分别表示,在区间的端点处,分别向右向左的最长的满足条件的序列长度。但是还有可能出现在中间,所以又增加两个域lval和rval,分别表示区间端点的值是多少。合并的时候,判断左儿子的rval是否小于右儿子lval,如果满足,这个原创 2012-11-27 01:19:30 · 2346 阅读 · 5 评论 -
hdu 3950 Parking Log(单点更新)
题意: 有T组测试数据,每组数据的N和Q分别表示停车场有N个位置(下标从1开始),Q个操作。操作有两种(1)"A M L R",表示这个车队有M辆车,如果前面的空位,要求与前面的车的距离不超过L,如果后面有车,要求与后面的车的距离不超过R,如果前面或后面没有车,条件L,R的限制忽略,如果有满足条件的位置输出起点的下标,如果有多个满足条件的位置输出下标最小的一个,如果没有满足条件的位置,输出-1。(原创 2013-03-29 16:28:06 · 2522 阅读 · 0 评论 -
hdu 4521 小明系列问题——小明序列(单点更新)
题意:有多组测试数据,每组数据的n和d表示,有n个数,求间距大于d的最长上升序列。(1 如果数据范围比较小,就是一比较水的DP了。但是10^5级别的数据,O(n^2)的复杂度显然不科学。 用线段树搞定。线段树中叶子结点表示值为i的并且以其结束的最长上升序列是多少。每次转移的时候,查询比当前值小的最大值就可以了。#include #include原创 2013-03-29 16:43:45 · 2616 阅读 · 0 评论 -
Codeforces Beta Round #99 (Div. 1) C Mushroom Gnomes - 2(单点查询)
题意:有n棵树,m个蘑菇,每棵树有坐标a,高度h,向左边倒的概率,向右的概率(概率用0-100表示),向左倒范围[x-h,x)内的蘑菇被破坏,向右倒范围(x,x+h]范围内的蘑菇被破坏。每个蘑菇有坐标b,及它的魔力值z。 问树倒下后,所以蘑菇的魔力值的和的期望。 离散化之后,成段更新,即树倒下范围内的区间全部乘以倒向这边的概率。最后遍历每个蘑菇的存活的概率乘以它原创 2013-03-30 00:54:27 · 1697 阅读 · 0 评论 -
ZOJ 3299 Fall the Brick(成段更新)
题意:有n排板砖,m个木板,边界的l和r的n列板砖从天上掉下来,然后有m个边界的a,b的高度为h的木板去接那些板砖,一排板砖中的部分板砖如果掉到木板上就停止下落,剩下的继续下落,问最后每块木板上有多少块板砖。 开结构体去存储线段树中节点的信息MLE了。。 按木板的高度,从低到高,去更新线段树节点对应的木板的编号。 板砖落下时,将对应区间的覆盖次原创 2013-03-30 01:59:24 · 1754 阅读 · 1 评论 -
spojGSS2 1557 Can you answer these queries II(成段更新)
题意:给你N个数,每个数a[i]的范围在[-100000,100000],然后有Q个查询,每个查询问区间[x,y]内最大子区间和为多少,并且重复出现的值只能计算一次(如果是负数,输出0,即可以子区间可以为空)。 离线处理查询。每个值只能计算一次的方法同之前的hdu 3333 Turing Tree & hdu 3874 Necklace (成段更新)及Codeforces Rou原创 2012-12-20 03:04:53 · 2499 阅读 · 4 评论 -
hdu 4533 威威猫系列故事——晒被子(成段更新)
题意:给你N个矩形,每个矩形给出左下角坐标,右上角坐标,有M个询问,每个询问给出一个时间t,问(0,0),(t,t)的范围内矩形的面积和(重叠的也算)。用树状数组去维护A*t*t+B*t+C这个式子的A,B,C三个系数,维护在不同的t时,ABC分别应该为多少。分成三个阶段。在这个阶段,计算面积的公式为(t-x1)*(t-y1),因式分解之后,得到三个系数的值。这种情况是max(原创 2013-04-30 15:36:09 · 2537 阅读 · 0 评论 -
Codeforces Round #169 (Div. 2) E.Little Girl and Problem on Trees(成段更新)
题意:一棵树有n个节点,但是除了根节点1外,其他节点都的出度和入度加起来就只有2(就是棵树是由几条链的第一个节点粘在一起的),现在有两种操作(1)"0 v x d",在距离v节点距离d以内的所有节点的权值都加上1,(2)"1 v",查询节点v上的权值。 没想到办法静态建树,用vector >去动态地建树。 去掉根节点,对每条链建一个树状数组(表示这个链上的每个节原创 2013-03-29 16:51:32 · 1692 阅读 · 0 评论 -
UESTC 1525 Fruit Ninja(扫描线)
题意:有T组测试数据,每组数据的N,H,W表示有N个炸弹或水果,H和W表示用来“切”水果的板砖的长宽,要求W必须平行于X轴,H必须平行于Y轴。问一板砖下去,最多能拍到多少个水果(要求不能拍到炸弹),在拍到最多水果的前提下,问板砖有多少种拍水果的方案(即如果板砖的四条边上都要水果“牺牲”,那么方案数计一,否则板砖就可移动,那么方案数就是so many!) 下面的N行,每行给出炸弹或原创 2013-03-29 16:36:40 · 1444 阅读 · 0 评论 -
UVALive 4730 Kingdom(并查集加 线段树或树状数组)
题意:有T组测试数据,每组数据的N表示有N个城市,接下来的N行里每行给出每个城市的坐标(0 用并查集维护每个城市群的的最大的y值和最小的y值,以及这个城市群内有多少个点。 每次更新的时候,先把原先城市群里的东西从线段树里去掉,更新好这个城市群之后,再放下去。 不过,用线段树要离散化,麻烦了点,写了两树状数组。分别维护有多少个state和city原创 2012-12-23 16:19:15 · 1695 阅读 · 2 评论 -
hdu 3340 Rain in ACStar(成段更新)
题意:有T组测试数据,每组数据有N个操作,(1)“R P”,表示掉下了一个P边形,接下来的一行里,给出这P个点的坐标——首先是最左边的点,然后从这点开始逆时针给出其他点。(2)"Q A B“,查询数轴上区间[A,B]内面积的和。 易知,图1里的那个三角形的面积是通过,图2里红色的面积加上图3里绿色的面积,然后减去图4里黄色的面积。 这些图形都可以转化成梯原创 2012-12-23 10:25:31 · 2061 阅读 · 0 评论 -
UESTC 1558 Charitable Exchange
题意:star开始有1元的东西,有N种交易,每种交易Vi,Ri,Ti表示用至少Ri的东西去换得Vi的东西,这个过程要求的时候是Ti。问最后得到至少M元的东西,如果能得到花费的最少的时间是多少。 在线段树的每个叶子结点ai里用mi表示交换到价值为ai的物品所需要的最少时间。对每个交易,按可以交易的最小金额(就是Ri)从小到大排序,接下来可以全是线段树的操作。 对于原创 2012-12-23 14:35:24 · 1607 阅读 · 0 评论 -
POJ 2481 Cows
题意:有N头牛,每只牛有一个测试值[S,E],如果对于牛i和牛j来说,它们的测验值满足下面的条件则证明牛i比牛j强壮:Si Ej - Sj。现在已知每一头牛的测验值,要求输出每头牛有几头牛比其强壮。 给你一些区间,问,对于给出的每个区间,有多少个区间是完全包含它的。 先将S从小到大排序,E从大到小排序,这样就可以保证在放入一个区间里,前面所以放下的区间的左端点原创 2012-12-23 15:34:16 · 2010 阅读 · 0 评论 -
hdu 3333 Turing Tree & hdu 3874 Necklace (成段更新)
题意:有T(1可以用离线的方法,方法如我之前关于Codeforces Round #136 (Div. 2) D. Little Elephant and Array的解题报告里介绍的两种方法没有什么太大的区别。另外hdu 3874 Necklace只是变化了数据范围,其他的都一样。#include #include #include #include #include #i原创 2012-12-13 15:11:13 · 1459 阅读 · 0 评论 -
hdu 3016 Man Down(成段更新,单点查询)
题意:有N块木板,每块木板有四个属性,高h(h>0),左边界xl,右边界xr(0这是一个简单的DP或者说最长路。但是木板的数目很大,如果建立每个木板到其他木板的转移用O(N^2)的复杂度,显然是会超时的,这时候,就可以借助线段树。将木板按h从小到大排序,初始时,更新线段树里的全部节点为地面的下标,然后往上添加木板的过程就是,单点查询每个木板的xl和xr,得到的下标就是当前木板能转移到的其他木板原创 2012-12-13 15:35:06 · 2292 阅读 · 0 评论 -
Codeforces Round #163 (Div. 2) E. More Queries to Array...
题意:有N个数,M个操作。(1)"= l r k",表示把区间[l,r]的数全部变成k。(2)"? l r k",查询区间[l,r]范围里。k比较小,将式子拆开成多项式,一项一项加。数学的东西感觉多些。。#include #include #include using namespace std;typedef long long LL;#define LL(x) (x<<1)原创 2013-01-23 16:19:12 · 1681 阅读 · 0 评论 -
POJ 2886 Who Gets the Most Candies?(单点更新)
题意:模拟约瑟夫环。有N(1<=N<=500000)个孩子围成一圈,他们被顺时针编号为 1 到 N。每个小孩手中有一个卡片,上面有一个非 0 的数字,游戏从第 K 个小孩开始,他告诉其他小孩他卡片上的数字并离开这个圈,他卡片上的数字 A 表明了下一个离开的小孩,如果 A 是大于 0 的,则下个离开的是左手边第 A 个,如果是小于 0 的,则是右手边的第 A 个小孩。游戏将直到所有小孩都离开,在原创 2011-10-07 19:35:20 · 2140 阅读 · 9 评论 -
hdu 4638 Group
题意:给你一个1~N的排列,问区间[L, R] 之间有多少段连续的数。比如区间里有3、1、2、5、6,这五个数,那么就有3、1、2和5、6这两段。 离线处理每个查询,遍历每个点,设当前处理的区间终点为R,处理每个查询的时候,首先假设所有的数a[i]都是自己独立成段,如果有a[i]+1,或者a[i]-1的数在区间[L,R]内,那么它肯定不是独立成段的,也就是我们要减去在[L,R]内原创 2013-08-13 01:37:10 · 2636 阅读 · 0 评论 -
URAL 1855 Trade Guilds of Erathia
题意:有N个城市,M个操作。城市形成一条链,下标分别从1到N,相邻城市有一条道路相连,初始通过每条道路的费用为0。有两种类型的操作,(1)"change a b d",表示从城市a到城市b之间的每条道路的费用改变d(如果d大于0,增加,反之减少)。(2)"establish a b",表示查询在城市a到城市b之间任意选两个城市作为道路的起点和终点,问通过这些道路的平均费用。 设当原创 2013-08-13 02:31:40 · 3421 阅读 · 0 评论 -
hdu 4578 Transformation
题意:给你一个数组,初始值为零,有四种操作(1)"1 x y c",代表 把区间 [x,y] 上的值全部加c(2)"2 x y c",代表 把区间 [x,y] 上的值全部乘以c(3)"3 x y c" 代表 把区间 [x,y]上的值全部赋值为c(4)"4 x y p" 代表 求区间 [x,y] 上值的p次方和1因为P只有1到3,(x+c)^2=(x^2)+(2*x*c+c^2)原创 2013-08-13 01:59:41 · 3024 阅读 · 0 评论 -
hdu 4419 Colourful Rectangle(扫描线)
题意:给你10000个三种颜色的矩形,不同颜色的矩形相互覆盖会形成不同的颜色,问形成的七种颜色的面积是多少。扫描线。线段树的每个节点里维护好七种颜色的长度。直接暴力跑一次即可。#include #include #include #include #include #include using namespace std;#define LL(x) (x<<原创 2013-09-13 10:21:08 · 3002 阅读 · 0 评论 -
ZOJ 3521 Fairy Wars(扫描线)
题意:平面上有N个子弹,每个子弹的坐标已知,现在在距离点x0,y0为R的圆内,所以的子弹都会变成冰块L*L,并且在L*L范围内的所有其他子弹也会变成冰块,问,当连锁反应结束时,变成冰块的子弹数有多少。也就是说落在子弹L/2的范围内的子弹都会结冰,也可以转化成只要边界在子弹L/4范围内的子弹会结冰,这样扫描线就可以搞定了。#include #include #include #in原创 2013-09-18 22:02:44 · 3168 阅读 · 0 评论 -
hdu 4747 Mex
题意:给你N个数,枚举所有的L和R,问由区间[L,R]之间的数构成的集合里,哪一个数字没有出现,如果有多个,找出最早的一个,设其为x,求所以x的和。如果固定R,设R这个位置的值为Key[R],可以发现整个x数列是递减的,随着R的左移,可以从当前的R到前一个Key[R]出现位置之间的X,都不应该大于R,如果发现了这个性质,就是一个简单的成段更新了。#include #include原创 2013-09-18 22:11:37 · 3889 阅读 · 1 评论 -
ZOJ 3525 Disappearance(扫描线)
题意:有三维的空间里有N个点(N因为N只有5000,起先我们的方法是暴力去枚举两维,即按X排序,找出点彼此间距离不超过LB的点,然后将这些点按Y排序,在线段树中放进Y之间最大距离不超过LW的点。。但是这样死活过不了。。最后枚举一维,直接按X排序,然后就是poj 2482的做法了。。#include #include #include #include #include usi原创 2013-09-18 22:21:16 · 3363 阅读 · 0 评论 -
ZOJ 3724 Delivery(离线线段树)
题意:N个点,对于每个点i,都有一条连向i+1的有向边,另外有M条其他的有向边,有Q个询问(U,V)求U到V的最短路。当UV的处理方法很相似。分两种情况,分别离线处理一次就可以了。//#pragma comment(linker, "/STACK:102400000,102400000")#include #include #include #include #include原创 2013-09-23 23:31:59 · 3721 阅读 · 0 评论 -
Codeforces 343D Water Tree
题意:一棵树有N个节点,有三种操作(1)“1 v",表示将以点v为根节点的子树全部赋值为1,(2)"2 v",表示将点v以及点v的所有祖先节点全部赋值为0,(3)"3 v",表示查询点v的值。将树型转线性之后,我用了两棵线段树去维护这两种操作,明显可知的是,点v的子树里有一个点进行了操作(2),并且点v进行操作(1)(如果有)的时间早于操作2,那么点v的值就为0,在线段树里维护好每个操作的时间原创 2013-09-27 16:56:36 · 3757 阅读 · 0 评论 -
URAL 1977 Energy Wall(成段更新)
题意:有N(Ni-d+2和点i+d-2加上值2*X……并且,最后所有数加上的X的和等于tot,这个操作之后,tot清零。可知,操作(2)的话,可以看成加上两个等差数列,一个递增一个递减,对于每过一段时间就会所有数就会增加值,也可以表示成加上等差数列。需要注意的时,因为点的数目为10^9,所以要对操作的点离散化,比如有10个点,离散化之后有1、2、7、10。当操作的区间是[2,7]时,中原创 2013-11-10 22:28:19 · 3166 阅读 · 0 评论 -
线段树总结
之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnlySuccess的博文“完全版线段树”里的大部分题目,其博文地址Here,然后也加入了自己做过的一些题目。整理时,更新了之前的代码风格,不过旧的代码仍然保留着。 同样分成四类,不好归到前四类的都分到了其他。树状数组能做,线段树都能做(如果是内存限制例外),所以也有些树状数组的题目,会标示出来,并且放到其原创 2012-11-27 00:38:56 · 25259 阅读 · 22 评论 -
hdu 4286 Data Handler(Splay)
题意:给你一串数字,左右指针的位置,有五种操作,左右指针的左移右移,删除左指针右边的数,删除右指针左边的数,翻转两个指针之间的数。Splay搞过去了。。T了几发是因为,删除的时候,可以把要删除的那个点转到根结点,删除根结点,合并两个子树,然后这样就T了,换了个姿势就过了。。C++扩栈不解释。。#pragma comment(linker, "/STACK:102400000,1024000原创 2013-09-03 00:38:19 · 2760 阅读 · 0 评论 -
hdu 4699 Editor(Splay)
题意:对一个数列进行操作,光标位置后面插入一个权值为x的数,删除光标前的那个数,光标左移一位,光标右移一位,求到k位置的最大的前缀和。Splay在比赛的时候写得太Navie,T了整场。左移和右移的操作就不说了,删除点的操作是,直接把第pos个点旋转成根结点,然后把这个点删除,将左右两个儿子(如果有)合并成一棵新的树。插入的时候,将pos个点旋转成根结点,然后在根和根的右儿子之间插入这个点。原创 2013-09-02 01:22:33 · 2923 阅读 · 0 评论 -
hdu 4455 Substrings
题意:给定一个整数串,有Q组询问,问这个串中长度为W的子串中不同的数字之和为多少。可以DP做,也可以用树状数组做。假设当前的数是a[i],如果它前面也出现了a[i]',那么a[i]'不计,计入的是a[i],如果a[i]后面出现了a[i]'',那么a[i]不计,计入的是a[i]''。定义a[i]前面的空位是bef,后面的空格是aft,则W在1-min(bef,aft)这段区间内的,a[i]的是要原创 2013-08-13 08:27:42 · 3171 阅读 · 0 评论 -
Splay Tree(伸展树)[NOI2005]维修数列
伸展树 概述:不同于线段树的以空间换取时间,用多余的节点去存储多余的信息,来达到降低时间复杂度。SplayTree基于一种更简单的思想,为了使整个查找时间更小,被查频率高的那些条目就应当经常处于靠近树根的位置。于是想到设计一个简单方法,在每次查找之后对树进行重构,把被查找的条目搬移到离树根近一些的地方。SplayTree应运而生。SplayTree是一种自调整形式的二叉查找树,它原创 2013-08-13 09:25:51 · 3274 阅读 · 0 评论 -
hdu 4605 Magic Ball Game
题意:有T组测试数据,N表示这棵树有N个点,下一行的N个数,表示每个点的权值W,M表示边的关系,接下来的M行,每行有三个数字,u,b,b,表示点a和点b分别是点u的左儿子和右儿子。Q表示查询数,接下来的Q行,每行两个数字,v和X。一个权值为X球从根节点开始下落,每落到一个节点的时候,1.如果X=W[i],或者没有儿子节点了,球停止下落。2.如果XW[i],球有1/8的概率落到左儿子,有7/8的原创 2013-08-13 00:45:42 · 1504 阅读 · 0 评论 -
hdu 4614 Vases and Flowers
题意:给定一个区间[0,N-1],初始时每个位置上的数字都是0,有两种操作,1.在位置A开始寻找F(如果没有这么多,则有多少个就找多少个)个数值为0的位置,把位置上的数修改为1,并返回第一个和最后一个修改的位置。2.查询区间[A,B]内1的个数,并把区间[A,B]每个位置上的数修改为0。 对于操作2,直接应用区间更新的懒操作就可以了,而对于操作1,我们可以查询上区间[0,A-1]原创 2013-08-13 01:00:11 · 1983 阅读 · 0 评论 -
hdu 4630 No Pain No Game
题意:给出一个N和1到N的某个排列,询问Q次,每次询问[L,R]区间内任意挑两个数,最大公约数的最大值是多少。 离线处理每个查询,从左到右依次处理每个点,对于处理到的区间端点R,依次枚举R的因子,如果这个因子出现过,那么就将这个因子出现过的上一个位置,赋值为这个因子(当然,也要取较大值),同时,更新这个因子出现的位置为端点R。那么问题就转化成求终点在R的区间中最大值是多少了。#原创 2013-08-13 01:12:22 · 1678 阅读 · 0 评论 -
fzu 2105 Digits Count(成段更新)
题意:给你N个数,有四种操作。(1)"AND opn L R",表示对区间[L,R]内的数全部与opn进行且(&)操作。(2)"OR opn L R",表示对区间[L,R]内的数全部与opn进行或(|)操作。(3)"XOR opn L R",表示对区间[L,R]内的数全部与opn进行异或(^)操作。(4)"SUM opn L R",求出区间[L,R]的数的和。注意到给出的N个数的和opn的范围原创 2013-04-30 13:56:10 · 2464 阅读 · 3 评论 -
hdu 4453 Looploop(Splay或者三个双端队列)
题意:有N个数字围成一个圈,有M个操作,操作类型有六种:(1)“add x",从当前指针位置开始的顺时针K2个数加上x。(2)"reverse",翻转,从当前指针指针位置开始的顺时针的K2个数。(3)"insert x",在当前指针位置的顺时候方向插入一个数x。(4)”delete“,删除当前指针所指的数。(5)"move x”,如果x=1,指针逆时针旋转,如果x=2,顺时针旋转。(6)“quer原创 2013-09-05 01:33:56 · 3301 阅读 · 0 评论 -
hdu 4622 Reincarnation(字符串Hash+线段树)
题意:给出一个字符串,最长2000,Q个询问,每次询问[L,R]区间内有多少个不同的字串。可以用后缀自动机做,也可以先把字符串Hash成一个个整数,转化成求一个区间内不同的整数个数。用Trie树Hash超内存了。。#include #include #include #include using namespace std;typedef unsigned int uint;原创 2013-09-01 19:27:17 · 3652 阅读 · 0 评论