随笔分类 - 数据结构
摘要:Delivery题目还是自己看吧 - -! 看似图论,实际上是一个考察思维以及数据结构的题。 我们对于先前和向后的边分别进行统计。 对询问离线。 小边按照左端点从大到小排序。 1.对于向后的边,询问按照出发点从大到小排序。比如询问有 2 3 3 4 我们先对3 4进行计算。把向后的小边(3,5) ,(3,4) 用线段树维护,分别在线段树的位置4,5中插入用该边时可以优化的值。询问3 4时,我们发现出发点3以及后面的小边都加进了线段树中,直接询问线段树区间 [3,4]的最小值进行计算即可。注意一下可能加入了边之后比不加边更差的情况。 然后再对2 3进行计算,这次把小边(2,...
阅读全文
摘要:昨天热身赛的简单版:LCIS。昨天那题用树链剖分,不知道哪里写错了,所以水了水这题看看合并、更新方式是否正确,发现没错啊。看来应该是在树链剖分求lca时写错了。。。题目:给出n个数,有两种操作: 1.单点修改 2.区间询问:最长连续上升子序列分析:只需要维护五个域就行:lix,rdx,mix,lval,rval。记录当前区间 最左的值lval , 最右的值rval,必须从左起连续上升序列的长度lix,必须右起下降的长度rdx。合并时注意下即可。#include #include #include #include using namespace std;char IN;bool NEG;i..
阅读全文
摘要:今天再做一天树的题目,明天要开始专攻图论了。做图论十几天之后再把字符串搞搞,区域赛前再把计几看看。3083: 遥远的国度Time Limit:10 SecMemory Limit:128 MBSubmit:400Solved:89[Submit][Status]Description描述zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度。当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了zcwwzdjn的去路,他需要zcwwzdjn完成任务后才能进入遥远的国度继续追杀。问题是这样的:遥远的国度有n个城市,这些城市之间由一些路连接且这些城市构成了一颗树。这个
阅读全文
摘要:支持:1.添加边 x,y2.删边 x,y3.对于路径x,y上的所有节点的值加上w4.询问路径x,y上的所有节点的最大权值分析:裸的lct...rev忘了清零死循环了两小时。。。1:就是link操作2:就是cut操作3:维护多一个mx域,mx[x]表示在splay中以节点x为根的子树的最大点权,每次修改时,把x置为splay的根,打通y到x的路径,把y splay到根,那么,直接对y节点的lazy标记加上为w即可。4:同3操作,把x置为splay的根,打通y到x的路径,把y splay到根,那么,y子树所对应的节点就是路径x到y的所有节点。另外,题目貌似描述有点问题,不光是询问非法输出-1,是指
阅读全文
摘要:GSS7Can you answer these queries IV题目:给出一个数列,原数列和值不超过1e18,有两种操作:0 x y:修改区间[x,y]所有数开方后向下调整至最近的整数1 x y:询问区间[x,y]的和分析: 昨天初看时没什么想法,于是留了个坑。终于在今天补上了。 既然给出了1e18这个条件,那么有什么用呢?于是想到了今年多校一题线段树区间操作时,根据一些性质能直接下沉到每个节点,这里可以吗?考虑1e18开方6次就下降到1了,因此每个节点最多被修改6次。于是我们每个节点(区间)记录一个该区间的最大值,每次修改时,先判断该区间是否最大的数已经等于1,等于的话,就不用继续..
阅读全文
摘要:Query on a tree again!给出一棵树,树节点的颜色初始时为白色,有两种操作:0.把节点x的颜色置反(黑变白,白变黑)。1.询问节点1到节点x的路径上第一个黑色节点的编号。分析:先树链剖分,线段树节点维护深度最浅的节点编号。注意到,如果以节点1为树根时,显然每条重链在一个区间,并且区间的左端会出现在深度浅的地方。所以每次查找时发现左区间有的话,直接更新答案。99291512013-08-28 10:45:55Query on a tree again!100 editrun12.5427MC++4.3.2#include #include #include #include #
阅读全文
摘要:GSS7Can you answerthese queries VII给出一棵树,树的节点有权值,有两种操作:1.询问节点x,y的路径上最大子段和,可以为空2.把节点x,y的路径上所有节点的权值置为c分析:修改树路径的信息,可以考虑一下树链剖分、动态树。这题可以用树链剖分的方式来做,不会的可以看看这篇树链剖分---模板。其实树链剖分不难理解,一小时左右就能学会了。对于在一段区间的最大子段和问题,可以参考GSS1 spoj 1043 Can you answer these queries I 最大子段和由于x,y可能不在同一个重链上,所以在询问时需要分两段进行统计,合并的时候跟GSS1基本一样
阅读全文
摘要:GSS6Can you answer these queries VI给出一个数列,有以下四种操作:I x y: 在位置x插入y。D x : 删除位置x上的元素。R x y: 把位置x用y取替。Q x y: 输出区间[x,y]的最大字段和。分析:其实这题是BZOJ 1500 [NOI2005]维修数列这题的简化版。使用splay来做非常简单。我的做法增加一个虚拟节点在数列的最开始处,增加两个虚拟节点在最后,这是为了方便在数列最后插入的操作。splay网上的资料比较多,其实splay比sbt、avl都简单。这里有我的一份总结,并且有一些资料:splay总结囧,我写的splay太慢了,最后上网搜了
阅读全文
摘要:gss5Can you answer these queries V给出数列a1...an,询问时给出:Query(x1,y1,x2,y2) = Max { A[i]+A[i+1]+...+A[j] ; x1 =x2: 考虑x1与x2的关系: 如果x1==x2,最大值可能出现在区间[x1,y1]的最大子段和,[x1,y1]的右区间连续最大和加上[y1+1,y2]的左区间连续最大和。 否则,考虑三个区间[x1,x2-1],[x2,y1],[y1+1,y2],这时考虑方式跟上面差不多,就不写出来了,具体可以看代码。#include #include #include #incl...
阅读全文
摘要:gss2调了一下午,至今还在wa。。。我的做法是:对于询问按右区间排序,利用splay记录最右的位置。对于重复出现的,在splay中删掉之前出现的位置所在的节点,然后在splay中插入新的节点。对于没有出现过的,直接插入。询问时直接统计区间的最大子段和。gss2没能调出bug,所以看了一下以下的gss3,发现跟gss1基本一样。直接上代码以上的做法是错的,对于这种数据就过不了。姿势不对,囧44 -2 3 -211 4GSSCan you answer these queries III题目:给出一个数列,有两种操作:0.把第x项变为y1.询问区间[l,r]的最大子段和分析:线段树简单区间操作。
阅读全文
摘要:今天下午不知道要做什么,那就把gss系列的线段树刷一下吧。Can you answer these queries I题目:给出一个数列,询问区间[l,r]的最大子段和分析: 线段树简单区间操作。 线段树中记录lx,rx,mx,分别表示:最大前驱连续和,最大后继连续和,区间最大子段和。 在合并时时只需要合并两个区间即可,具体可以看代码的Union。 从队友jingo那里学到了这种合并的写法,发现比网上大部分代码简单很多。#include #include #include #include #include #include #include #include #include #includ
阅读全文
摘要:208E - Blood Cousins题目:给出一棵树,问与节点v的第k个祖先相同的节点数有多少个。分析: 寻找节点v的第k个祖先,这不就是qtree2简化版吗,但是怎么统计该祖先拥有多少个深度为k的儿子? 我们可以对于深度为d的所有节点放到一个数组中,这时需要知道的是深度为d的数组中某个连续区间都属于该子树的长度。 某棵子树的信息?这时可以考虑一下dfs序列。。。 dfs序列把整棵子树放在同一个区间,不懂dfs序的可以做做这两题: BZOJ 1103 [POI2007]大都市meg,BZOJ 1782 [Usaco2010 Feb]slowdown 慢慢游。 于是,我们df...
阅读全文
摘要:QTREE2经典的倍增思想题目:给出一棵树,求:1.两点之间距离。2.从节点x到节点y最短路径上第k个节点的编号。分析: 第一问的话,随便以一个节点为根,求得其他节点到根的距离,然后对于每个询问(x,y),想求得lca(x,y),直接用dis[x]+dis[y]-2*dis[ lca(x,y) ]即可。 第二问的话,可以用倍增的方式求。我们通过求得节点x,y,lca(x,y)的深度,判断第k个节点落在哪个链上,该链是指是从x到根或者从y到根。最后倍增可以轻松求出一个链上第k个父亲是谁了。 我实现的时候,lca以及求某个节点的第k个祖先都是用倍增的思想实现。#include #incl...
阅读全文
摘要:1146: [CTSC2008]网络管理NetworkTime Limit:50 SecMemory Limit:162 MBSubmit:870Solved:299[Submit][Status]DescriptionM公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门。为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络。该网络的结构由N个路由器和N-1条高速光缆组成。每个部门都有一个专属的路由器,部门局域网内的所有机器都联向这个路由器,然后再通过这个通信子网与其他部门进行通信联络。该网络结构保证网络中的任意两个路由器之间都存在一条直接或间接路
阅读全文
摘要:1036: [ZJOI2008]树的统计CountTime Limit:10 SecMemory Limit:162 MBSubmit:3427Solved:1429[Submit][Status]Description一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身Input输入的第一行为一个
阅读全文
摘要:《树链剖分及其应用》一文讲得非常清楚,我一早上就把他学会了并且A了这题的入门题。spojQTREE题目:给出一棵树,有两种操作:1.修改一条边的边权。2.询问节点a到b的最大边权。直接粘代码。更成熟的代码可以看下一篇BZOJ 1036: [ZJOI2008]树的统计Count#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long ll;typedef unsig
阅读全文
摘要:题目:点这跟这题BZOJ2002: [Hnoi2010]Bounce弹飞绵羊 一模一样分析: 分块数组入门题。 具体的可以学习这篇博文以及做国家集训队2008-苏煜《对块状链表的一点研究》这篇论文上面的几道题目。#include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long ll;typedef unsigned long long ull;#define debug put...
阅读全文
摘要:对于动态凸包添加的问题的一般做法: 如上图。我们知道,如果能够有一种数据结构可以维护一下凸包上的顶点与原点的角度,对于插入一个点now的时候,我们就可以二分出点的位置,然后找到比他角度小的上一个顶点pre以及比他角度大的下一个顶点next,通过判断now跟next,pre的叉积正负来判断点now是否在凸包内。 对于需要插入不在凸包中的点时,我们找出了pre,next之后,需要分别通过维护上凸包以及下凸包,把多余的点从平衡树中删掉。例如上图中,由于next_next可以被now“看见”,所以next需要被删掉,删掉next之后继续判断next_next是否需要删掉,直到不能够删掉为止。对于下..
阅读全文
摘要:题目在这: 给出三种操作: 1.增加点(x,y) 2.删除点(x,y) 3.询问在点(x,y)右上方的点,如果有相同,输出最左边的,如果还有相同,输出最低的那个点 分析: 线段树套平衡树。 我们先离散化输入的x坐标,然后以每个坐标建立一棵平衡树来维护,这里可以直接用set或者map来维护就行了。 然后我们现在需要在x的右方找到最左最下大于(x,y)的点。 建立一棵线段树,维护的是区间的纵坐标的最值,而线段树的端点为离散后x的值。 1.我们每次插入的时候,直接在相应的平衡树中插入,然后更新一下线段树的区间最值。 2.删除时,直接删掉,更新一下最值。 3.询问时,对于整...
阅读全文