2011年9月22日
摘要: 题目:Information Disturbing题意:给出一棵树,和每条边的cost值,设置一个界限,要求切断所有叶子结点,切断的边的cost不能超过界限值,并且切断的边的总和不能超过m,求出这个最小界限值。解题思路:很明显的一道树型DP,DP[v],表示切断根结点的v的子树的最小花费,那么这个界限怎么处理呢,由于界限值范围要比总和m小得多,才1-1000,可以用二分枚举,这样在选择切边时可以根据这个枚举值进行判断处理。每个结点v,设其儿子结点为x1,x2,x3...则DP[v] = Min{DP[x1],Node[x1].cost} + Min{DP[x2], Node[x2].cost} 阅读全文
posted @ 2011-09-22 18:59 Kenfly 阅读(289) 评论(0) 推荐(0) 编辑
  2011年9月15日
摘要: 题目: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 阅读(761) 评论(4) 推荐(1) 编辑
  2011年9月14日
摘要: 题目:Regular Polygon题意:给一个正N边形内一点到各顶点的距离,求正N边形的边长。解题思路:听了题意后,马上想到的是二分答案,然后想到是根据面积相等构造等式,于是杯具了,直接导成都无望入线T_T,原因是根据面积相等构造的函数单调性难以判断,很麻烦。赛后一天cxyue跟我说根据内角度之和为360度就很容易二分了,原因是当边长与内角大小成正比,无疑是单调关系。但是提交总是WA,错误出在精度上,XX**,处理这些精度问题最讨厌了。精度调到1e-9TLE,调到1e-7WA,只有1e-8AC,妹!View Code 1 #include <iostream> 2 #includ 阅读全文
posted @ 2011-09-14 15:38 Kenfly 阅读(325) 评论(0) 推荐(0) 编辑
摘要: 题目: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 阅读(410) 评论(0) 推荐(0) 编辑
  2011年9月9日
摘要: 题目: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 阅读(270) 评论(0) 推荐(0) 编辑
摘要: 题目:Find the maximum题意:如题。解题思路:打表后不难找出一条规律:要找的那个数总是2*3*5*7*...这样的值,用递推方法求出所有范围内的这些素数积,从中用二分找出符合的数就行了。比赛的时候,小杰用其独藏的C++高精度模版写了个,TLE,然后cxyue用java过掉了。当时我说用二分查找优化下啊,cxyue说才100个数,二分没多大用,后来那天晚上,小杰跟我说他100多ms过掉了,用了二分。不懂java,下面是鄙人对着类库敲出来的AC代码。顺便一说,为什么类成员变量要定义为static呢,因为只有static数据成员才能被static成员函数调用,main函数是static 阅读全文
posted @ 2011-09-09 13:15 Kenfly 阅读(495) 评论(0) 推荐(0) 编辑
摘要: 题目:To Miss Our Children Time题意:给出n个长方体,其长宽高分别为ai,bi,ci,di, di为长方体的类型。di为0的长方体,当其长宽分别大于或等于某个长方体时,可以摆放在某个长方体上面。di为1的长方体,当其长宽分别大于或等于且其底面积大于某个长方体时,可以摆放在某个长方体上面。di为2的长方体,当其长宽分别大于某个长方体时,可以摆放在某个长方体上面。求通过这些长方体可以摆出的最高塔的高度。解题思路:这题是经典的求DAG图上的最长路径题目。用边表示一个长方体可摆放在另一个长方体这种关系,给所有可能组合的两个长方体造边,则会得到DAG图,这题有个特别小心的地方是当 阅读全文
posted @ 2011-09-09 12:42 Kenfly 阅读(1340) 评论(0) 推荐(0) 编辑
摘要: 题目:Alice and Bob's Trip题意:给出一棵树型地图,Alice和Bob从0根结点开始走,轮流选择边,直到到达叶结点,这里的边是单向的。Alice总是选择会使当前达到最小距离的边,Bob相反,求最后的总距离解题思路:先求出每个子树的最小值或最大值,然后再更新当前根,如此递归。求最小值还是最大值要根据当前轮到Alice还是Bob选择路径决定。这题不难,是简单的树型DP,但是这里很可能会卡数据,用vector是过不了的,动态new和free的花销太大。看一下AC的,基本都是1800ms险过的。前面花了几百ms的可能用上了什么奇淫技巧,又或许还有其它更牛b的解法。下面的代码只 阅读全文
posted @ 2011-09-09 01:54 Kenfly 阅读(499) 评论(0) 推荐(0) 编辑
  2011年9月8日
摘要: 题目:Find Metal Mineral题意:给出一棵树,选择一个s点为根,最多给出k个机器人,从根结点开始,求遍历所有的结点的最小花费。解题思路:树存在递归结构,对每个结点,他和他的后代组成一棵树,且他所有的儿子都是一棵树,则该结点的状态一般由其子树递推而来,每棵子树达到最优时,才能推出根结点的最优解,可采用递归DFS很方便处理。本题可以设DP[n][i]表示结点为n的子树放进i个机器人时的最小花费,其中DP[n][0]特殊,表示放进一个机器人又返回了该结点,结点n的所有儿子结点为DP[si][i],难点是如何从DP[si][0...k]组合成i从而使DP[n][i]最小,即从每个结点中选 阅读全文
posted @ 2011-09-08 23:41 Kenfly 阅读(354) 评论(0) 推荐(0) 编辑
  2011年7月22日
摘要: 当模式字符串长度数比机器字短和总字符集个数比较少时,Shift-And与Shift-Or算法平均效率是KMP的两倍,下面是Shift-And算法,Shift-Or是同样我思想,只不过用位0表示真状态 1 #include <cstdio> 2 #include <cstring> 3 4 void shiftAnd(char *t, char *p) 5 { 6 int lenP = strlen(p); 7 int b[26] = {0}; 8 for(int i = 0; p[i]; ++i) 9 {10 b[p[i] - 'a'] |= ... 阅读全文
posted @ 2011-07-22 16:48 Kenfly 阅读(1404) 评论(0) 推荐(0) 编辑