上一页 1 ··· 6 7 8 9 10 11 12 13 14 ··· 66 下一页
摘要: 题意:给定一棵树,然后给定若干组询问,问某些点被作为最近公共祖先的次数。解法:刚刚一直不知道根在哪里给了出来,后来才发现给定的点一定是按照从层数低的节点指向层数高的节点,因此没有双亲的节点为根节点,然后运行tarjan算法即可。这里刚开始的时候我还想把最后的结果除以2输出,这里没有这个必要,因为两个节点一定有一个先后的遍历顺序,这个顺序保证了只被统计一次。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <iostre 阅读全文
posted @ 2013-05-17 16:31 沐阳 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 题意:给定N个节点一棵树,现在要求询问任意两点之间的简单路径的距离,其实也就是最短路径距离。解法:spfa:直接对每一对点作一次spfa即可。Tarjan:求出两个点A,B之间的最近公共祖先C,设根到每个点的最短距离为dis[],那么距离就是dis[A]+dis[B]-2*dis[C]。而根到各个点的距离一次dfs就出来了,因此问题转化为求出两点之间的最近公共祖先,Tarjan算法能够离线解决所询问的点对。原理如下:对于一次dfs,当第一次遍历到点u时,那么令set[u] = u。遍历完以u为根的树后,将u所属集合指向双亲节点。接下来查看u的访问列表中有没有询问<u, v>的点对, 阅读全文
posted @ 2013-05-17 15:34 沐阳 阅读(338) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一棵树,每个节点刚开始的时候都是黑色的,现在有Q组操作,要么是询问当前的树中距离最远的两个黑色的距离是多大,要么是改变某一点的颜色。解法:该题看论文+参考代码搞了一天,感觉模型的转化已经求解的过程都非常的巧妙。1.将这棵树有树形结构选择一个根节点再通过dfs搜索转化线性结构,然后将距离问题用括号来描述。2.使用括号描述后,发现任意两个点的距离是通过对之间的括号序列进行某种消除从非稳定态到达一个稳定态,然后在稳定态中得到距离信息。3.发现括号序列是能够进行合并的,所以线段树被派上了用场。而这明显又是一个动态规划的合并过程,关于区间的线段树题无非要维护这么几个量,单独的区间、左连续的区间 阅读全文
posted @ 2013-05-16 23:07 沐阳 阅读(1577) 评论(0) 推荐(0) 编辑
摘要: 题意:存在一个固定编号[1,10^9]的盒子群,每个盒子里面都有一个数Ai(Ai>=0),刚开始的时候不知道各个盒子里面的数是多大。有Q组更新,分别表示[Li, Ri]内最小的元素是多大,现在问Q组操作后,盒子中数字总和最小可以为多少?解法:标准题解是并查集树状数组的解法,谢勇教练也提到可以使用线段树来解。这里就是使用的线段树来求解。由于该题需要离散化点,这里有个地方特别要注意就是不能够建一棵点树,因为如果建立了一棵点树,那么意味着离散化后的叶子区间是单个点,各个相邻的叶子节点之间的区间信息无法保存,也就是这里错了很多次。正确的做法是如果有某组更新是[Li, Ri] Ci,那么就是更新[ 阅读全文
posted @ 2013-05-15 09:43 沐阳 阅读(298) 评论(1) 推荐(0) 编辑
摘要: 题意:给定一个N个不同的非负整数(每个数不大于10^6),1<=N<=5000,问找到一个最小的m使得N个数去掉最多x(0<=x<k)个数后能够使得N-x个数%m两两不同。解法:首先可以给定出一个暴力的方法,那就是枚举所有的m,从1开始,然后统计余数相同的数一共多出来多少个,很明显,当多出来的数大于k时则不满足情况,从小到大枚举m遇到第一个满足要求的返回即可。但是这样很显然会超时,时间复杂度为O(N*10^6),这里有一个优化如下:统计出所有的两两组合差值的情况,如有两个数x,y如果x % m = y %m,那么(x - y) % m = 0,统计差值将在后面的计算中发 阅读全文
posted @ 2013-05-14 09:57 沐阳 阅读(597) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个n*n的矩形框,也就是限制在一个(0,0)到(n,m)的平面区域内,求出一个最大的矩形,该矩形面积要求最大,且长和宽的比要为a/b,并且该矩形需包含一个限制区域内的一个点,该矩形的中心应该离这个点越近越好。输出左下角和右上角的坐标。如果在满足所有要求的情况相同近的话输出坐标字典序最小的一种情况。解法:初读起来,这题的限制条件颇多,做的过程中确实有许多地方需要注意,那么我们来一步步解决这个问题:1.首先假设这个矩形的的长(投影到x轴上的量)为sl, 宽为sw(投影到y轴上的量)。那么依据题意有sl / sw = a / b。将方程变形有b*sl - a*sw = 0的形式,可以用一 阅读全文
posted @ 2013-05-13 23:12 沐阳 阅读(343) 评论(0) 推荐(0) 编辑
摘要: 题意:要求给出一个数N的余数系的三个排列A, B, C,其中使得对于任意的 i 满足(A[i] + B[i]) % N = C[i]。例如N=5的时候有一下排列:A: 1 4 3 2 0B: 1 0 2 4 3C: 2 4 0 1 3解法:首先排列如果存在的话,肯定是不唯一的,因为可以随意交换A,B,C的相同两列使得结果仍然满足。对于一个给定的N,我们可以列出一下一张图:横纵坐标反应了余数相加的情况:0 1 2 3 41 2 3 4 02 3 4 0 13 4 0 1 24 0 1 2 3只要取从左上到右下的对角线即可。以上只能够保证N为奇数的时候有解,不足以说明白偶数为何无解。还有一种观点现 阅读全文
posted @ 2013-05-13 16:06 沐阳 阅读(352) 评论(0) 推荐(0) 编辑
摘要: 题意:给定了一个塔防的游戏模型,跟着这个模型进行模拟,输出能在多少时间内消灭掉所有的怪兽,如果不能的话,输出-1。解法:这里提几个要注意的地方:1.注意怪兽不要走回头路;2.注意已死的怪兽不能够再次成为防御塔选择或者是移动的对象;3.所有防御塔是同时攻击的,因此选择型的防御塔不能够预判出该秒攻击是否多余,即最优目标是绝对的,不会因为其他塔能够射杀死中途改变;4.要注意最后全部怪兽被持续冻结而不掉血的情况。题目中可能没有把这个游戏的过程说的特别详细,对于每一秒钟是如下度过的:在一秒钟开始的时候(S)所有的怪兽全部获得一秒钟更新时间:如果怪兽被冻结,那么这一秒钟用于解冻,无法移动;否则使用一秒钟向 阅读全文
posted @ 2013-05-09 17:03 沐阳 阅读(341) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一些歌词,歌词是一行一行给定的,要出输出出现次数大于2的所有单词,次数一样多的单词归为一组,每组输出长度最长的,否则输出字典序倒数第二的单词。解法:这题单词的定义实在是模糊,正确做法是把所有的非字母变为空格后再处理。使用map统计单词数量,然后用数组取出来排个序即可。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <cctype>#include &l 阅读全文
posted @ 2013-05-09 08:47 沐阳 阅读(342) 评论(0) 推荐(0) 编辑
摘要: 题意:有一个判定用户等级的系统,现在不同的等级有不同的评价标准,现给定一个用户的历史等级以及当前最新的数据,要求给出目前的等级。解法:把不同的等级标题映射到数字,然后或者历史等级的标号,然后从大的往当前标号枚举,查看是否升级,如果升级则推出判定;否则从当前等级往小的标号枚举,查看是否降级,查看降级时只需要判定比率是否小于一个阀值即可,因为其他满足历史等级的条件一定满足标号比它小的等级,遇到不降级即退出判定。由于Peasant的判定于其他不太一样,在开始的时候就判定一下。代码如下:#include <cstdlib>#include <cstdio>#include &l 阅读全文
posted @ 2013-05-08 20:58 沐阳 阅读(605) 评论(3) 推荐(0) 编辑
上一页 1 ··· 6 7 8 9 10 11 12 13 14 ··· 66 下一页