ACM_数据结构
文章平均质量分 80
Nero___
这个作者很懒,什么都没留下…
展开
-
BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊 (LCT)
两个操作1,查询节点深度原创 2014-04-21 19:15:35 · 1588 阅读 · 0 评论 -
LA 3294 The Ultimate Bamboo Eater (线段树套Treap)
题意: 有一只熊猫和n个岛,岛分布在二维平面上,坐标为Xi,Yi,岛上有竹子,岛i上的竹子数量为Li,美味值为Wi,每个岛的Wi值唯一。熊猫每天要吃掉一个岛的竹子,并且当天所在的岛上的竹子要比之前所在的岛上的竹子都要美味。熊猫沿着曼哈顿距离在岛之间移动。如果熊猫从岛A移动到岛B走的距离dis>岛B上的竹子的数量,那么熊猫会伤心而死(不吃也是要挂的)。熊猫的初始位置由你选择,问熊猫最多能活几天。存在原创 2013-10-28 21:51:48 · 966 阅读 · 0 评论 -
HDU 4453 Looploop (双向链表)
题意: 一个环状的序列,要求支持:1,从光标开始k2个数增加x2,从光标开始k1个数翻转3,光标前插入一个数4,删除光标位置的数5,光标左/右移一位6,询问光标位置的数其中k1与k2为定值,且2解法: 虽然可以用各种平衡树搞定这题,但是题目给了那么多限制,不用简直浪费。事实上用三个双向链表维护即可,第一个放元素1~k1,第二个放k1+1~k2,第三个放k2+1~原创 2013-10-14 19:20:31 · 785 阅读 · 0 评论 -
HDU 3726 Graph and Queries (Treap)
题意: 给出一幅无向图,点有权,要求支持:1,删边2,询问与点u相连的第k大点的权值 (注意k可能不合法)3,修改一个点权输出操作2中的权值总和除以操作2的数量。解法: 离线,用Treap维护第k大,把所有操作倒过来做,那么删边就变成合并连通块,注意修改点权的操作在离线前需要先处理。/* Created Time: 2013年09月20日 星期五 06时16分58秒 *原创 2013-09-20 07:48:18 · 1197 阅读 · 0 评论 -
CF-46D Parking lot
/* CF46-D *//*题意:在一条直线上停车,要求新停入的车有最小前后距离限制(头尾不算),支持停车和开走。思路:在直线头尾加入一段虚拟的长度,使头尾部不用特殊处理,查询时加入前后距离限制,增删时只计原长。做完这题,对线段树的理解又清晰了一些。目前遇到的基本都是点树,每个节点维护的是点的数目。所以在询问长度时,头尾需要各缩减1,因为和其他区间相连处会有一个长度为1的开区原创 2013-07-07 20:41:49 · 838 阅读 · 0 评论 -
HDU2871 Memory Control
/* hdu 2871 *//*题意:对一段连续内存的重置,申请,释放,询问思路:New和Get是为区间合并,Free的查询时单点更新到底,Free的释放是成段更新 特别注意Get的合并,这里卡了半天才发现。总结:其实就是三种线段树的综合,能定下心认真分析是不难的,多思考,戒急燥! AC!!!!一个心情大好,用手机热点写博客,算了不管了,流量伤就伤吧。。*/#inc原创 2013-07-07 20:45:46 · 772 阅读 · 0 评论 -
POJ2892 Tunnel Warfare
/* poj2892 *//*查询包含当前点在内的最长连续子段思路:在左边找最大破坏点,右边找最小破坏点,相减后减1即可最开始写的递归线段树,挫了- -,而且还完全想不通,赶脚不会爱了。于是用zkw线段树自底向顶搞,AC了。传说有区间合并做法,费时费力,不写了留待有缘人哈哈。。*/#include #include #include using namespac原创 2013-07-07 20:54:12 · 720 阅读 · 0 评论 -
HDU 3265 Posters
题意:给n个中间部分有缺失的矩形(缺失部分也为矩形),求矩形面积并。解法:就是最基础的扫面线矩形面积并求法,只要把缺失部分的矩形处理成6条线段就可以了。#include #include #include #include #include using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|原创 2013-07-30 10:35:24 · 828 阅读 · 0 评论 -
POJ 1182 食物链
题意: 有三种动物A吃B,B吃C,C吃A。给n句话描述当前的n只动物,问里面有多少谎言。解法: 基础种类并查集。并查集的题目其中有一部分解法是这样的,给一些信息,然后根据信息的情况维护在根节点或者是本身节点,然后查询的时候询问整条由自己和根两个点构成的缩小链即可。#include #include #include using namespace std;#define RE原创 2013-08-05 21:29:58 · 830 阅读 · 4 评论 -
LA 4082 Traffic Jam (分块)
题意: 有一个两行C列的城市网格。每个城市用(r,c)表示,即第r行的第c列。一共有3*C-2条道路,用两端的城市坐标(r1,c1)-(r2,c2)表示。要求支持3种操作:打开某条边,关闭某条边,检查某两个点是否连通(即:只通过打开的边互相可达)。初始时所有边关闭。解法: 如果没有关闭边的操作,那么只需要并查集即可,但是因为需要删边,使得并查集无法使用,但是路径压缩的思想,在这题仍然还是可用的原创 2013-10-30 11:27:23 · 867 阅读 · 0 评论 -
POJ 3241 Object Clustering (曼哈顿距离最小生成树)
题意: 询问平面上的点的曼哈顿距离最小生成树第n-k小边的长度,点数为10000。解法:对于曼哈顿距离最小生成树,朴素的解法需要建n^2条边进行kruskal,显然要TLE。2010莫涛论文中提到了一个可以将边优化到8*n条的方法,其实就是利用了一个性质:以任意一个点为端点将平面分成均匀45度角的8个块,那么在生成树的最优解中,每个块与这个点至多有1条边,即一个点最多向8个方向最近的点各连接一原创 2013-11-04 17:35:49 · 1026 阅读 · 0 评论 -
HDU 4126 Genghis Khan the Conqueror (生成树,并查集)
题意: 给出一幅3000个点的图,有10000次操作: 求将某条边的权值变大后的最小生成树,最后输出10000次操作得到的最小生成树权值的平均值。解法: 首先,对于一棵最小生成树,如果我们将它的某条边增大,那么存在一棵新的最小生成树与原生成树只有一条边是不同的,并且这条边与那条增大边在同一个环里,并且是与这条增大边同环的原最小非树边。证明如下: 由最小生成树的定义,最小生成树是一棵具有原创 2013-11-09 20:55:39 · 942 阅读 · 0 评论 -
BZOJ 1503 [NOI2004]郁闷的出纳员 (splay)
比treap慢180ms,合格。原创 2014-04-19 23:31:34 · 1142 阅读 · 2 评论 -
HDU 1166 敌兵布阵 (splay)
splay跑得比树状数组快,掌声经久不息。。原创 2014-04-19 20:33:26 · 1177 阅读 · 0 评论 -
Codeforces398D Instant Messanger
题目链接是的真相就是耍流氓暴力!!!离线处理处理出每个点的点度deg[i](无重边)维护一个数组from_small[i],表示与i相邻的点中点度比deg[i]小的点的在线数量然后对于每个询问,暴力数出i的相邻点中点度比deg[i]大的点在线的数量,然后加上from_small[i],就是答案复杂度是O(操作数*sqrt(点度之和))证明:每次询问的复杂度为原创 2014-03-18 23:40:43 · 1473 阅读 · 0 评论 -
HDU1754 I Hate It (线段树java版)
会写java了咩哈哈哈哈import java.util.Scanner;public class Main { static int t[] = new int[201000<<2]; static int a[] = new int[201000]; static int n,m; static int max(int a,int b) { return a>b ?原创 2014-03-03 11:57:43 · 1244 阅读 · 6 评论 -
CF280D k-Maximum Subsequence Sum (线段树)
10W个数10W个操作,操作有两种:修改单点的值;从区间[L,R]中选出最多k段不相交区间,使和最大。k最大为20用dp思路时间复杂度O(mk^2lgn) == TLE。so,会有其他方法。如果用费用流解决k段区间最大和,那么找增广路的过程是怎么样的呢。step 1,找到一条费用最大的增广路Lstep 2,若找不到增广路,或L已经是负费用了,goto step 4,否则原创 2014-02-09 22:29:09 · 1599 阅读 · 0 评论 -
POJ 2763 Housewife Wind (LCA+树状数组)
10W节点的树,10W次操作:1,:询问两点距离;2:修改一条边权。解法:如果没有修改,那么dis(a,b) = dep(a) + dep(b) - dep(lca(a,b)) * 2,可以用rmqLCA来O(1)做到。但是有修改的话,基本就可以无脑考虑log级别的算法像树状数组线段树什么的了。记一个dfs时间戳:进入节点记一次,退出节点记一次,那么可以得到边的两个时间序in[原创 2014-01-28 20:35:25 · 1657 阅读 · 0 评论 -
HYSBZ 1503 郁闷的出纳员 (Treap)
提交了50次后发现BZOJ不能用cin,cout的事情,我就是个大傻逼Treap实现插入,删除,第k大,事实证明太久没敲是会手生的。#include #include #include using namespace std;struct Node { int v,sz,r; Node *ch[2];};Node *nill,*root;原创 2014-01-11 00:56:11 · 1185 阅读 · 0 评论 -
UVA12538 Version Controlled IDE (可持久化Treap)
维护一个文本,支持:p位置插入串,p位置删除长度c的串,查询历史版本某个位置开始的串#include #include #include using namespace std;typedef long long lld;const int N = 50100;char s[1010100];int on;struct Node { Node *ch[2]; char c; i原创 2013-12-01 19:57:35 · 1211 阅读 · 2 评论 -
POJ 2912 Rochambeau
题意: n个人玩石头剪刀布,每个人每次出的手势都是一样的,除了裁判(裁判可以任意出)。现在给出他们之间的胜负关系,问哪一个是裁判,并输出最早是在哪一行确定的。解法: 枚举裁判,然后对裁判外的其他人作类似于食物链的并查集操作,如果只存在一次一个人删除后其余人部出错的情况,那么那个人就是裁判。最早确定是裁判的那行一定是最迟出错的那一行。笔者表示想不出证明。#include #includ原创 2013-08-06 10:10:03 · 841 阅读 · 0 评论 -
UVA 12436 Rip Van Winkle's Code
题意: 写一段代码代替以下的古老代码片段。long long data[250001];void A( int st, int nd ) { for( int i = st; i <= nd; i++ ) data[i] = data[i] + (i - st + 1);}void B( int st, int nd ) { for( int i = st; i <=原创 2013-08-06 22:33:33 · 1284 阅读 · 0 评论 -
POJ 2104 K-th Number
题意: 询问区间第K小数解法: 可持久化线段树。每次更新需logn的空间,所以总空间为nlogn。其实就是把每次的更新操作放在新的空间里,保留下之前的版本。详细的教程见这里数据范围较大需离散化。一开始有尝试类似于trie的New_node写法,用到再申请。但是比较烦,增加代码量。后来发现只需要简单的tot++就可以了。ORZ#include #include #in原创 2013-08-10 03:40:39 · 814 阅读 · 0 评论 -
POJ 3580 SuperMemo
Splay重口题题意: 给出一个序列,要求支持以下操作: Add: 区间[l,r]增加x。Reverse: 区间[l,r]翻转。Revolve: 将[l,r]区间的最右一个数移到区间左边x次(这里的次数可能暴大,也可能为负,本题的坑)。Insert: 在位置pos后面插入一个数x。Delete: 删除位置pos的数。Min: 询问区间[l,r]的最小值。解法:原创 2013-08-23 20:31:04 · 833 阅读 · 0 评论 -
UVALive 5694 Adding New Machine
线段树扫描线。题意: 在一个n*m平面内,有一些不重叠的矩形(可能退化成点或线),现在让你把一根给定长度的线竖直或水平地放进平面,要求不与任何原来存在的矩形重合,问有多少种放法。解法: 在一根长度为a的线段上放置一根长度为b的线段共有a-b+1种放法。那么将给定的矩形拆成两根线段,用扫描线横着扫一次,竖着扫一次,就可以得到答案。有一点区间合并的味道。需要离散化。本人在拆矩形时因为拆的是原创 2013-08-24 17:44:31 · 948 阅读 · 0 评论 -
UVA 1462 Fuzzy Google Suggest
题意: 模拟搜索引擎的模糊搜索功能。给出n个字符串作为数据库,n解法: 首先知道一个事实,修改询问串的目的是让修改后的询问串能够与某个串的前缀相同,因此若数据库中不存在某种前缀的字符串,那么倾向这个前缀变化的字符串也是不必要的,因此,将询问串直接插入字典树中匹配,若在某个节点失败,就使用修改操作使匹配继续进行。先将作为数据库的n个串插入一棵字典树。然后对于一个询问串,将它放进字典树内匹原创 2013-08-29 07:15:00 · 1151 阅读 · 6 评论 -
POJ 3468 A Simple Problem with Integers (树状数组写法)
题意: 给出一段序列,支持区间增减,区间查询。解法: 数据结构成端更新的入门题了,这次又拿来试了试树状数组。树状数组成端更新的教程常数小果然飞起啊,splay 3907MS,线段树 1875MS,树状数组 969MS- -。/* **********************************************Author : NeroCreated T原创 2013-08-31 21:10:11 · 740 阅读 · 0 评论 -
CF-260E Dividing Kingdom (树套树)
题意: 在一个二维平面上有10W个点,现在给你9个数,希望你用两根横线,两根竖线,将平面划分成9块,并且9个块的值对应那9个数。9个数可以任意排列。解法: 我们枚举每一个排列,检验这个排列下对应的划分是否可行。由于数据范围,需要使用树套树的方法,这里使用树状数组套Treap来统计矩阵内的点数。一般二叉树可以解决一维上的统计问题,但是当维度增加到二维时,一维的树显然不能满足需求,这时就需要用原创 2013-09-05 22:34:19 · 935 阅读 · 0 评论 -
UESTC1425 Another LCIS
/* uestc1425 *//*题意:区间询问最长连续上升子段的长度,支持区间增减差不多快切成模板题了,依旧是注意询问时的区间合并。我时间几乎被卡,但是貌似大家都是线段树区间合并的做法,为什么时间差这么大呢。。略花了点时间探究了一下,结论:传参会对时间有略微影响,主要的原因是,define的max,min,比函数的写法慢很多。不知道是不是OJ的原因*/#inc原创 2013-07-08 00:09:54 · 691 阅读 · 0 评论 -
HDU 4601 Letter Tree
人生第一次300行代码,呕心沥血啊。。。纪念下#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include using namespace std;#define clr(a,b) memset(a,b,sizeof(a))#define DEBUG printf("nani!\n原创 2013-07-28 19:49:51 · 1050 阅读 · 5 评论 -
HDU 4630 No Pain No Game
题意: 给一个长度n的1~n的排列,要求询问一段区间内任意两个数的最大公约数的最大值解法: 对于以数x为最大公约数,必要条件是这两个数都是x的倍数,那么我们可以将所有为x的倍数的数的位置都找出来,并排序,那么只有当相邻两个位置都被同一段区间包含的时候,才会取到answer:x,所以可以将相邻位置看成一条权值为x的线段,那些不相邻位置组成的线段明显包含前面的线段,可以省略。然后对所有的询问离线操原创 2013-07-31 20:52:49 · 871 阅读 · 0 评论 -
SPOJ 3273 Order statistic set
Treap 模板题题意: 要求实现一种数据结构,支持:Insert: 插入原来不存在的元素。Remove: 删除原来存在的元素。Kth: 询问第K大的元素,询问不合法(即k大于元素数量),输出“invalid”。Count:询问小于x的元素的数量。解法: Treap的基本操作全齐了,红果果的裸题。#include #include #include #includ原创 2013-08-16 15:11:42 · 928 阅读 · 0 评论 -
POJ 1417 True Liars
题意:有p个好人,q个坏人,他们说了n句话,格式为A说B是好/坏人坏人全说谎话,好人全说真话,问你能不能知道他们中全部的好人是谁。解法:划分好人为一类,坏人为一类,简单分析可得,同类会对同类说yes,对非同类说no。所以通过并查集就可以知道每个集合内的划分关系。这题的难点在于,题目给出的关系可能描述不同的集合,那么你就需要把这些集合拼凑在一起,看能不能仅得到一种构成p个人的组合。因原创 2013-08-05 11:28:05 · 838 阅读 · 0 评论 -
HDU3397 Sequence operation 区间修改,区间异或,区间合并,线段树经典题
区间修改,区间异或,区间合并,线段树经典题#include #include #include using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define ls (rt<<1)#define rs (rt<<1|1)const int M = 100001;int n原创 2013-07-02 19:00:16 · 1425 阅读 · 2 评论 -
HDU 4677 Query on Graph
区间划分。本菜在这一题学到蛮多新东西&&新思想,下面详细记录一下思考过程。题意: 给出一幅图,每个顶点有(1~n),有nq个询问,问区间l~r的顶点集,在把l~r之外的所有点和边删掉之后,有几个连通块。解法: 分x个步骤慢慢来~1.区间划分: 对于l~r的每一个区间询问,最暴力的方法是从l到r一个一个的计算过去,复杂度为O(q*n),对于询问数q=3w,区间长度n=3w的题,必须超原创 2013-08-18 15:27:20 · 1391 阅读 · 0 评论 -
POJ 3468 A Simple Problem with Integers
题意: 给定一个序列,要求支持区间增减,区间询问。解法: 典型的各种树的入门练手题。第一次写Splay,敲了个指针版的,在空节点的问题上蛋疼了许久。因为Splay对区间的操作方式是处理成开区间,所以需要在头尾各增加一个虚拟节点,否则可能会产生nill指针的各种死循环。500MS时限,Splay跑了3907MS,内存7784K,代码长度2681B。。笔者特意写了一款线段树对比,1原创 2013-08-22 10:06:09 · 614 阅读 · 0 评论 -
HDU 4699 Editor
题意: 有一个光标,支持左移,右移,插入数字,删除数字,询问1~k最大前缀和。解法: 用一个数据结构维护序列,答案可以DP出来。具体见代码。手贱写了个Splay。其实链表就可以的吧。本人第二弹Splay,支持旋转,插入,删除,查询第k位置。距离能当模板用貌似还有一段距离。#pragma comment(linker, "/STACK:1024000000,1024000000")原创 2013-08-22 18:19:44 · 737 阅读 · 0 评论 -
UVA 442 Matrix Chain Multiplication
题意: 给出一些矩阵,和一些矩阵相乘的带括号表达式,问表达式是否符合矩阵乘法,以及它的计算次数。解法: 用模拟栈水过去了遇到‘(’就把当前矩阵入栈,遇到')'就出栈并乘以现在的矩阵,遇到矩阵就乘,跑完了打印答案。笔者吐槽:计算顺序都给出来了,表示完全没有明白这一题的DP性质体现在哪里,为何它又在DP分类里- -!/* **********************************原创 2013-08-28 19:36:16 · 1033 阅读 · 0 评论 -
POJ 3580 Super Memo (Treap版)
学自牛人博客题意: 对一个序列进行区间增减,区间翻转,区间移动,插入,删除,求区间最小值。解法: 正常情况下这种折磨序列的题一向是splay的菜,而这次发现,Treap原来也有这种战斗力,而且在编程复杂度上,个人感觉比splay简单一点。其实就是原来的Treap加上了砍树与合并两个操作,把每次的操作区间‘砍’出来,一通乱搞完接回去。而splay是把区间旋转出来操作。时间复杂度方面,依靠原创 2013-09-05 21:40:30 · 1745 阅读 · 0 评论 -
lydsy 1500 [NOI2005]维修数列 (Treap版)
题意: 数列兄出来受死吧。。这次要求支持插入,删除,区间修改,区间翻转,区间求和,求和最大的子列的和。解法: 没什么能说的了,一些细节写在了注释里。/* **********************************************Author : NeroCreated Time: 2013/9/5 16:51:21Problem id : lydsy 1原创 2013-09-05 21:51:04 · 1320 阅读 · 0 评论