Posted on 2010-03-23 14:20
Puzzle 阅读(357)
评论(1) 编辑 收藏 引用 所属分类:
题解
A.Amicable Pair
亲和数,先暴力算出数据,然后打表之。
B.A New Sequence Problem
先YM一下AC。根据题目里的公式,先生成A数组。算A[0]需要通过fibonacci找循环节,找循环节的方法就直接暴力即可,当f[i]=f[1]&&f[i-1]=f[0],i-1必是一个循环的长度。算出A数组以后,其实就是对于字符串的操作了。比赛的时候用后缀数组算出来了,但是没想到O(n)的操作。赛后看到AC说是o(n)的DP,坚定复杂度后想到,在算出height数组后,用当前位置表示为最低位置,然后向左向右扩展到第一个比当前位置低的地方,并bl[],br[]数组记录这个最左和最右,几乎就是o(n)的。
C.Coin Puzzle
给出一个多边形和两个圆,问两个圆能不能放在多边形里,并且两圆不相交。
求出两个圆的圆心的合法范围,是两个多边形,然后求两个多边形的最远距离
D.Tree Game
能构成一颗生成树当且仅当边数不少于n-1条;如果能构成一种生成树,那么能构成任意类型生成树
E.Swap
发生在两个环间的交换会将两个环合并,发生在同一个环的交换会将这个环拆成两个环。
如果不考虑奇偶性,那么每个环之间相互独立,互不影响,现在若一个环里同奇偶性,例如全是奇数,那他肯定要和其他的环发生接触,也就是和其他环合并,这里选择全是偶数的环显然不会更差。
如果没有了偶数环,那就只能选择和剩下的既又奇又有偶的环合并了。
最后可以证明一个环里既又奇数又有偶数时,最快将它完全拆开需要n-1步。
F.JinYueTuan
用隔板法可以知道答案是C(m+n-1, n) * n!. 但是数据量非常大,直接算乘积超时,加上一个剪枝瞬间出解:如果发现在边乘边模的过程中答案变为0,就可以跳出了。
G. MiniSum
dp[i][j]表示当只考虑前i个物品时,要准备加入第i+1个物品时,X[i+1]前面的系数为j时的函数最小值。
转移就是dp[i][j] + j * (-Li) --> dp[i+1][j - Li]
dp[i][j] + j * ( Li) --> dp[i+1][j + Li]
向后更新,最后答案就是dp[n][?]取个最大的。
H.Urban planning
题目十分费解,受不了了。。。
正确的理解就是给N个点,每个点有个权值,以及每两个点之间有边权,单向的。求出一个包含特定点(假设编号为1)的点的集合满足:
1、这个集合元素要尽量多。
2、集合中的元素之间差异不能超过V。
3、在每个集合中选出边,使特定点到其他点都有路可达,并且边权之和要最小。
4、如果两个集合元素个数相同,取较大的边权。
首先,如果给出满足条件的点集,我们知道每两个点之间都有边,只要求出一颗最小生成树就行了,鉴于有向,所以求出从特定点的树形图就行了(关于根确定的最小树形图,参考刘朱算法)。所以只要找到这个满足条件的集合就行了,注意到集合之中的元素最大差异不能超过V,而且V也很小,所以可以枚举集合的权值区间[lo,lo+V],所有权值落在这个区间中的点都满足条件,由于任两个点之间都有边,所以一定存在树形图,最后求下最小树形图,然后判断下就行了。。。
I.
Air Strike 离线操作,把删除和查询都保存起来。把删除保存后排序并unique,查询也进行排序,然后从小到大查询,看当前是否被删除,删除的话跳过当前这个点往后移一个,惊讶于最后代码40行以内。
J.
MiniCost 题目意思就是给出一个括号序列,每次可以选择改变特定点上的括号方向,并且改变有权值。求出最小的改变权值和,使这个括号序列合法。
暂时只会O(N^2)算法。
注意到如果一个括号序列要是合法的话,任意位置一定是左括号数大于等于右括号数,所以以此定义状态dp[i][j],表示前i个符号中,左括号比右括号多j个。只要根据当前的符号转移就行了。。 初始条件dp[0][0] = 0 。。最后答案dp[N][0] 。。。