﻿<?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++博客-wolf5x@bupt</title><link>http://www.cppblog.com/wolf5x/</link><description>good luck &amp; have fun</description><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 06:07:59 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 06:07:59 GMT</pubDate><ttl>60</ttl><item><title>new blog url...</title><link>http://www.cppblog.com/wolf5x/archive/2013/09/18/203300.html</link><dc:creator>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</dc:creator><author>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</author><pubDate>Wed, 18 Sep 2013 06:48:00 GMT</pubDate><guid>http://www.cppblog.com/wolf5x/archive/2013/09/18/203300.html</guid><description><![CDATA[<a href="http://wolf5x.cc">http://wolf5x.cc</a><img src ="http://www.cppblog.com/wolf5x/aggbug/203300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf5x/" target="_blank"><A href="mailto:wolf5x1016@gmail.com">wolf5x</A></a> 2013-09-18 14:48 <a href="http://www.cppblog.com/wolf5x/archive/2013/09/18/203300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>The "Clockwise/Spiral Rule"</title><link>http://www.cppblog.com/wolf5x/archive/2011/08/31/154778.html</link><dc:creator>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</dc:creator><author>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</author><pubDate>Wed, 31 Aug 2011 05:07:00 GMT</pubDate><guid>http://www.cppblog.com/wolf5x/archive/2011/08/31/154778.html</guid><wfw:comment>http://www.cppblog.com/wolf5x/comments/154778.html</wfw:comment><comments>http://www.cppblog.com/wolf5x/archive/2011/08/31/154778.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf5x/comments/commentRss/154778.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf5x/services/trackbacks/154778.html</trackback:ping><description><![CDATA[<div>void (*signal(int, void (*fp)(int)))(int);&nbsp;<br /><strong>Question: <br /></strong>What is 'signal' ?<br />&nbsp; 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">cstdio</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f(</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">*</span><span style="color: #000000">pf)(</span><span style="color: #0000ff">int</span><span style="color: #000000">),&nbsp;(</span><span style="color: #000000">*</span><span style="color: #000000">qf)(</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">*</span><span style="color: #000000">hf(</span><span style="color: #0000ff">int</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">(</span><span style="color: #000000">*</span><span style="color: #000000">)(</span><span style="color: #0000ff">int</span><span style="color: #000000">)))(</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />typedef&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">*</span><span style="color: #000000">sighandler_t)(</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />sighandler_t&nbsp;signal(</span><span style="color: #0000ff">int</span><span style="color: #000000">,&nbsp;sighandler_t);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a)&nbsp;<br /><img id="Codehighlighter1_213_251_Open_Image" onclick="this.style.display='none'; Codehighlighter1_213_251_Open_Text.style.display='none'; Codehighlighter1_213_251_Closed_Image.style.display='inline'; Codehighlighter1_213_251_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_213_251_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_213_251_Closed_Text.style.display='none'; Codehighlighter1_213_251_Open_Image.style.display='inline'; Codehighlighter1_213_251_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_213_251_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_213_251_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">void&nbsp;f(int&nbsp;%d)\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;a);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">*</span><span style="color: #000000">hf(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_i,&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">(</span><span style="color: #000000">*</span><span style="color: #000000">_pf)(</span><span style="color: #0000ff">int</span><span style="color: #000000">)))(</span><span style="color: #0000ff">int</span><span style="color: #000000">)<br /><img id="Codehighlighter1_295_356_Open_Image" onclick="this.style.display='none'; Codehighlighter1_295_356_Open_Text.style.display='none'; Codehighlighter1_295_356_Closed_Image.style.display='inline'; Codehighlighter1_295_356_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_295_356_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_295_356_Closed_Text.style.display='none'; Codehighlighter1_295_356_Open_Image.style.display='inline'; Codehighlighter1_295_356_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_295_356_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_295_356_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">_i&nbsp;=&nbsp;%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;_i);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;_pf(_i);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;_pf;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />sighandler_t&nbsp;signal(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;signum,&nbsp;sighandler_t&nbsp;sighandler)<br /><img id="Codehighlighter1_416_507_Open_Image" onclick="this.style.display='none'; Codehighlighter1_416_507_Open_Text.style.display='none'; Codehighlighter1_416_507_Closed_Image.style.display='inline'; Codehighlighter1_416_507_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_416_507_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_416_507_Closed_Text.style.display='none'; Codehighlighter1_416_507_Open_Image.style.display='inline'; Codehighlighter1_416_507_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_416_507_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_416_507_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">signal&nbsp;num&nbsp;=&nbsp;%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;signum);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;sighandler(signum);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;sighandler;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br /><img id="Codehighlighter1_521_606_Open_Image" onclick="this.style.display='none'; Codehighlighter1_521_606_Open_Text.style.display='none'; Codehighlighter1_521_606_Closed_Image.style.display='inline'; Codehighlighter1_521_606_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_521_606_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_521_606_Closed_Text.style.display='none'; Codehighlighter1_521_606_Open_Image.style.display='inline'; Codehighlighter1_521_606_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_521_606_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_521_606_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;pf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&amp;f;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;qf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;hf(</span><span style="color: #000000">12</span><span style="color: #000000">,&nbsp;pf);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;qf(</span><span style="color: #000000">23</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;signal(</span><span style="color: #000000">54</span><span style="color: #000000">,&nbsp;f);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: red"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span></div><br />void (*signal(int, void (*)(int)))(int);<br /><strong>Answer:</strong><br /><strong>signal is a function, passing</strong> {<u>an int</u> and <u>a pointer [to a function passing an int returning nothing (void)]</u>}, <strong>returning</strong> {<u>a pointer [to a function passing an int returning nothing (void)]</u>}.<br /><br /></div><img src ="http://www.cppblog.com/wolf5x/aggbug/154778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf5x/" target="_blank"><A href="mailto:wolf5x1016@gmail.com">wolf5x</A></a> 2011-08-31 13:07 <a href="http://www.cppblog.com/wolf5x/archive/2011/08/31/154778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pku 3697 USTC campus network O(M)</title><link>http://www.cppblog.com/wolf5x/archive/2011/08/15/153390.html</link><dc:creator>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</dc:creator><author>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</author><pubDate>Sun, 14 Aug 2011 19:06:00 GMT</pubDate><guid>http://www.cppblog.com/wolf5x/archive/2011/08/15/153390.html</guid><wfw:comment>http://www.cppblog.com/wolf5x/comments/153390.html</wfw:comment><comments>http://www.cppblog.com/wolf5x/archive/2011/08/15/153390.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf5x/comments/commentRss/153390.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf5x/services/trackbacks/153390.html</trackback:ping><description><![CDATA[08合肥网赛某题。<br /><a href="http://poj.org/problem?id=3697">http://poj.org/problem?id=3697</a><br />题意是问在N个点的完全图(N&lt;=10,000)中删掉M(M&lt;=1,000,000)条边后, 还有多少个点与顶点1连通(顶点编号从1开始). <br />暴力BFS+HASH+各种WS优化的方法很多, 但是出题人原意应该是O(M)的做法吧... 下面是我YY出来的O(M)的做法.<br /><br />只考虑这M条待删边, 能得到什么信息呢? 可以先从点1入手. 扫一遍与1邻接的点, 那么剩下没被扫到的点肯定与1是连通的. 而被扫到的点是"有可能"与1不连通. 所以就把那些肯定与1连通的点做标记. 从这些确定连通的点中任选一个u, 再扫描它的所有邻接点. 这之后, 如果一个点一共被扫了2次, 那么它才"有可能"与1不连通, 其它少于2次的点肯定与1连通, 因为它或者与1连通, 或者与u连通, 而u是已知与1连通的. 这样再拿出一个已经确定连通的点, 扫描它的邻接点, 把被扫过次数&lt;3的又标记为已连通...... <br /><br />经过上面的YY, 算法基本上就出来了: <br />把已知肯定与1连通的点集称为S, 剩下不确定的为T. 一开始, S中只有1这一个点, 其它点都在T中. 每个点有个计数器, 记录自己被扫了多少次.<br />1) 从S中取出一个没处理过的点, 把它标记为已处理, 并遍历它的所有邻接点, 被遍历到的点的计数器都+1. <br />2) T中所有"计数&lt;S中已处理点个数"的, 都可以确定是连通的, 把它们从T中删除, 加入S中.<br />3) 重复1), 直到S中所有点都处理完.<br />这时, S中的点就是与1连通的, T中剩下的就是不连通的.<br /><br />复杂度分析:<br />读入边和扫描边都是O(M)的. <br />S集可以用队列维护, 总共O(N).<br />T集的维护: 每一轮都要扫一遍当前的T, 把所有计数小的删掉, 放进S中. 这样, 这一步的总复杂度就是O(sigma(T)), 会不会到达O(N^2)呢? 实际上是不会的. 因为一条边最多只会使一个顶点的计数+1, 因此每一轮还剩在T中的点数不会超过这一轮遍历过的边数. 这样, 所有回合的sigma(T)就肯定不会超过总边数. 因此这里总共也是O(M)的. 严格来说算上第1轮有N-1个点, 也是O(M+N).<br />这样总的复杂度就是O(M)了.<br /><br />不过这个算法读入用scanf时, g++跑了1000+ms, 改成getchar才到200+ms的. 不知道排前面的神们是不是有更NB的算法. <br /><br />代码:<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-family: Courier; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #000000">#include&nbsp;<br /></span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000">#include&nbsp;<br /></span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000">#include&nbsp;<br /></span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000">#include&nbsp;<br /></span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000">#include&nbsp;<br /></span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /></span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MAXN&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10010</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MAXM&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1000010</span><span style="color: #000000">;<br /></span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;Edge&nbsp;{<br /></span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;v,&nbsp;next;<br /></span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">}edg[MAXM</span><span style="color: #000000">*</span><span style="color: #000000">2</span><span style="color: #000000">];<br /></span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ecnt,&nbsp;gg[MAXN];<br /></span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;yes[MAXN];<br /></span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;que[MAXN],&nbsp;pq,&nbsp;sq,&nbsp;cnt[MAXN],&nbsp;vt[MAXN],&nbsp;nt;<br /></span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;N,&nbsp;M;<br /></span><span style="color: #008080">18</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">19</span>&nbsp;<span style="color: #000000">inline&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getnextint()<br /></span><span style="color: #008080">20</span>&nbsp;<span style="color: #000000">{<br /></span><span style="color: #008080">21</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #008080">22</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;c;<br /></span><span style="color: #008080">23</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">isdigit(c</span><span style="color: #000000">=</span><span style="color: #000000">getchar()));&nbsp;<br /></span><span style="color: #008080">24</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000">{<br /></span><span style="color: #008080">25</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;r</span><span style="color: #000000">*</span><span style="color: #000000">10</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;c</span><span style="color: #000000">-</span><span style="color: #000000">'</span><span style="color: #000000">0</span><span style="color: #000000">'</span><span style="color: #000000">;<br /></span><span style="color: #008080">26</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(isdigit(c</span><span style="color: #000000">=</span><span style="color: #000000">getchar()));<br /></span><span style="color: #008080">27</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;r;<br /></span><span style="color: #008080">28</span>&nbsp;<span style="color: #000000">}<br /></span><span style="color: #008080">29</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">30</span>&nbsp;<span style="color: #000000">inline&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;addedge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;u&nbsp;,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;v)<br /></span><span style="color: #008080">31</span>&nbsp;<span style="color: #000000">{<br /></span><span style="color: #008080">32</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;edg[ecnt].v&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;v;&nbsp;edg[ecnt].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;gg[u],&nbsp;gg[u]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ecnt</span><span style="color: #000000">++</span><span style="color: #000000">;<br /></span><span style="color: #008080">33</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;edg[ecnt].v&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;u;&nbsp;edg[ecnt].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;gg[v],&nbsp;gg[v]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ecnt</span><span style="color: #000000">++</span><span style="color: #000000">;<br /></span><span style="color: #008080">34</span>&nbsp;<span style="color: #000000">}<br /></span><span style="color: #008080">35</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">36</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br /></span><span style="color: #008080">37</span>&nbsp;<span style="color: #000000">{<br /></span><span style="color: #008080">38</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;cas&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #008080">39</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #000000">~</span><span style="color: #000000">scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">N,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">M)&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">(N</span><span style="color: #000000">==</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;M</span><span style="color: #000000">==</span><span style="color: #000000">0</span><span style="color: #000000">)){<br /></span><span style="color: #008080">40</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">41</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecnt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #008080">42</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;N;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">){<br /></span><span style="color: #008080">43</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gg[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br /></span><span style="color: #008080">44</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">==</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">&nbsp;:&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /></span><span style="color: #008080">45</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #008080">46</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vt[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">;<br /></span><span style="color: #008080">47</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">48</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;N</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br /></span><span style="color: #008080">49</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">50</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;M;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">){<br /></span><span style="color: #008080">51</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;u&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getnextint();<br /></span><span style="color: #008080">52</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;v&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getnextint();<br /></span><span style="color: #008080">53</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addedge(</span><span style="color: #000000">--</span><span style="color: #000000">u,&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">v);<br /></span><span style="color: #008080">54</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">55</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">56</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pq&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sq&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #008080">57</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que[sq</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #008080">58</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /></span><span style="color: #008080">59</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">60</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(pq&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;sq)&nbsp;{<br /></span><span style="color: #008080">61</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;u&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;que[pq</span><span style="color: #000000">++</span><span style="color: #000000">];<br /></span><span style="color: #008080">62</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;e&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;gg[u];&nbsp;e&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;e&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;edg[e].next)&nbsp;{<br /></span><span style="color: #008080">63</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">yes[edg[e].v])<br /></span><span style="color: #008080">64</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt[edg[e].v]</span><span style="color: #000000">++</span><span style="color: #000000">;<br /></span><span style="color: #008080">65</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">66</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;nt;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;{<br /></span><span style="color: #008080">67</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;nt&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;cnt[vt[i]]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;pq)&nbsp;{<br /></span><span style="color: #008080">68</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yes[vt[i]]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /></span><span style="color: #008080">69</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que[sq</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;vt[i];<br /></span><span style="color: #008080">70</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">nt)&nbsp;<br /></span><span style="color: #008080">71</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vt[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;vt[nt];<br /></span><span style="color: #008080">72</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">73</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">74</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">75</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Case&nbsp;%d:&nbsp;%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">cas,&nbsp;sq</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">);<br /></span><span style="color: #008080">76</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">77</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">78</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #008080">79</span>&nbsp;<span style="color: #000000">}</span></div> <img src ="http://www.cppblog.com/wolf5x/aggbug/153390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf5x/" target="_blank"><A href="mailto:wolf5x1016@gmail.com">wolf5x</A></a> 2011-08-15 03:06 <a href="http://www.cppblog.com/wolf5x/archive/2011/08/15/153390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>srm 514 div1 250 600 900</title><link>http://www.cppblog.com/wolf5x/archive/2011/08/10/152947.html</link><dc:creator>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</dc:creator><author>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</author><pubDate>Wed, 10 Aug 2011 06:30:00 GMT</pubDate><guid>http://www.cppblog.com/wolf5x/archive/2011/08/10/152947.html</guid><wfw:comment>http://www.cppblog.com/wolf5x/comments/152947.html</wfw:comment><comments>http://www.cppblog.com/wolf5x/archive/2011/08/10/152947.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf5x/comments/commentRss/152947.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf5x/services/trackbacks/152947.html</trackback:ping><description><![CDATA[<strong>250pt MagicalGirlLevelOneDivOne</strong><br />某神在(0,0)处, 需要走到(x,y)处(0&lt;x,y&lt;=10^9), 他只能按类似马跳的方式走, 即, 给出一个n, 他可以从(a,b)走到(a-1,b-n) (a+1,b-n) (a-1,b+n) (a+1,b+n) (a-n,b-1) (a+n,b-1) (a-n,b+1) (a+n, b+1) 中的一个.现在给出50个不同的n[1..50], 他可以以任意的n[i]方式走, 每种方式的使用次数不限. 问能否走到目的地(x,y).<br /><br />很明显, 此神可以沿任意方向2步2步的走, 即先走个(+1,-n), 再走个(+1,+n). 所以能否到终点, 只与奇偶性有关.&nbsp;<br />经过一阵分类讨论可知: <br />1) 如果x+y=0(mod 2), 则YES.&nbsp;<br />2) 如果x+y=1(mod 2), 且n[i]中有偶数, 则YES.<br />3) 否则NO.<br /><br />[杂]<br /><br /><strong>600pt MagicalGirlLevelTwoDivOne<br /></strong>给一个H*W(1&lt;=H,W&lt;=50)的矩阵A, 每一位上已经有一个1~9的数字, 或者是个'.', 在'.'处可以填上任意1~9的数字.&nbsp;再给出n和m(1&lt;=n&lt;=min{10,H}, 1&lt;=m&lt;=min{10,W}). 问一共有多少种填'?'的方法, 使得整个矩阵满足:<br />对任意的r和c, 以(r,c)开始的水平方向上连续m个数之和是奇数;<br />对任意的r和c, 以(r,c)开始的垂直方向上连续n个数之和是奇数.<br /><br />首先要注意到一个性质: 对任意r和c有 A[r,c]与A[r+n,c]的奇偶性相同. 很显然, 因为要满足A[r,c]+A[r+1,c]+...+A[r+n-1,c]与A[r+1,c]+...+A[r+n-1,c]+A[r+n,c]的奇偶性相同, 都是奇数. 列上同样有A[r,c]与A[r,c+m]奇偶性相同.<br />因此在一行上, 只用记录n位的奇偶状态, 列上同理. <strong>这样,所有的(r+pn,c+qm)都能合并成同一个点, 且只有两种状态: 奇和偶</strong>. 合并后该点为奇(或偶)的方法数, 等于组成它的所有点方法数之积. 最后整个矩阵合并压缩成一个n*m的矩阵, 就可以用状态DP来搞, 求每行每列之和都为奇的方法数. dp[n][1&lt;&lt;m], 前n行, 每一列和的奇偶性对应bit为0或1. O(1&lt;&lt;m)的转移复杂度, 转移时要注意该行状态1有奇数个.<br /><br />觉得是道很好的题, 状态设计很巧妙...<br /><br />[状态DP 状态压缩设计]<br /><br /><strong>900pt MagicalGirlLevelThreeDivOne<br /></strong>某神给出K(K&lt;=50)个01串, 每个串的长度不超过50. 用这些串组成新的串放到数组A[]里. 如果i&lt;K, 则A[i]为给出的第i个串. 否则A[i] = A[i-1] + A[i-K-1] + A[i-2*K-1] + ... + A[i-p*K-1], 其中p是使i-p*K-1&gt;=0的最大整数. 现在此神给出n, lo, hi, 要你求A[n]的子串A[n][lo...hi]中有多少个连续的1. 0&lt;=n&lt;=10^15, 0&lt;=hi&lt;= min{A[n]的长度, 10^15}, 0&lt;=lo&lt;=hi. 所有计数以0开始.<br /><br />首先随便打个表或者手推一下化简A[i]的递推式, 可以发现当i&gt;=2*K时, A[i] = A[i-1] + (A[i-K-1] + ... A[i-p*K-1]) = <strong>A[i-1] + A[i-K]</strong>, 而K&lt;=50. 所以A[i]的长度关于i是指数增长的, 50log(10^15)可能够用(严格证明不太会, 求指导#.#). <strong>因此其实n&lt;=10^15范围是坑爹的,</strong> hi不会超过A[10^4]的长度. 而这些串的前缀都是一样的, 所以A[n][lo..hi]其实与A[10^4][lo..hi]相同.<br />这样便可直接利用A[i] = A[i-1] + A[i-K]的关系分治. <strong>和用线段树求最长连续1串的思想差不多:</strong> 每个结点的状态变量是(id,lo,hi), 存放A[id][lo..hi]的最优解. 除了存放当前段的最大长度max外, 为了能合并子区间, 还要记录当前区间从左端开始连续1的个数sl, 和从右端开始连续1的个数sr. 剩下的工作与线段树无异,&nbsp;假设要求(id, lo, hi)的(max, sl, sr):<br />对于A[id], 它的左儿子就是A[id-1], 右儿子是A[id-K].<br />1)如果id&lt;2*K, 直接暴力.<br />2)如果lo&gt;=len[id-1](类似于线段树中的查询区间完全落在右儿子), 则递归查询(id-K, lo-len[id-1], hi-len[id-1]).<br />3)如果hi&lt;len[id-1], 则递归查询(id-1, lo, hi).<br />4)否则两个儿子都要查询, 并根据返回的结果求当前区间的结果.<br /><br />分治思想很强大, 用map写的"线段树"很YD, 偶依然蒻爆了.<br /><br />[分治 复杂度分析]<br /><br /><img src ="http://www.cppblog.com/wolf5x/aggbug/152947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf5x/" target="_blank"><A href="mailto:wolf5x1016@gmail.com">wolf5x</A></a> 2011-08-10 14:30 <a href="http://www.cppblog.com/wolf5x/archive/2011/08/10/152947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>srm 513 div1 500 1000</title><link>http://www.cppblog.com/wolf5x/archive/2011/07/30/152078.html</link><dc:creator>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</dc:creator><author>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</author><pubDate>Sat, 30 Jul 2011 03:04:00 GMT</pubDate><guid>http://www.cppblog.com/wolf5x/archive/2011/07/30/152078.html</guid><wfw:comment>http://www.cppblog.com/wolf5x/comments/152078.html</wfw:comment><comments>http://www.cppblog.com/wolf5x/archive/2011/07/30/152078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf5x/comments/commentRss/152078.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf5x/services/trackbacks/152078.html</trackback:ping><description><![CDATA[<strong>500pt Perfect Memory<br /></strong>题意: 某神在M*N(1&lt;=M, N&lt;=50, M*N为偶数)的格子上玩对对碰: 每个格子都有个隐藏的图形. 此神一次行动翻开2个, 如果相同, 就成功消去这2个格子. 如果不相同, 那这2个格子又恢复隐藏状态. 但是此神记忆力很NB, 能记住所有翻开过的格子是什么图形. 还有重要的一点, 他一次行动时, 是先翻开1个格子, 知道它的图形之后, 再决定怎么翻第2个格子, 而不是两个格子同时翻开. 问此神把所有格子都消去, 需要消耗的行动次数的期望.<br /><br />容易想到期望与翻格子的位置无关. 有关的量是: 当前还有多少对图形没被消去. 其中有多少对图形已经知道其中一个的位置了. so, dp[i][j], i为前者, j为后者. 一次行动中, 第1个格子肯定翻之前没翻过的(一共有2i-j个, 记为s), 除非已经知道某1对的位置, 直接把2个都翻出来消掉. 所以转移有几种情况:<br />1) 从s中翻出1个新图形. 从剩下s-1中翻出了相同图形, 消除. 这样的概率是2(i-j)/s * 1/(s-1), 转移到dp[i-1][j].<br />2) 从s中翻出1个新图形. 从剩下s-1中又翻出新图形, 这样就多了2种已知图形. 概率是2(i-j)/s * 2(i-j-1)/(s-1), 转移到dp[i][j+2].<br />3) 从s中翻出1个新图形. 从剩下s-1中翻出了之前j个已知图形中的一个. 这样, 下一次就可以消耗一次行动把那对已知图形消去, 转移到dp[i-1][j], 概率是2(i-j)/s * j/(s-1).<br />4) 从s中翻出1个已知图形. 直接翻出与它配对的消去. 转移到dp[i-1][j-1], 概率是j/s * 1.<br /><br />所以 dp[i][j] = p1*(dp[i-1][j]+1) + p2*(dp[i][j+2]+1) + p3*(dp[i-1][j]+2) + p4*(dp[i-1][j-1]+1). <br />其中2)的条件是i&gt;=j+2, 4)的条件j&gt;=1. 边界dp[i][i] = i. 最后dp[M*N][0]即为所求.<br /><br />[概率 期望 DP]<br /><br /><strong>1000pt Reflections</strong><br />题意: 某神在三维空间中玩一个游戏, 空间中有N个(N&lt;=20)平面, 每个平面都垂直于某个坐标轴, 并且与该坐标轴交于整点. 此神从(0,0,0)处出发, 想去(X,Y,Z)处. 现在他每行动一次可以做如下移动:<br />1) 走到与他相邻的1个整点上, 即(x+1, y, z) (x-1, y, z) (x, y+1, z) (x, y-1, z) (x, y, z+1) (x, y, z-1)中的一个.<br />2) 神一次行动可以利用一个平面, 移动到关于这个平面对称的点处. 每个平面在整个游戏过程中至多只能利用一次.<br />问此神到达终点花费的最少行动次数.<br /><br />易知三个方向是不相关的. 所以只用先考虑一维的情形.<br />首先要想到, 走路和反射交替, 是等效于先反射完了再一口气走到终点的. 因为在反射之前的走动, 不会被反射动作放大. 反射前移动多少步, 经过若干次反射后所到达的位置, 与不移动直接反射到达的位置, 相差正好是移动的步数.<br />所以可以转化为先反射若干次, 再行走到终点. 现在就要推出反射到达的位置公式.<br />假设每个反射轴的坐标依次是x[1], x[2], ..., x[n], 神经过第k次反射后的位置是p[k]. <br />容易推出, p[1] = 2x[1], p[2] = p[1] + 2(x[2]-x[1]) = 2x[2] - 2x[1], ... p[k] = 2x[k]-2x[k-1]+2x[k-2]-...+2*(-1)^(k-1)x[1].<br />这是很规则的正负交替求和, 正项数等于负项数, 或者比负项数多1. <br />到此问题转化得很清晰了: 在20个数中选出k个数作为正项, k(或k-1)个数作为负项, 每个数至多被选1次. 该方案的总行动次数是选出的个数(即做反射的总次数), 加上这些项之和到终点的距离(即最后一路走过去).&nbsp; <br />选数要降低复杂度, 可以把20个数分成两个集合, 每边10个数, 先各自生成2^10个和. 两边分别排序后, 从小到大枚举左边的, 记一个指针从大到小扫右边的. <br /><br />[数学 分治]<img src ="http://www.cppblog.com/wolf5x/aggbug/152078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf5x/" target="_blank"><A href="mailto:wolf5x1016@gmail.com">wolf5x</A></a> 2011-07-30 11:04 <a href="http://www.cppblog.com/wolf5x/archive/2011/07/30/152078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有向有环图的最小路径覆盖</title><link>http://www.cppblog.com/wolf5x/archive/2011/07/19/151422.html</link><dc:creator>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</dc:creator><author>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</author><pubDate>Tue, 19 Jul 2011 14:42:00 GMT</pubDate><guid>http://www.cppblog.com/wolf5x/archive/2011/07/19/151422.html</guid><wfw:comment>http://www.cppblog.com/wolf5x/comments/151422.html</wfw:comment><comments>http://www.cppblog.com/wolf5x/archive/2011/07/19/151422.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf5x/comments/commentRss/151422.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf5x/services/trackbacks/151422.html</trackback:ping><description><![CDATA[本文纯属YY……<br /><br />今天多校联合训练三的C题，<a title="http://acm.hdu.edu.cn/showproblem.php?pid=3861" href="http://acm.hdu.edu.cn/showproblem.php?pid=3861">http://acm.hdu.edu.cn/showproblem.php?pid=3861</a>，题意归结起来是在一个有向图中求最小路径覆盖，也就是用尽量少的链去覆盖整个图，每个顶点必须属于且只能属于一条链。但是题意并未说明原图无环。标程解法是强连通分量缩点，再求有向无环图的最小路径覆盖。反例是：1-&gt;2,2-&gt;3,4-&gt;5,5-&gt;6,2-&gt;5,5-&gt;2。正解是2，123一组，456一组。<br /><br />因为是要求路径数最小，所以YY了一个上下界最小流的做法。构图是将原来的点A0拆成两个，A和A'。从A到A'连一条边，下界和上界都为1。所有原来A0的出边，都从A'出去，下界0，上界1.所有原来A0的入边，都指向A。新建一个源点S，一个汇点T。从S到每个点A连一条边，下界0，上界1。从每个A'到T连一条边，下界0，上界1。<br /><br />对这个新图求最小流，即为原题所求。<br /><br />YY的证明：<br />A-&gt;A'，限制了这个点必须经过一次。这条边上的流量有两个来源：其它的点B'，或者源点S，前者说明A和B在同一条链中，B是A的前驱，后者说明A是链的起点。同样，这个流量有两个去处：其它的点C'，或者汇点T，前者说明A和C在同一条链中，C是A的后继，后者说明A是链的终点。<br /><br />到达汇的每1单位流量，意味着一条链的终结。所以最小流就能让链数最少。<br /><br />YY完毕，欢迎开炮……<br /><br /><br /><b>ps. 理论上说，以上方法肯定是错的。要不然求Hamiltion通路就不是NP了＠。＠</b><br /><img src ="http://www.cppblog.com/wolf5x/aggbug/151422.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf5x/" target="_blank"><A href="mailto:wolf5x1016@gmail.com">wolf5x</A></a> 2011-07-19 22:42 <a href="http://www.cppblog.com/wolf5x/archive/2011/07/19/151422.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>srm 511 div1 500 1000</title><link>http://www.cppblog.com/wolf5x/archive/2011/07/03/150023.html</link><dc:creator>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</dc:creator><author>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</author><pubDate>Sat, 02 Jul 2011 19:48:00 GMT</pubDate><guid>http://www.cppblog.com/wolf5x/archive/2011/07/03/150023.html</guid><wfw:comment>http://www.cppblog.com/wolf5x/comments/150023.html</wfw:comment><comments>http://www.cppblog.com/wolf5x/archive/2011/07/03/150023.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf5x/comments/commentRss/150023.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf5x/services/trackbacks/150023.html</trackback:ping><description><![CDATA[<strong>500pt FiveHundredEleven</strong>
		<br />给出N(N&lt;=50)个不小于0且不大于511的整数. 开始时寄存器为0, 两人轮流选取一个数, 与寄存器的值OR, 把结果覆盖写入寄存器. 数不能重复使用. 如果某人操作之后寄存器的值为511, 或者轮到某人时数都取完了, 那么这个人就算负. 问先手是否有必胜策略.<br />容易想到2^9这一维, 记录当前每一位的0/1状态. 实际上, 不需要记录当前已经选过哪些数, 而只用记录已经选了几个数, 再由当前的0/1态, 就能推算出哪些数没选过. 有些数x满足x|now != x, 这些数肯定没选过. 而对那些x|now == x的数, 不必知道它具体的值, 因为它对后续操作的影响都一样, 就是延缓一步, 把局面原封不动地丢给对方. 所以只需知道当前还有多少个这样的x没被使用过, 这个值也能由上面的信息得到. <br />这样就是一个类似极大极小的必胜必败态记忆化搜索. <br />状态为dp[1&lt;&lt;9][N], 转移为N.<br /><br />[状态DP]<br /><br /><strong>1000pt GameOfLifeDivOne</strong><br />一个长为N(N&lt;=50)的串(环状, 首尾相连, 即x[N-1]与x[0]相连), 由'0', '1' 和'?'组成, 其中'?' 处可以填上'0'或'1'. 从T=0开始, 每过1单位时间, 整个串会更新一次: 某一位, 如果上一时刻, 它, 以及与它相邻的两位, 一共有至少2个'1', 那么这一时刻它变成'1', 否则它变成'0'. 问共有多少种填'?'的方法, 使得在经过T(T&lt;=1000)时间后, 还有不少于K(K&lt;=N)个'1'. 比如'101010'-&gt;'010101'-&gt;'101010'-&gt;...; '11010'-&gt;'11101'-&gt;'11111'-&gt;...<br /><br />首先容易观察到, 两个或两个以上连续相同的位是永远不会变的. 只有01交替的子串才会发生变化. 所以任意一个串都可以看成是若干个形如 xpy的子串首尾连接而成, 而且两串的首尾要相同才能连起来, 就像[xp1y][yp2x][xp3x][xp4y].... 其中pk是01交替序列, x和y都是一位, 可能是'0'或'1'. 特别的,连续3个相同字符可以看成是xx和xx粘起来(有1位重叠). 对于一个首尾字符固定不变的01交替串, 它在T时间后有多少个'1'是很容易算的. 两头都是0的话, 如0101010-&gt;0010100-&gt;0001000, 每时间减少一个1; 两头都是1的话类似, 每时间增加一个1. 一头是0一头1, 则0和1的个数都不变, 如010101-&gt;001011-&gt;000111.&nbsp;<br />这样就有个算法的雏形, 类似背包: dp[pos][bit][one]表示: 从0到pos-1的子段, 以bit结尾, 且T时间后包含one个1的方法数. 如果从pos到某一位pos2-1, 能构造出以bit起始, 以bit2结束的交替串, 那么从状态dp[pos][bit][one]就能扩展到dp[pos2][bit2][one+one2], 则把前者加到后者上去, 其中one2是pos到pos2-1这个子串T时间后1的个数. 把原始串复制两遍, 就能比较方便地处理环.&nbsp;<br />枚举在原串中首次出现连续2个相同字符的位置startpos, 对每个startpos做一次上述DP. 把所有one&gt;=K的方法数加起来即可. 此外要先预处理出任意edg[i][b1][j][b2], 即从i到j-1能否构造出以b1开始, b2结尾的交替串, 如果能, T时间后有多少个'1'.&nbsp;<br />其实整个题就是一道背包DP, 求用若干个短棍子, 拼出一个权值&gt;=K的长棍子的方法数. 只是模型隐藏得很巧妙. orz...<br /><br />[背包DP]<br /><br /><img src ="http://www.cppblog.com/wolf5x/aggbug/150023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf5x/" target="_blank"><A href="mailto:wolf5x1016@gmail.com">wolf5x</A></a> 2011-07-03 03:48 <a href="http://www.cppblog.com/wolf5x/archive/2011/07/03/150023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>srm 507 div1 250 500 900</title><link>http://www.cppblog.com/wolf5x/archive/2011/06/01/147803.html</link><dc:creator>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</dc:creator><author>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</author><pubDate>Tue, 31 May 2011 16:04:00 GMT</pubDate><guid>http://www.cppblog.com/wolf5x/archive/2011/06/01/147803.html</guid><wfw:comment>http://www.cppblog.com/wolf5x/comments/147803.html</wfw:comment><comments>http://www.cppblog.com/wolf5x/archive/2011/06/01/147803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf5x/comments/commentRss/147803.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf5x/services/trackbacks/147803.html</trackback:ping><description><![CDATA[<strong>250p CubeStickers</strong>
		<br />给出若干个方形木板，每个木板有一种颜色。现在要选出其中6个，围出一个立方体。问是否可能使转出的立方体，任意两个相邻的面颜色不同。<br />直接按木板的总数分情况讨论就可以，但是我漏想了一种情况@.@<br />其实显然，同一种颜色最多能用两次，所以统计每种木板能用的个数之和,sigma(min(count[i],2))，和不小于6则可行。<br /><br /><strong>500p CubePacking</strong><br />给出Ns个边长为1的立方体和Nb个边长为L(2&lt;=L&lt;=10）的立方体。要找一个体积最小的长方体，使得可以把所有立方体堆进去。保证结果不超int32。<br />正是因为不超int32，所以可以直接枚举两条棱x,y，算第3条z的最小值。枚举时循环条件 x*x*x &lt;= INF, x*y*y &lt;= INF。计算z的最小值时要注意除法要向上取整，而且判断能否把边长为L的立方体都放进去的条件是(x/L)*(y/L)*(z/L) &gt;= Nb，如果z小了，要加到足够大为止。<br />[枚举]<br /><br /><strong>900p CubeBuilding</strong><br />大小相同的红、绿、蓝色的立方体，分别给R、G、B个(R,G,B&lt;=25)。把这些立方体全部搭积木一样的堆到N*N(N&lt;=25)的格子棋盘中。可以在任意格子中堆任意高的立方体。规定一种方案是合法的，如果从北向南看的侧视图中只有一种颜色。问一共有多少种堆砌的方案。<br />可以先考虑N*1的棋盘，也就是侧视图中棋盘宽度是1。先考虑没有颜色的方块怎么放，再去染色。这样不管怎么堆，<strong>看到的方块数总是等于所有格子堆的最大高度，则需要固定颜色的方块数就为这个高度，</strong>剩下的方块可以任意染色。同理N*N的棋盘，需要固定颜色的方块数等于所有列中需要固定的数量之和。要求的答案就是，先枚举固定方块的数目，把它们染某一种颜色，剩下的方块可以用组合数直接算出有多少种染色方案，乘起来，最后求和。<br />关键就是要求出每一种固定方块数目的前提下，不考虑颜色，有多少种堆放方法。<br />由前面的讨论知道，可以先在N*1的棋盘上按行扩展，需要记录的状态是当前已使用的方块数，当前的最大高度。<br />然后利用这个结果按列扩展，记录的状态是当前已使用的方块数，当前已固定的方块数。<br />ps.染色之前的方案数只用求一次，之后分别把固定的方块染成3种不同颜色，只要用组合数分别算3次，加起来就行了。<br />O(9*N^5)的算法，时限有点紧。<br />[DP]<img src ="http://www.cppblog.com/wolf5x/aggbug/147803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf5x/" target="_blank"><A href="mailto:wolf5x1016@gmail.com">wolf5x</A></a> 2011-06-01 00:04 <a href="http://www.cppblog.com/wolf5x/archive/2011/06/01/147803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>srm 506 div1 500</title><link>http://www.cppblog.com/wolf5x/archive/2011/05/12/146244.html</link><dc:creator>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</dc:creator><author>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</author><pubDate>Thu, 12 May 2011 03:22:00 GMT</pubDate><guid>http://www.cppblog.com/wolf5x/archive/2011/05/12/146244.html</guid><wfw:comment>http://www.cppblog.com/wolf5x/comments/146244.html</wfw:comment><comments>http://www.cppblog.com/wolf5x/archive/2011/05/12/146244.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf5x/comments/commentRss/146244.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf5x/services/trackbacks/146244.html</trackback:ping><description><![CDATA[500pt
<br />
50个点的地图，从0开始按照顺序访问一系列点（不超过50个），访问顺序给出，一个点可能访问多次。某些点停着若干辆汽车。可以走路，也可以开车。开车的速度比走路快。但是限定一辆汽车只能使用一次，也就是下车后这辆车就作废。问按要求访问完所有点的最短总耗时。

先floyd求每对点之间走路时间和开车时间。对于访问顺序中的每一步，使用每辆车都有个节省的时间。这就相当于建个二分图，左边x是访问顺序中的每一步，右边y是每一辆车。xi与yj的边权就是第i步使用第j辆车能节省的时间。

最后结果就是总的走路时间减去最大权匹配。<br /><br />[floyd最短路 二分图最大权匹配]<img src ="http://www.cppblog.com/wolf5x/aggbug/146244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf5x/" target="_blank"><A href="mailto:wolf5x1016@gmail.com">wolf5x</A></a> 2011-05-12 11:22 <a href="http://www.cppblog.com/wolf5x/archive/2011/05/12/146244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>srm 469 div1 250 500 1000</title><link>http://www.cppblog.com/wolf5x/archive/2010/05/29/116685.html</link><dc:creator>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</dc:creator><author>&lt;A href="mailto:wolf5x1016@gmail.com"&gt;wolf5x&lt;/A&gt;</author><pubDate>Sat, 29 May 2010 06:40:00 GMT</pubDate><guid>http://www.cppblog.com/wolf5x/archive/2010/05/29/116685.html</guid><wfw:comment>http://www.cppblog.com/wolf5x/comments/116685.html</wfw:comment><comments>http://www.cppblog.com/wolf5x/archive/2010/05/29/116685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wolf5x/comments/commentRss/116685.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wolf5x/services/trackbacks/116685.html</trackback:ping><description><![CDATA[<span style="font-weight: bold;">250p TheMoviesLevelOneDivOne</span>
		<br />电影院有n行m列的座位, 有一些已经被预订了. 求在剩下的座位中, 选出同行且相邻的两个座位的方案数.<br />可以按行列将已预订的座位排序, 然后顺便扫一遍, 算出相邻两个被预订座位之间的方案数. 最后累加.<br />也可以用个set记录不能使用的方案, 再用没有预订座位的情况下的总方案数减去之.<br /><br /><span style="font-weight: bold;">500p TheMoviesLevelTwoDivOne</span><br />若干部电影, 每部电影有一个加血的时间点. 人看电影, 每看一分钟掉一点血. 血掉到0就结束. 问怎样按排顺序使看的电影部数最多. 如果总部数相同, 取字典序最小的解输出.<br />只有20部电影, 状态DP即可.<br />为保证字典序, 可以从后往前DP, 这样每次转移时新加入的电影都是当前最先看的, 保证它先择的是最小的, 即能保证字典序最小.<br /><br />[DP]<br /><br /><span style="font-weight: bold;">1000p TheMoviesLevelThreeDivOne</span><br />若干部电影, A和B两人看每部电影的时间分别是A[i], B[i]. 初始安排, 要依次把第1,2,..,n部电影放入A或B的待看队列的队尾. A和B各自开始看自己队列中的电影, 看完一部后, 如果这是另一个人没看过的, 就加入它的队列中. 如果期间某人列队空了, 那么他就结束, 再也不看新电影了. 问有多少种初始安排方法, 能使A和B都能看完所有电影.<br />首先肯定不会出现一种安排使得A和B都卡. 因为A卡肯定发生在A看完他所有的电影之后, 且此时B没看完自己的, 所以B肯定不会卡.<br />这样就可以用总方案数2^N分别减去A卡的和B卡的方案数. 考虑A卡的情况. 假设A那一整坨东西的时长是sumA, B的第一个东西是tb1, 则A卡的条件是 sumA-tb1&lt;0. 否则B看完tb1后把ta1加在sumA后面, 这时卡的条件是(sumA+ta1)-(tb1+tb2)&lt;0. 依此, 如果在这过程中任意一次卡的条件符合, 那么后续怎么安排都是卡的. 于是用一维状态记录目前为止出现过的最小的X-Y, min, 还要一维记录当前的X-Y, cur, 以转移用. 转移时, 如果把当前电影放进A, 那么min和cur都增加A[i], 因为sumA增加了. 如果放进B, 那么用cur和B[i]来计算新的cur和min. <br />hint. cur=当前所有电影的A[i]的和-B中电影的B[i]的和, 新的min=除了新放的电影外所有放过的电影的A[i]的和-包括新电影在内的B中电影的B[i]的和.<br /><br />ps. 1000的DP都很YD啊...<br /><br />[DP]<br /><img src ="http://www.cppblog.com/wolf5x/aggbug/116685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wolf5x/" target="_blank"><A href="mailto:wolf5x1016@gmail.com">wolf5x</A></a> 2010-05-29 14:40 <a href="http://www.cppblog.com/wolf5x/archive/2010/05/29/116685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>