﻿<?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++博客-第七天堂-文章分类-赛区题解</title><link>http://www.cppblog.com/lvlawliet/category/17928.html</link><description>VIM</description><language>zh-cn</language><lastBuildDate>Sat, 15 Oct 2011 18:15:13 GMT</lastBuildDate><pubDate>Sat, 15 Oct 2011 18:15:13 GMT</pubDate><ttl>60</ttl><item><title>2011 ACM/ICPC 福州赛区网络赛解题报告</title><link>http://www.cppblog.com/lvlawliet/articles/158394.html</link><dc:creator>LLawliet</dc:creator><author>LLawliet</author><pubDate>Sat, 15 Oct 2011 14:15:00 GMT</pubDate><guid>http://www.cppblog.com/lvlawliet/articles/158394.html</guid><wfw:comment>http://www.cppblog.com/lvlawliet/comments/158394.html</wfw:comment><comments>http://www.cppblog.com/lvlawliet/articles/158394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lvlawliet/comments/commentRss/158394.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lvlawliet/services/trackbacks/158394.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #333333; font-family: Tahoma, Verdana, STHeiTi, simsun, sans-serif; background-color: #ffffff; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">第一次写网络赛的题解，福州赛区网络赛作为我第一年ACM最后一次网络赛酱油，画了一个很像逗号的句号.....好吧，还得为北京现场赛准备啊准备.......</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">这次酱油打的很犀利，貌似出第一题很快，之后节奏就总比师兄们慢一步.....囧死了，名次很顺利的入手，就没啥了，写下题解吧。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://rrurl.cn/4RtC2n" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #005eac; cursor: pointer; text-decoration: none; ">题目链接</a>&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">第一题：A Card Game</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">坑爹的题目叙述，仰慕杰哥非常犀利的YY出题意，ans = a[1] / N......好吧，现在证明一下啊。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">首先，我们假设取牌的顺序是一个序列，我们考虑可行序列存在的情况：对于序列中任意一个数i的后面一个数j，必然要放在第i堆里面，因为值为i的数有a[i]个，所以在i后面的数也恰好有a[i]个，所以a[i]数放在了第i堆，符合题目约束了。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">由于游戏从第一个堆开始，第一个数是没有前驱的，所以，如果最后一个数不是1，那么第一堆必然是a[1] ＋　１个数了，与约束不符合。而且，如果最后一个数不是１，记为ｉ的话，就只有a[i] - 1个后继了。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">所以，综上，只有最后一个数为1，那么堆容量a[i]才会符合约束，而我们能根据序列构造一种符合情况的分摊和取牌方案，所以，题目变为了：N个数的全排列，其中最后一个是1的概率.....</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">先从a[1]个1里面取一个1，有a[1]种方案，之后剩下N-1个数全排列(N-1)!，符合结尾是1的方案数是a[1] * (N-1)!种，所以解就是a[1] / N。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">第二题：Abalone&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">这游戏....没玩过啊.....膜拜华中科技大斩杀此题并且是FB啊.....</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">第三题：Aircraft</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">一道计算几何的问题，和VIJOS上面的一道DP题WALL挺像的，不过那个是正方形，这个是圆形。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">首先很容易想到就是最短路了，因为N范围很小，枚举所有圆的交点，之后你要么过圆心，要么过交点，之后最短路，不过有个trick，就是很多圆排列那种情况，可以不过任何交点圆心直接到达。所以，对于那种情况，分段判断一下这个线段是否整个在园中就行了。这个判断是相当繁杂的，先求出线段与圆的所有交点，之后对这些点排序，判断相邻两个点之间的线段是否在圆上就OK了....</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">第四题：Carcassonne</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">达哥犀利的AC了此题，我们都知道是DP，但是我比赛的时候怎么也没想出转移方程....好吧，插头DP咱不会.....</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">赛后想到了高中时候写过的多米诺，和这个很像，两个解法，状态压缩DP和矩阵乘法....后者我忘了....</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">状态压缩DP：状态就是每行下面连成的图案状态（最多3^12状态数）</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">转移方程f[row][next_line] = sum(f[row - 1][pre_line])其中，pre_line和next_line是该行合法状态时，上一行图案和下一行图案。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">第五题：Catan</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">非常犀利的一道题，卡掉了华中科技大AK全场的机会，而且，这个游戏我没玩过，也就没看题了.....</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">第六题：Random Sequence</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">一道数学题。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">结论：我们设序列a是长度为i所有情况的综合（就是不除以那个2^n），b序列是b[i] = a[i] - a[i-1] * 2，观察b数列我们可以特出，如果是i偶数，那么b[i] = 2 * b[i-1]，如果是i奇数，那么就等于C((i+1)/2)(i+1)（i+1里面取一半....）b序列有了，a也就有了，除以2^n，得解。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">下面论证一下这个YY式子出的式子是对的.....</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">首先，我们可以知道a[i] &gt;= a[i-1] * 2，因为i-1序列长度增加了，解的种类增加，而且上限也增加了，这就是为什么会大于，由于长度存在奇偶性质，所以奇位和偶位增加一位的情况有一样了......</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">之后....具体的.....我也说不清楚了.....总之，数学归纳法出来的是对的，而理论上.....我不是数学家。。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">第七题：Random Maze</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">这道题看了，没写，因为等我看着道题的时候，已经马上收场了.....看完这道题后我淡定地打开了数独......</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">说一下思路吧，改变每条表的权值为a-b，添加一条终点指向起点的特殊边，这样保证里每个点出入度相等的条件，之后找出所有负向环正向，如果环中没有那个特殊边，就是impossible，不过对于搜环和重边的问题，我还真没有啥好方法.....SPFA吧......</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">下面是来自Starvae的解题：最小费用最大流(膜拜)</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">下面是直接建图的方法。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">我们的答案保存在sum中。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">初始时每个点的in[] out[] 都为0, in[i] 表示第i这个点需要in[i]条指向i的边才能满足i这个点的入度平衡。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">对于每条边，如果a &lt;= b 那么建 v-&gt;u的边，流量为1， 权值为b-a。 sum+= a;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">此时， u-&gt;v 被翻转， 所以in[v] ++, out[u] ++.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">否则 建 u-&gt;v的边， 流量为1， 权值为a-b。 sum += b;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">此时, u-&gt;v 没有被翻转， 所以in[] out[] 不改变</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">然后添加一条终点指向起点的边， 直接in[s] ++; out[t] ++;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">然后新建超级源汇S,T。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">对于每个点i， 如果in[i] &gt; out[i] . 建边S-&gt;i, 权值为0， 流量为in[i] &#8211; out[i];</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">否则的话 建边 i-&gt;T ,权值为0， 流量为out[i] &#8211; in[i];</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">然后跑一次最小费用最大流。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">如果最后从S出去的边没有满流的话 就是impossible。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">否则答案即为sum+ mincost.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">第八题：SanguoSHA</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">呃，很暴力的一道题，6！* 6!真心能接受啊......</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">全排列自己的武将，和对方全排列的比，如果完胜，输出，不完胜，下一个排列。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">next_permutation函数很好用。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">第九题：Squiggly Sudoku</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">模板题吧.....算是吧......强大的Dancing Links，高中为了玩数独，弄了它好久....而且现在也没弄明白，读入比较特殊，DFS一下，之后果断十字链表......</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">第十题：War</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">又是一个游戏题......</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">题目很短，而且开场被FB，之后我果断读题，YY了两个题意，先杀死时间最长的或者先杀死需要最少了，师哥看了数据果断否定了我第二个YY，之后开始敲，一个sort，出解，感觉速度挺快了....可是就这样还被落在了第二页，仰慕众神牛队的速度啊......</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">总结：这次网络赛，背景都是游戏，还都是我没玩过的游戏.......三国杀除外......我了个去啦，在中国，是吧，主流游戏就是三国杀，WOW，DOTA，SC2，您老倒好，弄些外国的游戏......好吧，不吐槽了，感觉题挺好的，难水分明.....网络流那道我真TM的没看出来是网络流啊......还有那两个我题都懒得看的题......我老怀疑有时候我不是在打ACM比赛，我像在考GRE.....第一次写这么全的题解报告，大家多批评吧......</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">而且，这次网络赛酱油打的很好，很专业，打出了国际水平~~~~~</p></span><img src ="http://www.cppblog.com/lvlawliet/aggbug/158394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lvlawliet/" target="_blank">LLawliet</a> 2011-10-15 22:15 <a href="http://www.cppblog.com/lvlawliet/articles/158394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>