随笔分类 -  数据结构

HDU 4046【树状数组】
摘要:题目:Panda题意:长长一篇情书纯是忽悠选手们的。给一连串由wb组成的字符中,从中找出"wbw"子串个数,有两种操作,操作0,L,R,询问L~R子串内包含"wbw"的个数。操作1,k,ch,将第k个字符更换为ch。解题思路:带着绵绵情意看完了整个题目后就崩出树状数组了,很明显啊,动态更改值,动态个数。sum(i)表示1-i字符串内包含"wbw"子串个数,则对第一个询问操作,直接可输出sum(R)-sum(L+1)即可,想想为什么要L+1呢? 对第二个操作,判断下更改前和更改后的情况,适当更新树状数组即可。详情代码。View Code 阅读全文
posted @ 2011-09-27 02:22 Kenfly 阅读(365) 评论(0) 推荐(0)
HDU 4028【map离散化DP】
摘要:题目:The time of a day题意:给出一个数N,表示有N条指针,编号1~N,第i条指针旋转一圈所要用的时间是i,从中挑选一些指针,决定一天的长度,这个长度定义为这些指针两次重合的时间间隔。然后给出一个m,求出长度大于等于m的组合数,也就是选择指针的方法数。解题思路:很明显这个长度为挑出指针的最小公倍数。朴素的想法是用递推造出所有的最小公倍数,然后找出大于等于m的。但N最大为40,给合数也有2^N-1个,数组开不下。所幸这些最小公倍数有很多是重复的,经打表什么的发现好像只有10万个不同的最小公倍数。要造出1-i这些数组成的最小公倍数很简单,用个O(N*N)的递推算法。假设前面已造好了 阅读全文
posted @ 2011-09-26 11:33 Kenfly 阅读(666) 评论(0) 推荐(0)
POJ 1988【并查集+记录个数】
摘要:题目:Cube Stacking题意:有N个cube,编号1-N,有两种操作:操作1: M x y 把含有cube的堆堆放在含有y的堆的上面。操作2: C x 询问cube编号为x的下面有多少个cube。解题思路:黑书上有类似题目,属于带有查询操作的并查集。设置两个变量D, C,D[i]表示i下面有几个cube, C[i],表示以i根时儿子个数,也就是堆在它上面的cube总个数。在每个M,C操作都要对x,y结点进行更新,有两种更新,一个是更新D[i],不停向根累加,一个是路径压缩。具体参考代码。View Code 1 #include <iostream> 2 #include & 阅读全文
posted @ 2011-09-24 20:36 Kenfly 阅读(281) 评论(0) 推荐(0)
HDU 4008【树型DP+树儿子兄弟判断】
摘要:题目:Parent and son题意:输入N,Q,接着输入N-1条边,组成树,结点以1-N命名。然后输入Q个提问,每个提问输入X,Y(X!=Y),表示当以X为树的根结点时,求Y的最小儿子和最小子孙。解题思路:以1为根,进行DFS遍历,DP每个结点的最小儿子和最小子孙,注意最小儿子要包括其father,方便后面处理。有了这些信息后,对每个提问X,Y。分三种情况:s第一种情况:当Y==1时,X肯定是Y的儿子。这个要特殊处理,因为上面获得信息不能取得其最优解。因为DFS结果的最小子孙sx有可能跟x在同一棵子树上,那么当以X为树根时,Y的最小子孙肯定不是sx。所以结点1要预先处理。找出其最小的子孙s 阅读全文
posted @ 2011-09-15 16:53 Kenfly 阅读(772) 评论(4) 推荐(1)
HDU 4027【线段树+求和+动态改变区间各数的值】
摘要:题目:Can you answer these queries?题意:首先给出1-N个数,然后有两种操作。第一种操作: 0 x y, 表示将x,y之间的数全部开根号。第二种操作: 1 x y, 表示求x,y之间的全部数之和。解题思路:看到题目,应很自然想到了线段树和数状数组,两种结构都能快速求出区间之和。但两者的优点不尽相同,前者在维护方面更自由一点,后者能更快速维护和求和。这题的解题突破点是:当一个数开根后得到1或0时,此后此值不会再改变。利用这个特点,设置一个变量表示x,y区间是否全部为1或0,如果为真,则在这个区间上的第一种操作直接忽略。View Code 1 #include < 阅读全文
posted @ 2011-09-14 01:36 Kenfly 阅读(417) 评论(0) 推荐(0)
HDU 3627【线段树变形+离散化】
摘要:题目:Giant For题意:一个容器有三种操作:add x y: 增加一坐标。remove x y: 去除一坐标。find x y: 查找容器里的一坐标使得其座标值大于x y,如果有多组值,按主以x次以y排序,输出最小x, y(0 <= x, y<= 1000000000)解题思路:用线段树维护坐标点,以x值作为叶结点,然后第个结点保存其子树的最大y值,如果find x, y,从根结点开始,往符合条件的子树深入,即往子树有大于x的叶结点和大于y值的结点的子树前进这里x,y值很大,数组开不下去,但操作数最多才200000,也就是最多才有200000对不同的数,首选输入所有的操作,按 阅读全文
posted @ 2011-09-09 14:11 Kenfly 阅读(278) 评论(0) 推荐(0)
GOJ 1132[树状数组]
摘要:[查看题目] 什么是树状数组?既然是数组,怎么可能是树状的? 当然可以!这里说的树状并不是指物理空间上的树状,就像用数组来实现二叉堆一样,数组怎么可能是"堆"呢.下面是树状数组的结构图,对树状数组的解释百度百科上已经很详细了,这里不再详细.树状数组可以用来快速求出某个范围内数据之和,但本人觉得它最强大的是能动态快速地修改或增加数据. [百度百科_树状数组] 题目意思是N头牛排成一行(即X轴),给出每个牛的volume threshold(听觉范围??)和一个坐标coordnate,两头牛这间交流必须至少产生一个volume值,这个volume值等于两头牛的距离乘以这两头牛的 阅读全文
posted @ 2010-11-22 14:00 Kenfly 阅读(305) 评论(0) 推荐(0)