
ACM-数据结构
文章平均质量分 82
「已注销」
这个作者很懒,什么都没留下…
展开
-
HDU 4107 Gangster
http://acm.hdu.edu.cn/showproblem.php?pid=4107题意:给定一个数组,初始时数组的值全为0 , 每次给数组中的一段区间增加一个值,若此区间中原先的值就已经超过了P,则该数增加2*val,否则增加val。求若干次增值之后数组最终的元素的值。算法:线段树 + lazy优化代码:/*HDU 4107 GangsterTips : se原创 2011-10-31 21:11:19 · 647 阅读 · 0 评论 -
HDU_1540 Tunnel Warfare 线段树
http://acm.hdu.edu.cn/showproblem.php?pid=1540题意 :有N座相互连接的桥,每座桥都只和其前面和后面的两座桥连接,现在有三种操作:D i :表示将第i座桥破坏;Q i:表示询问与第i座桥相互连接的桥的数目;R : 表示修好最近一座被毁坏的桥 ;思路:线段树。首先对于D操作和R操作,很简单,我们只需要用线段树的单点更新就可以原创 2012-07-10 17:39:14 · 521 阅读 · 0 评论 -
HDU_2871 Memory Control 线段树
http://acm.hdu.edu.cn/showproblem.php?pid=2871题意:内存分配问题,给你一块有N个单元的空白内存和一些内存的操作命令,包括有:(1)、Reset :清空所有的内存空间;(2)、New x :申请一块连续长度为x的内存空间,如果不存在这样的分配, 则输出-1 , 如果存在,则输出这块内存的开始地址;(3)、Free x :如果第x个内存原创 2012-07-10 21:11:33 · 435 阅读 · 0 评论 -
POJ 2886 Who Gets the Most Candies? 线段树
http://poj.org/problem?id=2886题意:N个人玩一个游戏,每个人都有一个weight ,游戏从第K个人开始,第一轮标号为K的人退出游戏,下一个退出的人的编号由上一轮退出的人的weight决定,如果上一轮退出的人的weight为正,则下一个退出的人是上一轮退出的人的左手边的第weight个人,如果是负数则是右手边的第weight个人,每个人退出时候都有一个得原创 2012-06-30 22:32:34 · 814 阅读 · 0 评论 -
HDU_1542 Atlantis 线段树
http://acm.hdu.edu.cn/showproblem.php?pid=1542题意:求N个矩形的面积并。 思路:线段树+扫描线+离散化。首先我们可以将所有的矩形开成有四条边,然后在水平和竖直方向上将区域切割 ,形成所谓的“超元线段”,然后就可以用线段树进行求解了。代码:#include#include#include#include#includeu原创 2012-07-11 13:36:56 · 429 阅读 · 0 评论 -
HDU_1828 Picture 线段树
http://acm.hdu.edu.cn/showproblem.php?pid=1828题意 :给你N个矩形,求其轮廓线的周长。思路:线段树。这个题目其实和求矩形并面积是类似的,但是两者有一个地方不同。求矩形的面积的时候, 我们将每个矩形投影到X轴上,用扫描线的方法求出每个超元线段区间内,X轴方向上的有效长度,然后 ( p[i+1].h - p[i].h ) * sum[1]原创 2012-07-11 15:33:55 · 595 阅读 · 2 评论 -
HDU_3642 Get The Treasury 线段树
http://acm.hdu.edu.cn/showproblem.php?pid=3642题意:给你N个立方体,求空间中被不同的立方体覆盖至少3次的体积。思路:这个题目是一个三维空间的体积交的题,和HDU1255的面积交是差不多的,本题可以先将Z轴离散化,然后对于每个Z轴上的区间,只要求出此时的合法面积然后再乘以Z轴上的高度就可以了。每次求合法面积的时候只要用二维的矩形面积交,然原创 2012-07-12 08:59:18 · 615 阅读 · 0 评论 -
POJ_2482 Stars in Your Window 扫描线 + 线段树
http://poj.org/problem?id=2482题意:给你一个二维坐标系,和其中的一些点,这些点每个都有一个自己的value,要求用一个W*H的矩形框 框住尽可能多的点,并且使得被包括的点的values和最大。思路:和黑书上的一道例题类似,我们可以先将所有的点分成两个点,一个是原来的点(x,y,v) ,再加一个点(x+W,y,-v),然后将所有的点按照X排序,(这样做的原创 2012-07-12 12:50:48 · 913 阅读 · 1 评论 -
HDU_3333 Turing Tree
http://acm.hdu.edu.cn/showproblem.php?pid=3333题意:给你一个有N个数的序列,并且给你一些区间[ L , R ],要你查询给定区间内不同整数的和(相同的整数只需要算一次)。思路:想了好久都没有比较好的办法来处理这个题目,因为线段树的左右两个孩子都是相互独立的,因此无法处理父结点要包含两个孩子结点信息的情况(也就是父结点必须要包含左右孩子都原创 2012-07-12 21:16:02 · 694 阅读 · 0 评论 -
UESTC_1558 Charitable Exchange 弦断树优化dp
http://acm.uestc.edu.cn/problem.php?pid=1558题意:有N中交换的类型,每种交换都可以表示为(a ,b, c )表示的意思是用a元钱的东西,花上c的时间就可以将其变成价值为b的东西,数据保证a 思路:这个题目如果数据量比较小的话是可以考虑用最短路做的,用最短路的话建图就需要O(N^2)的复杂度,所以这样是肯定不行的。我们考虑用dp来求。首先将原创 2012-07-13 12:26:36 · 562 阅读 · 0 评论 -
HDU_3255 Farming 扫描线求面积并
http://acm.hdu.edu.cn/showproblem.php?pid=3255题意:有N块农田,每块农田中种一种作物,每种作物都有一个价格,当在同一区域内种植了两种不同的作物时,作物价格大的生存下来,生命值小的死亡。求最后的所有作物的能买的总钱数。思路:扫描线求体积并,和前面的一个求体积交差不多。 我们可以将作物的价格看作是立体的高,这样就可以直接枚举Z轴求二维矩形面原创 2012-07-12 16:42:41 · 943 阅读 · 0 评论 -
POJ_2464 Brownie Points II 线段树
http://poj.org/problem?id=2464题意:在平面直角坐标系中给你N个点,stan和ollie玩一个游戏,首先stan在竖直方向上画一条直线,该直线必须要过其中的某个点,然后ollie在水平方向上画一条直线,该直线的要求是要经过一个stan之前画过的点。 这时候平面就被分割成了四块,两个人这时候会有一个得分,stan的得分是平面上第1、3象限内的点的个数,ollie的原创 2012-07-12 15:57:28 · 733 阅读 · 0 评论 -
SPOJ_1329 KPMATRIX
http://www.spoj.pl/problems/KPMATRIX/题意:给你一个N*M的矩阵,N,M=A && 思路:首先我们枚举子矩阵的上下边,复杂度为O(n ^ 2), 然后我们处理出前缀和sum[x] , 当我们在找以x为子矩阵的右边界的子矩阵的时候,就是要找有多少个i,使得 Asum[x] - B <= sum[i] 代码:#include #incl原创 2012-08-31 09:28:07 · 853 阅读 · 0 评论 -
HDU_4125 Moles 线段树
http://acm.hdu.edu.cn/showproblem.php?pid=4125题意:给你N个数字,先按照给数的顺序建一棵二叉查找树,然后按中序遍历树的结点,并记录访问结点的奇偶顺序,这样就会得到一个序列,再给你一个0,1序列,现在要你求给出的序列在遍历出来的序列中出现的次数,序列允许相互覆盖。思路:暴力建树如果二叉树退化成一个树链的话,时间复杂度就会变成O(N^2),原创 2012-09-04 21:39:54 · 1002 阅读 · 0 评论 -
HNOI2004 宠物收养所 SBT
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1208思路:本题可以用线段树或者是SBT树做,用线段树只要找出给定一个数的左极限点和右极限点,然后决策选择哪个点,再用线段树单点更新就可以。 用SBT其实思路和线段树类似。线段树:#include #include #include typedef long long LL原创 2013-03-11 09:24:40 · 812 阅读 · 0 评论 -
AVL树的基本操作 HDU_4006 AVL树解法
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4006/*AVL树的基本操作,插入、删除、查找,平均时间复杂度为:(logN)*/#include #include #include const int NN = 1000010 ;int N,K ;struct Node{ int height ; //结点原创 2013-03-09 22:47:51 · 903 阅读 · 0 评论 -
NOI2004 郁闷的出纳员
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503题意:给出N中操作,分别是I(往一列数中增加一个数)、A(将数列中的现有数全部加上一个数)、S(将数列中的所有数全部都减去一个数,如果某个数的值小于给定的MIN,这个数就会被彻底地删除)、F(询问数列中现有数中的第K大数)。思路:应用高级数据结构解题,可以用线段树、树状数组、或原创 2013-03-10 21:50:56 · 733 阅读 · 0 评论 -
POJ_2991 Crane 线段树
http://poj.org/problem?id=2991题意:有N根杆子,前后两根杆子通过一个节点连接,每个节点可以旋转一定的角度,每次给你一个操作(s,a)表示将第s与s+1之间的角度修改为a度,并且每次操作之后都需要求出第N个节点的位置。 思路:线段树。直观的想法是这样的, 如果第s与s+1之间的角度被修改为a的话,其前面的(1-s)是不会发现改变的, 但是其后的(s+1,原创 2012-07-10 09:59:24 · 488 阅读 · 0 评论 -
POJ 1436 Horizontally Visible Segments 线段树
http://poj.org/problem?id=1436题意:有N根竖直的杆子,每个杆子都用一个长度,两根杆子可以想见意味着两个杆子在水平方向上存在一条直线,使得该直线连接两个杆子,并且该水平直线和其他的杆子都没有交点,问一共有多少对三根杆子的组合使得杆子两两可见。思路:首先我们可以依次枚举一根杆子作为三根中的某一根,然后再在与这根可见的杆子中找两根互相可见的杆子。原创 2012-07-09 22:24:48 · 877 阅读 · 0 评论 -
POJ 3261 Milk Patterns
http://poj.org/problem?id=3261题意:N头牛,每头牛有一个编号,求可重叠的至少出现K次的最大子串。思路: 后缀数组+二分 。 二分答案,然后将后缀分成若干组。不同的是,这里要判断的是有没有一个组的后缀个数不小于k。如果有,那么存在k 个相同的子串满足条件,否则不存在。这个做法的时间复杂度为O(nlogn)。代码: #include#include#i原创 2012-03-24 08:56:43 · 403 阅读 · 0 评论 -
POJ 2774 Long Long Message
http://poj.org/problem?id=2774题意:给定两个字符串 A 和 B ,求最长公共子串。思路:后缀数组。(摘自罗穗骞的国家集训队论文)字符串的任何一个子串都是这个字符串的某个后缀的前缀。求 A 和 B 的最长公共子串等价于求 A 的后缀和 B 的后缀的最长公共前缀的最大值。如果枚举A和 B 的所有的后缀,那么这样做显然效率低下。由于要计算 A 的后缀和 B原创 2012-03-23 15:15:37 · 384 阅读 · 0 评论 -
hdu 1598 find the most comfortable road 并查集+贪心
http://acm.hdu.edu.cn/showproblem.php?pid=1598题意:给定有向图和起点和终点,求从起点到终点的路径中,权重最大和最小的边的最小差。思路:很好的一道题目。一开始看到图的点数最多为200个的时候想到可以用floyd做,但是后来就发现其实最小差并没有最优子问题的性质,也就是说用dis[i][j]表示i和j之间的最小差,在dis[i][j]取到最优的时候原创 2012-04-06 13:09:44 · 592 阅读 · 0 评论 -
POJ 1990 MooFest
http://poj.org/problem?id=1990题意:FJ有n头牛,排列成一条直线(不会在同一个点),给出每头牛在直线上的坐标x。另外,每头牛还有一个自己的声调v,如果两头牛(i和j)之间想要沟通的话,它们必须用同个音调max(v[i],v[j]),沟通起来消耗的能量为:max(v[i],v[j]) * 它们之间的距离。问要使所有的牛之间都能沟通(两两之间),总共需要消耗多原创 2012-03-22 21:56:47 · 500 阅读 · 0 评论 -
POJ 2155 Matrix
http://poj.org/problem?id=2155题意: 给定一个n*n的0-1矩阵,执行一些如下的两种操作:C a,b,c,d :将矩阵中(a,b)到(c,d)的格子中的0-1进行“非”操作Q a b :询问当前(a,b)位置的元素的值思路: 二维树状数组本题给出的要求正好与树状数组的操作"相反",但是还是可以转换成树状数组的操作。本题的要求是对二维数组的某一个矩形原创 2012-03-22 18:27:08 · 427 阅读 · 0 评论 -
POJ 2828 Buy Tickets
http://poj.org/problem?id=2828题意:有n个人陆续来到一个队列里排队(插队),第i个来的人插入到pos[i]位置中,问最后的队列情况。思路:线段树,和之前的一道题目的思想是一样的,从最后一个往前推,对于最后一个人(pos,val),在1-N中,他的位置应该是pos+1位,依次类推就可以将整个队列都推出来了。维护一颗线段树,线段树的每个结点存放一个nu原创 2012-03-22 22:31:12 · 387 阅读 · 0 评论 -
POJ 2182 Lost Cows
http://poj.org/problem?id=2182题目大意是,有N头牛,站成一排,但是他们并不是按照1--N的顺序站的,而是打乱了顺序地排成一排。现在已知牛的头数N和每头牛前面比它编号大的牛的头数,要你确定每头牛编号。思路:一开始,由于给了N头牛前面有多少头牛比它的编号大,并且牛的编号是1--N, 我们可以从最后一头牛前面有多少头牛的编号比它打而确定出最后一头牛的编号,接原创 2012-03-22 18:30:25 · 416 阅读 · 0 评论 -
POJ 2104 K-th Number 划分树
http://poj.org/problem?id=2104题意:给定N个数的数组,求Q次询问的区间第K小的数。思路:用划分树求解。所谓的划分树,说白了就是线段树的一种扩展,在划分树中,树的每个结点还是表示一个区间,假设是(l,r),只不过和线段树不同的是划分树对每个结点还维护一个数组,数组的长度为区间的长度(即:(r-l+1))。然后我们就是对区间进行划分,划分的依据就是找到一种“基准元原创 2012-04-10 22:02:23 · 1001 阅读 · 0 评论 -
hdu 3473 Minimum Sum 划分树
http://acm.hdu.edu.cn/showproblem.php?pid=3473题意:给定一个数组,有Q次的询问,每次询问的格式为(l,r),表示寻找一个x,使得的值最小。N思路:本题根据N,Q的数据规模就可以看出,我们需要寻找一种查询时间复杂度为O(logN)的算法,否则肯定会超时。首先可以简单地证明得出这个x的值一定是区间(l,r)的中位数的取值,这个证明也很容易证明,这里原创 2012-04-11 09:09:22 · 823 阅读 · 0 评论 -
POJ 1984 Distance Queries LCA
http://poj.org/problem?id=1986题意:给你一颗树,任意给定Q次询问(a,b) ,询问a 和b两个结点之间的距离。N思路:LCA,因为是一颗树,我们可以任意选取一个结点作为树的根,然后用一次dfs,在O(E)的时间内求出所有点到根的距离,然后用LCA的Tarjin离线算法求出Q次询问的最近公共祖先,最后dis[i][j] = dis[i] + dis[j] - d原创 2012-04-11 18:52:48 · 577 阅读 · 0 评论 -
hdu 2852 KiKi's K-Number 二分+树状数组
http://acm.hdu.edu.cn/showproblem.php?pid=2852题意:给出三种操作, 0 在容器中插入一个数。 1 在容器中删除一个数。 2 求出容器中大于a的第k大元素。思路:二分+树状数组树状数组的特点就是对点更新,成段求和,而且常数非常小。原始的树状数组只有两种操作,在某点插入一个数 和 求1到i的所有数的和。这道原创 2012-04-12 13:50:21 · 594 阅读 · 0 评论 -
POJ 1470 Closest Common Ancestors LCA离线Tarjin算法
http://poj.org/problem?id=1470题意:给定一颗有根树,并且有Q次询问,格式是(u,v),求任意一次询问的两个结点的最近公共祖先。算法:裸的LCA ,这是LCA的第一题,首先说下LCA离线Tarjin算法,其实质就是dfs +并查集。首先将所有的查询都先记录下面(因为是离线算法),然后就是从根结点对树进行一次dfs,复杂度为O(E) ,注意树用邻接矩阵存储。当原创 2012-04-11 16:34:26 · 598 阅读 · 0 评论 -
hdu 2874 Connections between cities LCA
http://acm.hdu.edu.cn/showproblem.php?pid=2874题意:给定有N个结点的森林和Q次询问,求任意给定的两个结点之间的距离。 N算法:LCA离线算法。所不同的是,这题并不是给你一颗树,而是一个森林,因此还需要用并查集将一颗树上的结点放到同一个集合中去,然后对每棵树用Tarjin算法求一次LCA,就可以得出结果了。代码:/*LCA tarjin原创 2012-04-11 23:41:46 · 568 阅读 · 0 评论 -
Billboard HDU 2795 线段树
http://acm.hdu.edu.cn/showproblem.php?pid=2795题意:有一块h*w的墙,往上面贴一些1*wi的海报,要求每张海报要贴在它所能贴的最高的位置,而且在最高的位置要贴在最左边。输出每一张海报所在的行。h,w思路:一种很容易想到的思路是这样的,对于每一张海报,我们从最开始的位置开始找一个适合它的行,并将其贴上,这样原创 2012-06-14 22:36:44 · 556 阅读 · 0 评论 -
HDU_3308 LCIS 线段树
http://acm.hdu.edu.cn/showproblem.php?pid=3308题意:给你一串数字,并给你一些操作,操作分为两种,一种是将数字中的某一个该成另外一个值,还有一种是询问给定区间中的最长上升序列长度。思路:线段树。单点更新。 区间需要记录的内容为:max[idx] , 区间idx内的最大上升连续序列的长度。val[idx] : 区间的值(其实可以原创 2012-07-07 19:56:44 · 467 阅读 · 0 评论 -
POJ 3225 Help with Intervals 线段树
http://poj.org/problem?id=3225题意:给你一些区间的操作,要求最后的区间。初始时区间是空的。区间的长度N思路:本题区间的长度比较大, 如果要直接暴力的话复杂度会达到O(Q*N), 会超时。这样就需要优化,回头考虑本题暴力的思想之所以会超时,是因为花了很多时间在区间的更新上,而且区间的更新是每次都更新到单点,其实并不需要每次都更新到单点,这样就想到原创 2012-07-07 11:06:59 · 682 阅读 · 0 评论 -
POJ 3468 A Simple Problem with Integers Splay
题目链接:http://poj.org/problem?id=3468思路:这个题目很明显可以用线段树来做,但是这篇文章主要是讲一下Splay的做法。Splay :Splay其实就是一种平衡树,它具有BST的特性,但是因为BST最坏情况下建树复杂度会达到O(n),Splay就是一种建立在BST之上,加入了一些旋转,使得退化成链的BST树的均摊复杂度为O(logn)。Splay最重要的就原创 2013-03-11 23:01:37 · 895 阅读 · 0 评论