﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Puzzle-文章分类-题解</title><link>http://www.cppblog.com/puzzle/category/13346.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 24 Mar 2010 15:43:01 GMT</lastBuildDate><pubDate>Wed, 24 Mar 2010 15:43:01 GMT</pubDate><ttl>60</ttl><item><title>FOJ有奖月赛-2010年03月 题解 by Puzzle</title><link>http://www.cppblog.com/puzzle/articles/110328.html</link><dc:creator>Puzzle</dc:creator><author>Puzzle</author><pubDate>Tue, 23 Mar 2010 06:20:00 GMT</pubDate><guid>http://www.cppblog.com/puzzle/articles/110328.html</guid><wfw:comment>http://www.cppblog.com/puzzle/comments/110328.html</wfw:comment><comments>http://www.cppblog.com/puzzle/articles/110328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/puzzle/comments/commentRss/110328.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/puzzle/services/trackbacks/110328.html</trackback:ping><description><![CDATA[<p>A.<strong><a href="http://acm.fzu.edu.cn/problem.php?pid=1871"><strong>Amicable Pair </strong><br></a></strong>亲和数，先暴力算出数据，然后打表之。 <br></p>
<p>B.<strong><a href="http://acm.fzu.edu.cn/problem.php?pid=1872"><strong>A New Sequence Problem </strong></a></strong><br>先YM一下AC。根据题目里的公式，先生成A数组。算A[0]需要通过fibonacci找循环节,找循环节的方法就直接暴力即可,当f[i]=f[1]&amp;&amp;f[i-1]=f[0],i-1必是一个循环的长度。算出A数组以后，其实就是对于字符串的操作了。比赛的时候用后缀数组算出来了，但是没想到O(n)的操作。赛后看到AC说是o(n)的DP，坚定复杂度后想到，在算出height数组后，用当前位置表示为最低位置，然后向左向右扩展到第一个比当前位置低的地方，并bl[],br[]数组记录这个最左和最右，几乎就是o(n)的。</p>
<p><br>C.<strong><a href="http://acm.fzu.edu.cn/problem.php?pid=1873"><strong>Coin Puzzle</strong></a> </strong><br>给出一个多边形和两个圆，问两个圆能不能放在多边形里，并且两圆不相交。<br>求出两个圆的圆心的合法范围，是两个多边形，然后求两个多边形的最远距离</p>
<p>D.<strong><a href="http://acm.fzu.edu.cn/problem.php?pid=1874"><strong>Tree Game</strong></a> </strong><br>能构成一颗生成树当且仅当边数不少于n-1条；如果能构成一种生成树，那么能构成任意类型生成树</p>
<p>E.<strong><a href="http://acm.fzu.edu.cn/problem.php?pid=1875"><strong>Swap </strong></a></strong><br>发生在两个环间的交换会将两个环合并，发生在同一个环的交换会将这个环拆成两个环。<br>如果不考虑奇偶性，那么每个环之间相互独立，互不影响，现在若一个环里同奇偶性，例如全是奇数，那他肯定要和其他的环发生接触，也就是和其他环合并，这里选择全是偶数的环显然不会更差。<br>如果没有了偶数环，那就只能选择和剩下的既又奇又有偶的环合并了。<br>最后可以证明一个环里既又奇数又有偶数时，最快将它完全拆开需要n-1步。</p>
<p>F.<strong><a href="http://acm.fzu.edu.cn/problem.php?pid=1876"><strong>JinYueTuan </strong></a></strong><br>用隔板法可以知道答案是C(m+n-1, n) * n!. 但是数据量非常大，直接算乘积超时，加上一个剪枝瞬间出解：如果发现在边乘边模的过程中答案变为0，就可以跳出了。</p>
<p>G.<strong> <a href="http://acm.fzu.edu.cn/problem.php?pid=1877">MiniSum </a></strong><br>dp[i][j]表示当只考虑前i个物品时，要准备加入第i+1个物品时，X[i+1]前面的系数为j时的函数最小值。<br>转移就是dp[i][j] + j * (-Li) --&gt; dp[i+1][j - Li]<br>&nbsp;dp[i][j] + j * ( Li) --&gt; dp[i+1][j + Li]<br>向后更新，最后答案就是dp[n][?]取个最大的。</p>
<a href="http://acm.fzu.edu.cn/problem.php?pid=1878">H.<strong>Urban planning </strong><font color=#000000><br></font></a><font color=#000000>题目十分费解，受不了了。。。<br>正确的理解就是给N个点，每个点有个权值，以及每两个点之间有边权，单向的。求出一个包含特定点（假设编号为1）的点的集合满足：<br>1、这个集合元素要尽量多。<br>2、集合中的元素之间差异不能超过V。<br>3、在每个集合中选出边，使特定点到其他点都有路可达，并且边权之和要最小。<br>4、如果两个集合元素个数相同，取较大的边权。<br><br></font>首先，如果给出满足条件的点集，我们知道每两个点之间都有边，只要求出一颗最小生成树就行了，鉴于有向，所以求出从特定点的树形图就行了（关于根确定的最小树形图，参考刘朱算法）。所以只要找到这个满足条件的集合就行了，注意到集合之中的元素最大差异不能超过V，而且V也很小，所以可以枚举集合的权值区间[lo，lo+V]，所有权值落在这个区间中的点都满足条件，由于任两个点之间都有边，所以一定存在树形图，最后求下最小树形图，然后判断下就行了。。。<br>I.<strong><a href="http://acm.fzu.edu.cn/problem.php?pid=1879"><strong>Air Strike</strong></a> </strong><br>离线操作，把删除和查询都保存起来。把删除保存后排序并unique，查询也进行排序，然后从小到大查询，看当前是否被删除，删除的话跳过当前这个点往后移一个，惊讶于最后代码40行以内。<br><br>J.<strong><a href="http://acm.fzu.edu.cn/problem.php?pid=1880"><strong>MiniCost</strong></a></strong> <br>题目意思就是给出一个括号序列，每次可以选择改变特定点上的括号方向，并且改变有权值。求出最小的改变权值和，使这个括号序列合法。<br>暂时只会O（N^2）算法。<br>注意到如果一个括号序列要是合法的话，任意位置一定是左括号数大于等于右括号数，所以以此定义状态dp[i][j]，表示前i个符号中，左括号比右括号多j个。只要根据当前的符号转移就行了。。 初始条件dp[0][0] = 0 。。最后答案dp[N][0] 。。。 
<img src ="http://www.cppblog.com/puzzle/aggbug/110328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/puzzle/" target="_blank">Puzzle</a> 2010-03-23 14:20 <a href="http://www.cppblog.com/puzzle/articles/110328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>