﻿<?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++博客-Mato is No.1-随笔分类-经典问题的模型</title><link>http://www.cppblog.com/MatoNo1/category/16329.html</link><description>Mato是一只超级大沙茶……但他一直以来都想成为各项比赛都No.1的神犇……</description><language>zh-cn</language><lastBuildDate>Mon, 07 Apr 2014 04:19:04 GMT</lastBuildDate><pubDate>Mon, 07 Apr 2014 04:19:04 GMT</pubDate><ttl>60</ttl><item><title>关于树分治的问题</title><link>http://www.cppblog.com/MatoNo1/archive/2013/08/31/202905.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 31 Aug 2013 15:39:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2013/08/31/202905.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/202905.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2013/08/31/202905.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/202905.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/202905.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: （从NOI以后一直在各网站上做水题&#8230;&#8230;谁叫我这么弱做不动难题呢&#8230;&#8230;）（最近实在感觉到弱得令人吃惊&#8230;&#8230;这样下去还混什么集训队啊&#8230;&#8230;于是只好去挑难题了&#8230;&#8230;中间对某些知识点有一些见解&#8230;&#8230;就总结在这里了囧&#8230;&#8230;）（最近见到了比较多的树分治的题...&nbsp;&nbsp;<a href='http://www.cppblog.com/MatoNo1/archive/2013/08/31/202905.html'>阅读全文</a><img src ="http://www.cppblog.com/MatoNo1/aggbug/202905.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2013-08-31 23:39 <a href="http://www.cppblog.com/MatoNo1/archive/2013/08/31/202905.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【AHOI2013复仇】二维DP优化的几道题总结</title><link>http://www.cppblog.com/MatoNo1/archive/2013/03/03/198185.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sun, 03 Mar 2013 07:25:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2013/03/03/198185.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/198185.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2013/03/03/198185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/198185.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/198185.html</trackback:ping><description><![CDATA[<div>【1】<a title="BZOJ1713" href="http://www.lydsy.com/JudgeOnline/problem.php?id=1713">BZOJ1713<br /></a>F[i][j]=max{F[i1][j1] - (sA[i-1]-sA[i1])<sup>2</sup> - (sB[j-1]-sB[j1])<sup>2</sup>} + A[i]*B[j], 0&lt;=i1&lt;i, 0&lt;=j1&lt;j<br />对这个式子进行化简：<br />F[i][j]=max{F[i1][j1] - sA[i1]<sup>2</sup> + 2*sA[i-1]*sA[i1] - sB[j1]<sup>2</sup> + 2*sB[j-1]*sB[j1]}+A[i]*B[j]-sA[i-1]<sup>2</sup>-sB[j-1]<sup>2</sup><br />对于一维的情况，很容易处理&#8212;&#8212;中间就是一条直线，然而这是二维的，对于这种2D/2D的DP方程，要优化到O(N<sup>2</sup>)级别，需要两步。<br />注意到决策式中除了F[i1][j1]外，其它部分都要么只与i1有关，要么只与j1有关。因此，可以把阶段i的各个状态作为一个整体，在之前得出的各个F[i][j]中，对于相同的j，找到对于目前的i，最优的那个决策&#8212;&#8212;注意，对于相同的j1，里面所有与j1有关的东西都可以先不考虑了，只考虑(F[i1][j1] - sA[i1]<sup>2</sup> + 2*sA[i-1]*sA[i1])对于目前i的最优决策。这一步可以在这些直线形成的上凸壳中找到，且满足决策单调性，可以用一个栈处理（斜率优化）。然后，将这些最优决策以j为自变量再组成一些直线，用栈维护它们的上凸壳，对于每个j，找到最优值即可。<br />注意事项：在栈中删除直线的时候，如果之前的最优决策是这个被删掉的直线，则要将最优决策先置为不存在，然后再插入新直线后设为新直线。另外，要特别注意平行的情况。<br /><br />【2】LCIS<br />经典问题，利用上面的分步优化思想，很容易用线段树得到一个O(N<sup>2</sup>logN)的做法。<br /><br />【3】<a title="[SCOI2010]股票交易 " href="http://www.lydsy.com/JudgeOnline/problem.php?id=1855">[SCOI2010]股票交易</a><br />F[i][j]=max{F[i-1][j], max{F[i-W-1][j-a]-A*a, F[i-W-1][j+b]+b*B}}, j&lt;=maxP, 1&lt;=a&lt;=maxA, 1&lt;=b&lt;=maxB<br />注意对于相同的j，计算方法是一样的，且是一条直线（由于有范围所以其实是线段）。<br />所以，计算阶段i时，可以将(i-W-1)阶段所有的决策当成线段插入，这些线段的斜率都相等，因此比较好维护，只需要判断边界即可。<br /><br />注意，NOI2011的show虽然也符合对于相同的j计算方法一样，但它就不能优化，因为它的决策是不连续且无规律的，没有任何几何性质。因此，它只能用O(N<sup>3</sup>)的算法计算出所有状态。<br /><a title="[SCOI2010]股票交易 " href="http://www.lydsy.com/JudgeOnline/problem.php?id=1855"> </a></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/198185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2013-03-03 15:25 <a href="http://www.cppblog.com/MatoNo1/archive/2013/03/03/198185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【AHOI2013复仇】动态凸包</title><link>http://www.cppblog.com/MatoNo1/archive/2013/02/28/198024.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Thu, 28 Feb 2013 10:29:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2013/02/28/198024.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/198024.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2013/02/28/198024.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/198024.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/198024.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原题地址写了几天终于写出来了&#8230;&#8230;（显然，我太弱了，请各位神犇不要鄙视）在有加点的情况下，动态地维护凸包，有以下两种方法：&lt;1&gt;维护上、下凸壳（本沙茶采用的方法）：凸包可以拆成上、下凸壳，对它们分别维护。两个凸壳均按照下面定义的&lt;关系（即先x增、再y增）排序，注意，两个凸壳的两端是相同的，均为整个凸包的最小点与最大点，除两端外，它们没有公共定点。以上凸壳为例...&nbsp;&nbsp;<a href='http://www.cppblog.com/MatoNo1/archive/2013/02/28/198024.html'>阅读全文</a><img src ="http://www.cppblog.com/MatoNo1/aggbug/198024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2013-02-28 18:29 <a href="http://www.cppblog.com/MatoNo1/archive/2013/02/28/198024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【AHOI2013复仇】向JZPKIL认输了</title><link>http://www.cppblog.com/MatoNo1/archive/2013/02/06/197761.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Wed, 06 Feb 2013 15:26:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2013/02/06/197761.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/197761.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2013/02/06/197761.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/197761.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/197761.html</trackback:ping><description><![CDATA[RT，<br />今天又优化了一下JZPKIL，用上了各种无耻的手段，仍然无法干掉后两个点，并且BZOJ上的总时间50s也无法实现（后两个点一个就要20s），<br />看来基于组合数的做法由于要枚举因数，确实不行&#8230;&#8230;<br />（注：后两个点是人工构造的猥琐数据，所有的N都是若干个小质数之积，因数个数都上千，有的甚至上万&#8230;&#8230;）<br /><br />认输了&#8230;&#8230;<br />Orz @sevenk<img src ="http://www.cppblog.com/MatoNo1/aggbug/197761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2013-02-06 23:26 <a href="http://www.cppblog.com/MatoNo1/archive/2013/02/06/197761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【AHOI2013复仇】s-t第K短简单路问题</title><link>http://www.cppblog.com/MatoNo1/archive/2012/09/23/191705.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sun, 23 Sep 2012 06:28:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/09/23/191705.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/191705.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/09/23/191705.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/191705.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/191705.html</trackback:ping><description><![CDATA[<div><a title="[SCOI2007 kshort]" href="http://www.lydsy.com/JudgeOnline/problem.php?id=1073">[SCOI2007 kshort]</a><br />求图的s-t第K短简单路问题，若有长度相同的，字典序小的优先。<br /><br />首先，由于是简单路，所以<a title="A*" href="http://www.cppblog.com/MatoNo1/archive/2011/05/01/145456.html">A*</a>是不能做的，因为有可能有两条s-i（i为某个中间点）路P1和P2，P1比P2短，但由于P1到达的顶点与P2不同，导致最终沿P1到达t的路径长度长于沿P2到达t的（甚至有可能沿P1根本到不了t）。然后，如果直接用DFS，由于要求的是第K优解，而不是最优解，所以不能使用最优性剪枝（包括分支限界），因此专门为最优性剪枝服务的&#8220;改变搜索顺序&#8221;技巧也不能使用了，因此，能够使用的只有可行性剪枝，而本题的数据范围使得这种算法必然TLE。<br /><br />正解是一种由迭代加深思想扩展得到的&#8220;<span style="color: red"><strong>迭代变优</strong></span>&#8221;DFS。设置一个路径长度上限Z，搜索s到t的所有简单路，在搜索过程中，遇到长度大于Z的路径就停止（剪枝），然后，若得到路径不足K条，则增加Z的值，重新开始搜索，直到得到的路径总数大于等于K条为止。这里可以进行启发式的优化，设g[i]为点i到t的最短路长度，则搜索过程中，假设目前搜到点i，则（目前路径长度+g[i]）是对整条路径最短长度的乐观估计，如果这个值超过了Z，就可以剪枝，但在剪枝之前要记下这个超过了Z的启发值，取其中最小的作为下一次迭代的Z值。那么对于字典序肿么办？可以在搜索过程中，强制先搜编号小的结点，这样得到的s-t路径必然是字典序递增的。另外只要求出第K条路径，搜索就可以终止，因为容易证明，题目要求的第K短的路径一定已经求出来了（只不过不一定是最后一条而已），找到即可。此外，在搜索过程中不要忘了可行性剪枝，就是如果沿目前搜到的路径已经到不了t了，剪枝。<br /><br />&#8220;迭代变优&#8221;DFS，就是设置一个解的评价值的上限（最小值）或下限（最大值），在搜索过程中，如果实际评价值（或者启发值，如果可以加启发式优化的话）越过这个限制，则剪枝。在一次搜索后，如果没有得到符合要求的解，就将该限制值<span style="color: red"><strong>设为本次搜索过程中越界&#8220;越&#8221;得最近的那个值</strong></span>，重新开始搜索，直到找到所需要的解或者<span style="color: red"><strong>发现无解</strong></span>（如果一次搜索中没有发生越界，却仍然没有找到解）为止。其应用主要体现在两个方面：（1）搜索树过深甚至无限深，但所需求的那个解却不深的情况；（2）求第K优解的情况。<br /><br />代码： 
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">algorithm</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></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: #0000ff">#define</span><span style="color: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=1;&nbsp;i&lt;=n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re2(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re3(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;=r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n-1;&nbsp;i&gt;=0;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n;&nbsp;i&gt;0;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre2(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r-1;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre3(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000"><br /></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">51</span><span style="color: #000000">,&nbsp;MAXK&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">201</span><span style="color: #000000">,&nbsp;MAXM&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3000</span><span style="color: #000000">,&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;edge&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;b,&nbsp;w,&nbsp;pre,&nbsp;next;<br />}&nbsp;E[MAXM&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;MAXN],&nbsp;E0[MAXM&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;MAXN];<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;edge0&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;b,&nbsp;w;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">operator</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;(edge0&nbsp;e0)&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;{</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;b&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;e0.b;}<br />}&nbsp;_E[MAXM];<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,&nbsp;m,&nbsp;s,&nbsp;t,&nbsp;K,&nbsp;dist[MAXN],&nbsp;Q[MAXN&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Z,&nbsp;Z0,&nbsp;vst0[MAXN],&nbsp;_FL,&nbsp;len0,&nbsp;X00[MAXN],&nbsp;No,&nbsp;len[MAXK],&nbsp;X0[MAXK][MAXN],&nbsp;sum0[MAXK],&nbsp;reslen,&nbsp;res[MAXN];<br /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;vst[MAXN],&nbsp;res_ex&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: #0000ff">void</span><span style="color: #000000">&nbsp;init_d()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;E[i].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[i].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[i].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[i].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;add_edge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;w)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;E[m].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;E[m].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;E[m].w&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;w;&nbsp;E[m].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[a].pre;&nbsp;E[m].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;E[a].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;&nbsp;E[E[m].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;<br />&nbsp;&nbsp;&nbsp;&nbsp;E0[m].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;E0[m].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;E0[m].w&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;w;&nbsp;E0[m].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[b].pre;&nbsp;E0[m].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;E0[b].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;&nbsp;E0[E0[m].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m</span><span style="color: #000000">++</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m0;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d%d%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">m0,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">K,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">s,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">t);&nbsp;init_d();&nbsp;s</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;t</span><span style="color: #000000">--</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m0)&nbsp;{scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">_E[i].a,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">_E[i].b,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">_E[i].w);&nbsp;_E[i].a</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;_E[i].b</span><span style="color: #000000">--</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;sort(_E,&nbsp;_E&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;m0);<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m0)&nbsp;add_edge(_E[i].a,&nbsp;_E[i].b,&nbsp;_E[i].w);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;prepare()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;{vst[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;dist[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;INF;}&nbsp;vst[t]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;dist[t]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;Q[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;t;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;y,&nbsp;d0,&nbsp;d1;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;front</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;rear</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">(</span><span style="color: #000000">!</span><span style="color: #000000">front&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;rear</span><span style="color: #000000">==</span><span style="color: #000000">n&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;front</span><span style="color: #000000">==</span><span style="color: #000000">rear</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;front</span><span style="color: #000000">==</span><span style="color: #000000">n&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;front</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;:&nbsp;front</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Q[front];&nbsp;d0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;dist[x];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E0[x].next;&nbsp;p&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;x;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E0[p].next)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[p].b;&nbsp;d1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;d0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;E0[p].w;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(d1&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;dist[y])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist[y]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;d1;<br />&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">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">vst[y])&nbsp;{vst[y]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;Q[rear</span><span style="color: #000000">==</span><span style="color: #000000">n&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;rear</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;:&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">rear]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;y;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vst[x]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;dfs(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sum)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(x&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;t)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(sum&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;Z)&nbsp;{sum0[No]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sum;&nbsp;len[No]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;len0;&nbsp;re(i,&nbsp;len0)&nbsp;X0[No][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;X00[i];&nbsp;No</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(No&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;K)&nbsp;res_ex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(sum&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;Z0)&nbsp;Z0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sum;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;h0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sum&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;dist[x];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(h0&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;Z)&nbsp;{</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(h0&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;Z0)&nbsp;Z0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;h0;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vst0[x]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">_FL;&nbsp;Q[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_x,&nbsp;_y;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;front</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;rear</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;front</span><span style="color: #000000">&lt;=</span><span style="color: #000000">rear;&nbsp;front</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Q[front];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E[_x].next;&nbsp;p&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;_x;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E[p].next)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[p].b;<br />&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">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">vst[_y]&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;vst0[_y]&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;_FL)&nbsp;{vst0[_y]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_FL;&nbsp;Q[</span><span style="color: #000000">++</span><span style="color: #000000">rear]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_y;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(vst0[t]&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;_FL)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E[x].next;&nbsp;p&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;x;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E[p].next)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[p].b;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">vst[_y])&nbsp;{vst[_y]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;X00[len0</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_y;&nbsp;dfs(_y,&nbsp;sum&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;E[p].w);&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(res_ex)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{len0</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;vst[_y]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;}}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;solve()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;dist[s];&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;No0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;_FL&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Z0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;INF;&nbsp;No&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;re(i,&nbsp;n)&nbsp;{vst[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;vst0[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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vst[s]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;len0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;X00[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s;&nbsp;dfs(s,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(res_ex)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;No0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;K&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;No0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;K)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(sum0[i]&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;Z)&nbsp;{No0</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">No0)&nbsp;{reslen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;len[i];&nbsp;re(j,&nbsp;len[i])&nbsp;res[j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;X0[i][j];}}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(Z0&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;INF)&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{No0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;No;&nbsp;Z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Z0;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;pri()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(res_ex)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;res[</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: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re2(i,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;reslen)&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">-%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;res[i]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts(</span><span style="color: #000000">""</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;puts(</span><span style="color: #000000">"</span><span style="color: #000000">No</span><span style="color: #000000">"</span><span style="color: #000000">);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;init();<br />&nbsp;&nbsp;&nbsp;&nbsp;prepare();<br />&nbsp;&nbsp;&nbsp;&nbsp;solve();<br />&nbsp;&nbsp;&nbsp;&nbsp;pri();<br />&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 />}<br /><br /></span></div><br /></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/191705.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2012-09-23 14:28 <a href="http://www.cppblog.com/MatoNo1/archive/2012/09/23/191705.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【AHOI2013复仇】两道LIS模型题总结</title><link>http://www.cppblog.com/MatoNo1/archive/2012/09/08/189969.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 08 Sep 2012 12:40:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/09/08/189969.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/189969.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/09/08/189969.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/189969.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/189969.html</trackback:ping><description><![CDATA[最近做了两道LIS模型题，感觉到模型比较好，总结一下囧。<br />【1】<a title="[HAOI2007]上升序列&#13;&#10;" href="http://www.lydsy.com/JudgeOnline/problem.php?id=1046">[HAOI2007]上升序列 </a><br />预处理：设F[i]为以i开头的最长上升序列的长度，怎么求不用说了吧囧&#8230;&#8230;<br />假设目前需要求长度为M的、标号字典序最小的上升序列，显然其第一个元素A[i]必须满足F[i]&gt;=M（注意，不是等于，是大于等于！），找到满足这个条件的最小的i即可。然后，设目前已经求出了该序列的第x个元素为A[y]，则第(x+1)个元素A[z]需要满足的条件是A[z]&gt;A[y]，且F[z]=F[y]-1，找到满足这个条件的最小的z即为该序列的第(x+1)个元素。按照这种方法，扫描一遍就可以求出整个序列，时间复杂度为O(N)。如果整个序列的最长上升序列长度&lt;M，则无解。<br /><br />代码： 
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></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: #0000ff">#define</span><span style="color: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=1;&nbsp;i&lt;=n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re2(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re3(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;=r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n-1;&nbsp;i&gt;=0;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n;&nbsp;i&gt;0;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre2(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r-1;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre3(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;ll&nbsp;long&nbsp;long</span><span style="color: #000000"><br /></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">,&nbsp;&nbsp;&nbsp;&nbsp;MAXM&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1010</span><span style="color: #000000">,&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,&nbsp;m,&nbsp;len,&nbsp;A[MAXN],&nbsp;F[MAXN],&nbsp;D[MAXN],&nbsp;res[MAXM];<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;prepare()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;D[len&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;INF;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;r,&nbsp;mid;<br />&nbsp;&nbsp;&nbsp;&nbsp;rre(i,&nbsp;n)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(A[i]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;D[len])&nbsp;D[F[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">len]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;A[i];&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(l&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;r)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(A[i]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;D[mid])&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;D[l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;A[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;solve()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;y;<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(F[i]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;m)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;A[i];&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re2(j,&nbsp;i</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;n)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(F[j]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;A[j]&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;res[y&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">])&nbsp;{res[y</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;A[j];&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(y&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;m)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;x</span><span style="color: #000000">--</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%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;re(i,&nbsp;n)&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">A[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;prepare();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m_s;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">m_s);<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m_s)&nbsp;{scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">m);&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;len)&nbsp;puts(</span><span style="color: #000000">"</span><span style="color: #000000">Impossible</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{solve();&nbsp;re(j,&nbsp;m</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;res[j]);&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;res[m&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]);}}<br />&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 />}<br /><br /></span></div><br />【2】<a title="[HAOI2006]数字序列&#13;&#10;" href="http://www.lydsy.com/JudgeOnline/problem.php?id=1049">[HAOI2006]数字序列 </a><br />首先，由于序列的所有元素都是整数，所以可以将原序列的所有元素减去它的下标，这样就把上升序列转化为不下降序列了。<br />第一问的结果显然就是(N-新序列的最长不下降序列长度)。关键在于第二问。以下A均表示新序列。<br />设F[i]为以A[i]结尾的最长不下降序列长度（同样，求法不用说了），G[i]为在A[i]不修改的前提下将A[0..i]转变为不下降序列的最小修改量。首先求出F[i]，然后在求G[i]时，枚举上一个&#8220;不动点&#8221;（就是不修改的元素）A[j]（显然必须满足A[j]&lt;=A[i]且F[j]=F[i]-1），这样最小修改量就是G[j]+(将A[j..i]转变为不下降序列的最小修改量）。可以证明，A[j..i]的最优修改方案必然是将A[j+1..t]全部修改为A[j]，A[t+1..i]全部修改为A[i]，这里t是一个[j..i]范围的值。问题就是如何求出最优的t？<br />一开始，假设t=j，即把A[j+1..i-1]全部修改为A[i]，计算出修改量，设为S。然后，由于A[j+1..i-1]之间的元素要么小于A[j]，要么大于A[i]（这个是显然的囧），我们把小于A[j]的元素称为&#8220;小数&#8221;，把大于A[i]的元素称为&#8220;大数&#8221;，则当t取t0时，修改量为S-(A[i]-A[j])*(A[j+1..t0]中的&#8220;小数&#8221;个数减去&#8220;大数&#8221;个数）。这样，只需扫描一下，求出使得(A[j+1..t0]中的&#8220;小数&#8221;个数减去&#8220;大数&#8221;个数）值最大的t0即可。<br />当然还有一个问题，对于同一个i，满足&#8220;A[j]&lt;=A[i]且F[j]=F[i]-1&#8221;的元素个数可能有很多，如果一个一个枚举，一个一个扫描，会很慢的囧&#8230;&#8230;解决方法是，求出满足这个条件的j中最小的一个，设为j0，然后把A[j0+1..i-1]中的所有&#8220;小数&#8221;和&#8220;大数&#8221;全部处理出来，然后用类似前缀和的方法就能搞了囧&#8230;&#8230;当然，为了找到j0，需要建一个二分图，边为(F[i], i)。<br />最后，为了方便，可以把A序列的左边加一个-INF，右边加一个+INF。最后总的时间复杂度，理论上为O(N<sup>2</sup>)，但由于是随机数据，所以远远达不到这个级别。<br /><br />代码： 
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></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: #0000ff">#define</span><span style="color: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=1;&nbsp;i&lt;=n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re2(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re3(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;=r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n-1;&nbsp;i&gt;=0;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n;&nbsp;i&gt;0;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre2(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r-1;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre3(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;ll&nbsp;long&nbsp;long</span><span style="color: #000000"><br /></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">40010</span><span style="color: #000000">,&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;edge&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;b,&nbsp;pre,&nbsp;next;<br />}&nbsp;E[MAXN&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,&nbsp;m,&nbsp;A[MAXN],&nbsp;D[MAXN],&nbsp;F[MAXN],&nbsp;W[MAXN],&nbsp;res1;<br />ll&nbsp;G[MAXN],&nbsp;res2;<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init_d()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;E[i].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[i].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;add_edge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;E[m].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;E[m].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;E[m].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[a].pre;&nbsp;E[m].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;E[a].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;&nbsp;E[E[m].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m</span><span style="color: #000000">++</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">n);<br />&nbsp;&nbsp;&nbsp;&nbsp;A[</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: #000000">-</span><span style="color: #000000">INF;&nbsp;re1(i,&nbsp;n)&nbsp;{scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">A[i]);&nbsp;A[i]&nbsp;</span><span style="color: #000000">-=</span><span style="color: #000000">&nbsp;i;}&nbsp;A[</span><span style="color: #000000">++</span><span style="color: #000000">n]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;INF;&nbsp;n</span><span style="color: #000000">++</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;solve()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;init_d();&nbsp;F[</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: #000000">0</span><span style="color: #000000">;&nbsp;G[</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: #000000">0</span><span style="color: #000000">;&nbsp;D[</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: #000000">-</span><span style="color: #000000">INF;&nbsp;add_edge(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;len&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;l,&nbsp;r,&nbsp;mid,&nbsp;x,&nbsp;maxw;&nbsp;ll&nbsp;sum,&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;re2(i,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;n)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(A[i]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;D[len])&nbsp;D[F[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">len]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;A[i];&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(l&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;r)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&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">&nbsp;(A[i]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;D[mid])&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D[F[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">l]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;A[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E[F[i]</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">].next;&nbsp;;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E[p].next)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(A[i]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;A[x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[p].b])&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;W[x]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;re2(j,&nbsp;x</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;i)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(A[j]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;A[i])&nbsp;W[j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;W[j&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;W[j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;W[j&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;maxw&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF;&nbsp;G[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0Ull&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rre2(j,&nbsp;i,&nbsp;x)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(A[j]&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;A[i]&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;F[j]&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;F[i]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;G[j]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;sum;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(tmp&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;G[i])&nbsp;G[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;G[j]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;sum&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;(ll)&nbsp;(maxw&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;W[j])&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;(A[i]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;A[j]);&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(tmp&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;G[i])&nbsp;G[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(A[j]&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;A[i])&nbsp;sum&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;A[j]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;A[i];&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;sum&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;A[i]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;A[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(W[j]&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;maxw)&nbsp;maxw&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;W[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(F[i],&nbsp;i);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;res1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;F[n&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;res2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;G[n&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;pri()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;res1&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;res2&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;init();<br />&nbsp;&nbsp;&nbsp;&nbsp;solve();<br />&nbsp;&nbsp;&nbsp;&nbsp;pri();<br />&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 />}<br /><br /></span></div><br /><img src ="http://www.cppblog.com/MatoNo1/aggbug/189969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2012-09-08 20:40 <a href="http://www.cppblog.com/MatoNo1/archive/2012/09/08/189969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【AHOI2013复仇】ZJOI2008 骑士 题解</title><link>http://www.cppblog.com/MatoNo1/archive/2012/09/01/189006.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 01 Sep 2012 09:03:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/09/01/189006.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/189006.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/09/01/189006.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/189006.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/189006.html</trackback:ping><description><![CDATA[<div><a title="原题地址" href="http://www.lydsy.com/JudgeOnline/problem.php?id=1040">原题地址</a><br />本沙茶的第一个无向环套树模型，纪念一下&#8230;&#8230;<br />
<div>
<div><br />环套树，指的是每个连通块中点数都等于边数的无向图（称为无向环套树）或者是每个点有且只有一个前趋（称为内向环套树）或后继（称为外向环套树）的有向图，由于这个图的每个连通块当中有且只有一个环（注意，可能是自环，即长度为1的环），且这个环上的每个点都可以当作根引出一棵树，所以叫&#8220;环套树&#8221;。<br /><br />对于无向环套树，先将整个图进行一次DFS，当中如果发现有逆向边（这条边第一次被发现必然是作为逆向边的，也就是起点是终点的后代），就说明找到了这个环，记录其起点和终点（注意，如果有多个连通块的话，不能退出，要继续遍历完），再不断上溯（因此在DFS过程中当然要记录父边了囧），就可以找到整个环了，然后再以环上的结点为根建树即可，这样依次处理每个连通块。<br /><br />对于内向环套树（外向类似），找环更为简单，只需要任选一个点，不断去找它的前趋，同时记录找到的点序列，直到某个点在序列中出现两次为止，此时这个点以及序列中它两次出现的位置中间的所有点，就是环上的点，顺序也顺便记录下来，然后树也不用建了，直接在原图中找就行了。<br /><br />对于这题，由于每个点都有且只有一个后继，所以是外向环套树，不过本沙茶更倾向于它的基图（无向图，是无向环套树），然后就是一个DP了囧&#8230;&#8230;<br /><br />代码：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></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: #0000ff">#define</span><span style="color: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=1;&nbsp;i&lt;=n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re2(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re3(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;=r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n-1;&nbsp;i&gt;=0;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n;&nbsp;i&gt;0;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre2(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r-1;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre3(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;ll&nbsp;long&nbsp;long</span><span style="color: #000000"><br /></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">1000010</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;ll&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0Ull&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;edge&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;b,&nbsp;pre,&nbsp;next;<br />}&nbsp;E0[MAXN&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">],&nbsp;E[MAXN&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,&nbsp;m0,&nbsp;m,&nbsp;A[MAXN],&nbsp;stk[MAXN],&nbsp;st[MAXN],&nbsp;pr[MAXN],&nbsp;Q[MAXN];<br />ll&nbsp;F[MAXN][</span><span style="color: #000000">2</span><span style="color: #000000">],&nbsp;res&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: #0000ff">bool</span><span style="color: #000000">&nbsp;vst[MAXN],&nbsp;vst0[MAXN];<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init_d()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;E0[i].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[i].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[i].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[i].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(n&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;m0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;m0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n;&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;add_edge0(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;E0[m0].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;E0[m0].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;E0[m0].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[a].pre;&nbsp;E0[m0].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;E0[a].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m0;&nbsp;E0[E0[m0].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m0</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;E0[m0].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;E0[m0].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;E0[m0].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[b].pre;&nbsp;E0[m0].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;E0[b].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m0;&nbsp;E0[E0[m0].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m0</span><span style="color: #000000">++</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;add_edge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;E[m].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;E[m].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;E[m].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[a].pre;&nbsp;E[m].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;E[a].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;&nbsp;E[E[m].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m</span><span style="color: #000000">++</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%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: #0000ff">int</span><span style="color: #000000">&nbsp;x;&nbsp;init_d();<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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">A[i],&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">x);&nbsp;add_edge0(</span><span style="color: #000000">--</span><span style="color: #000000">x,&nbsp;i);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;sol0(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Q[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i,&nbsp;j,&nbsp;front,&nbsp;rear;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(front</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;rear</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;front</span><span style="color: #000000">&lt;=</span><span style="color: #000000">rear;&nbsp;front</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Q[front];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E0[i].next;&nbsp;p&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;i;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E0[p].next)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[p].b;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">vst0[j])&nbsp;{Q[</span><span style="color: #000000">++</span><span style="color: #000000">rear]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;j;&nbsp;vst0[j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;add_edge(i,&nbsp;j);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;rre3(z,&nbsp;rear,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Q[z];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F[i][</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: #000000">0</span><span style="color: #000000">;&nbsp;F[i][</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;A[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E[i].next;&nbsp;p&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;i;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E[p].next)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[p].b;&nbsp;F[i][</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;F[j][</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;F[j][</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;F[j][</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;:&nbsp;F[j][</span><span style="color: #000000">1</span><span style="color: #000000">];&nbsp;F[i][</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;F[j][</span><span style="color: #000000">0</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;solve()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;{vst[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;vst0[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;st[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[i].next;}&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;y,&nbsp;tp,&nbsp;x0,&nbsp;y0;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;FF,&nbsp;FF2;&nbsp;ll&nbsp;tmp0,&nbsp;tmp1,&nbsp;tmp00,&nbsp;tmp01,&nbsp;res0;<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">vst[i])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stk[tp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;&nbsp;vst[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;FF2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(tp&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;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;stk[tp];&nbsp;FF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">st[x];&nbsp;p&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;x;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E0[p].next)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[p].b;<br />&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">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">vst[y])&nbsp;{vst[y]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;stk[</span><span style="color: #000000">++</span><span style="color: #000000">tp]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;y;&nbsp;pr[y]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p;&nbsp;st[x]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[p].next;&nbsp;FF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(p&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;(pr[x]&nbsp;</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">FF2)&nbsp;{FF2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;x0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;&nbsp;y0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;y;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">FF)&nbsp;tp</span><span style="color: #000000">--</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(FF2)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;vst0[y0]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(x0&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;y0)&nbsp;{stk[tp</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x0;&nbsp;vst0[x0]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;x0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[pr[x0]].a;}&nbsp;stk[tp</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;y0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re(j,&nbsp;tp)&nbsp;sol0(stk[j]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;F[stk[</span><span style="color: #000000">0</span><span style="color: #000000">]][</span><span style="color: #000000">0</span><span style="color: #000000">];&nbsp;tmp1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re2(j,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;tp)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp00&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(tmp0&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;tmp1&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;tmp0&nbsp;:&nbsp;tmp1)&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;F[stk[j]][</span><span style="color: #000000">0</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp01&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;F[stk[j]][</span><span style="color: #000000">1</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp00;&nbsp;tmp1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp01;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp0&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;tmp1&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;tmp0&nbsp;:&nbsp;tmp1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF;&nbsp;tmp1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;F[stk[</span><span style="color: #000000">0</span><span style="color: #000000">]][</span><span style="color: #000000">1</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re2(j,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;tp)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp00&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(tmp0&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;tmp1&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;tmp0&nbsp;:&nbsp;tmp1)&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;F[stk[j]][</span><span style="color: #000000">0</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp01&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;F[stk[j]][</span><span style="color: #000000">1</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp00;&nbsp;tmp1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp01;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;res0&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;tmp0&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;res0&nbsp;:&nbsp;tmp0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;pri()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;res&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;init();<br />&nbsp;&nbsp;&nbsp;&nbsp;solve();<br />&nbsp;&nbsp;&nbsp;&nbsp;pri();<br />&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 />}<br /><br /></span></div><br /></div></div></div> <img src ="http://www.cppblog.com/MatoNo1/aggbug/189006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2012-09-01 17:03 <a href="http://www.cppblog.com/MatoNo1/archive/2012/09/01/189006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XOR专题（一）：异或方程组的解法</title><link>http://www.cppblog.com/MatoNo1/archive/2012/05/20/175404.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sun, 20 May 2012 02:17:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/05/20/175404.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/175404.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/05/20/175404.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/175404.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/175404.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 【异或（XOR）运算由于与&#8220;奇偶性&#8221;密切相关，经常出现在有关奇偶性和二进制的题目中】很多异或问题都要涉及到解异或方程组，因此首先要搞懂异或方程组的解法。（1）异或方程组的格式（设有n个未知数，m个方程）：a11*x1 XOR a12*x2 XOR ... XOR a1n*xn = b1a21*x1 XOR a22*x2 XOR ... XOR a2n*xn = b2&#82...&nbsp;&nbsp;<a href='http://www.cppblog.com/MatoNo1/archive/2012/05/20/175404.html'>阅读全文</a><img src ="http://www.cppblog.com/MatoNo1/aggbug/175404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2012-05-20 10:17 <a href="http://www.cppblog.com/MatoNo1/archive/2012/05/20/175404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>炮兵阵地以及与其相关的一类状压DP问题</title><link>http://www.cppblog.com/MatoNo1/archive/2012/03/10/167626.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 10 Mar 2012 15:27:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/03/10/167626.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/167626.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/03/10/167626.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/167626.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/167626.html</trackback:ping><description><![CDATA[<div><a title="原题地址" href="http://poj.org/problem?id=1185">原题地址</a><br />说实话我第一次尝试写炮兵阵地是在2009年&#8230;&#8230;已经过去两年多了，终于找到了一个好的解法&#8230;&#8230;庆祝一下&#8230;&#8230;<br /><br />【状态压缩DP】<br />所谓状态压缩DP，就是对于某些DP问题，每一阶段的状态都有很多维，要利用某些手段将它们压缩到一维（一个正整数），顺便进行状态的精简（去掉不合法的状态），然后再进行DP。这里讲的主要是传统的状压DP，有一种基于&#8220;插头&#8221;的DP，更高级，以后再搞。<br />对于本题，可以设计出一个这样的状态：[0..1][0..1][0..1]...[0..1]（有M个[0..1]），表示该行的每个格子放不放炮兵，如果放，为1，否则为0。显然，这是一个M位二进制数，如果能把它们压缩成一个int就好了。<br /><br />【如何压缩】<br />第一个问题是这么多维的状态如何压缩的问题。<br />对于本题，由于是二进制数，直接压缩就可以了。但是对于某些情况，状态是个三进制数（每个格子的属性都有3种）甚至更多进制数，这样，直接压缩会导致无法使用位运算，从而使&#8220;解压&#8221;变得很麻烦，耗时也很长（需要暴力），因此，可以将每位三进制都拆成两位二进制：<br />0-&gt;00<br />1-&gt;01<br />2-&gt;10<br />（当然1拆成10、2拆成11也木有问题，只要能区分开就行了）<br />这样，每个状态就可以用2个二进制数来表示，可以在构造出所有合法状态以后将每个状态所对应的两位二进制数存到struct里面，使用时调出即可。<br /><br />【如何精简】<br />这个问题是最重要的，因为，如果不精简，在枚举状态以及转移的时候就会枚举到很多不合法状态，导致时间浪费。<br />所谓精简，是指在预处理以及DP过程中，尽量避开不合法状态。<br />（1）预处理中的精简：<br />包括3个部分：<br />&lt;1&gt;找到所有可能的合法状态并编号：根据题意限制，有的状态在阶段内就不合法（比如本题，一行一阶段，那么凡是有两个1位的距离小于2的状态都不合法），而且这种状态所占的比重往往还很大（本题中，M=10时，也只有60种可能的合法状态），此时，为了找到这些合法状态，可以DFS构造实现。<br />需要注意的是，有的题不光要找到一个阶段内的合法状态，还要找到两个或两个以上阶段内的合法状态（比如那个有关多米诺骨牌的题），此时需要两个int同时DFS；<br />在找到合法状态以后，需要对每个合法状态进行编号，以达到&#8220;压缩&#8221;的目的。这里就涉及到了状态编号和状态表示的问题：比如，状态1001，表示为9，在DFS中第一个被搜到，因此编号为0，不要搞混了这两个（尤其不要搞混&#8220;编号为0&#8221;和&#8220;状态表示为0&#8221;，它们是不同的）。在预处理和DP的过程中，所有涉及到状态的数组下标，全部是编号而不是表示，知道编号要求表示，可以在DFS中记录的数组里面调，而知道表示要求编号，可以利用逆数组或者哈希；<br />&lt;2&gt;找到每一阶段的合法状态：即使是&lt;1&gt;中被判定为合法的状态，在具体的各个阶段中也未必合法（比如本题，如果某一行的某一个位置是'H'，不能放，而某一个状态在这里放了，则不合法），因此要对每个阶段再枚举一遍，找到真正合法的状态，并计入一个vector；<br />&lt;3&gt;找到状态转移中的合法状态：在状态转移中，往往要求状态不冲突（比如本题，在连续的三个阶段中，都不能有某一位有两个为1的情况），因此，还要枚举每个状态在转移时与其不冲突的状态，并计入vector。<br />注意，有时候这一步不是很容易进行，需要在DP过程中进行；<br />（2）DP过程中的精简：<br />DP过程中，枚举状态、转移决策都只枚举合法的，在vector里面调（注意vector里记录的全都是状态编号而不是表示！），可以大大减少枚举量，不过有时候，还会有一些时间浪费，这时候，可以采取一些其它的办法来精简，比如再次进行DFS构造合法状态等。<br /><br />总之，这类问题的目标就是&#8220;精简，精简，再精简，使枚举到的不合法状态减到最少&#8221;。<br /></div>代码：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">vector</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></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: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;re1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=1;&nbsp;i&lt;=n;&nbsp;i++)</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;re2(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;r;&nbsp;i++)</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;re3(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;=r;&nbsp;i++)</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;rre(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n-1;&nbsp;i&gt;=0;&nbsp;i--)</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;rre1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n;&nbsp;i&gt;0;&nbsp;i--)</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;rre2(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r-1;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;rre3(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;pb&nbsp;push_back</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;IR&nbsp;iterator</span><span style="color: #000000; "><br />typedef&nbsp;vector&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;vi;<br /></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; ">103</span><span style="color: #000000; ">,&nbsp;MAXM&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">11</span><span style="color: #000000; ">,&nbsp;MAXS&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">100</span><span style="color: #000000; ">,&nbsp;INF&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">0U</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n,&nbsp;m,&nbsp;S,&nbsp;A[MAXN],&nbsp;B[MAXS],&nbsp;T1[MAXS],&nbsp;F[MAXN][MAXS][MAXS],&nbsp;res;<br /></span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;F0[MAXN][MAXS];<br />vi&nbsp;P0[MAXN],&nbsp;P1[MAXS][MAXS];<br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;init()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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;getchar();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re1(i,&nbsp;n)&nbsp;{A[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;re(j,&nbsp;m)&nbsp;A[i]&nbsp;</span><span style="color: #000000; ">|=</span><span style="color: #000000; ">&nbsp;((getchar()&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">P</span><span style="color: #000000; ">'</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;j);&nbsp;getchar();}<br />}<br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;dfs(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;v,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;ST)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(v&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;m)&nbsp;B[S</span><span style="color: #000000; ">++</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ST;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{dfs(v&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,&nbsp;ST&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;v));&nbsp;dfs(v&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;ST);}<br />}<br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;prepare()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;dfs(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;S)&nbsp;{T1[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;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;j</span><span style="color: #000000; ">=</span><span style="color: #000000; ">B[i];&nbsp;j;&nbsp;j</span><span style="color: #000000; ">-=</span><span style="color: #000000; ">j</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">j))&nbsp;T1[i]</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;re1(i,&nbsp;n)&nbsp;re(j,&nbsp;S)&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">(</span><span style="color: #000000; ">~</span><span style="color: #000000; ">A[i]&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;B[j]))&nbsp;{P0[i].pb(j);&nbsp;F0[i][j]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;}&nbsp;P0[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">].pb(S&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;F0[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">][S&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;S)&nbsp;re(j,&nbsp;S)&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">(B[i]&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;B[j]))&nbsp;re(k,&nbsp;S)&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">(B[i]&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;B[k])&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!</span><span style="color: #000000; ">(B[j]&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;B[k]))&nbsp;P1[i][j].pb(k);<br />}<br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;solve()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re3(i,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;n)&nbsp;re(j1,&nbsp;S)&nbsp;re(j2,&nbsp;S)&nbsp;F[i][j1][j2]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">INF;&nbsp;F[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">][S&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">][S&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</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 />&nbsp;&nbsp;&nbsp;&nbsp;vi::IR&nbsp;vi_e0,&nbsp;vi_e1,&nbsp;vi_e2;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;j0,&nbsp;j1,&nbsp;k,&nbsp;V;<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vi_e0&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;P0[i].end();&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(i)&nbsp;vi_e1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;P0[i&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">].end();&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;vi_e1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;P0[i].end();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(vi::IR&nbsp;p</span><span style="color: #000000; ">=</span><span style="color: #000000; ">P0[i].begin();&nbsp;p&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;vi_e0;&nbsp;p</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(vi::IR&nbsp;p_</span><span style="color: #000000; ">=</span><span style="color: #000000; ">P0[i&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;:&nbsp;i].begin();&nbsp;p_&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;vi_e1;&nbsp;p_</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j0&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p;&nbsp;j1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p_;<br />&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; ">&nbsp;(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">(B[j0]&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;B[j1]))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vi_e2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;P1[j0][j1].end();<br />&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; ">for</span><span style="color: #000000; ">&nbsp;(vi::IR&nbsp;p__&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;P1[j0][j1].begin();&nbsp;p__&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;vi_e2;&nbsp;p__</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p__;<br />&nbsp;&nbsp;&nbsp;&nbsp;&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; ">&nbsp;(F0[i&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">][k])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;V&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;F[i][j0][j1]&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;T1[k];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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; ">&nbsp;(V&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;F[i&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">][k][j0])&nbsp;F[i&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">][k][j0]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;V;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;re(i,&nbsp;S)&nbsp;re(j,&nbsp;S)&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(F[n][i][j]&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;res)&nbsp;res&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;F[n][i][j];<br />}<br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;pri()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;res);<br />}<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;init();<br />&nbsp;&nbsp;&nbsp;&nbsp;prepare();<br />&nbsp;&nbsp;&nbsp;&nbsp;solve();<br />&nbsp;&nbsp;&nbsp;&nbsp;pri();<br />&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 />}<br /></span></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/167626.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2012-03-10 23:27 <a href="http://www.cppblog.com/MatoNo1/archive/2012/03/10/167626.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线段树操作极品题——HDU2871</title><link>http://www.cppblog.com/MatoNo1/archive/2011/12/18/162313.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sun, 18 Dec 2011 00:58:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/12/18/162313.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/162313.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/12/18/162313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/162313.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/162313.html</trackback:ping><description><![CDATA[<div><a title="原题地址" href="http://acm.hdu.edu.cn/showproblem.php?pid=2871">原题地址</a><br />这是一道线段树操作的极品题，因为它的4个操作刚好覆盖了线段树操作问题的3种处理思路，可以说是把线段树操作的全部内容都包含进去了。<br /><br />线段树是一种静态的数据结构，因为一棵线段树一旦建成，其形态就永远不会发生变化，改变的仅仅是结点上记录的各种信息的值。因此，对于线段树操作，核心问题也就是如何维护和处理这些信息。总的来说，对于线段树结点信息的维护和处理，有以下3种基本思路：<br />（1）左右归中型：<br />所谓左右归中，就是用左右子结点存储的信息来得到父结点存储的信息的值，这是最常见的线段树维护方法。举一些简单的例子：比如结点的SUM域表示该结点区间上所有元素的和，那么这个域维护的方法就是&#8220;父结点SUM=左子结点SUM+右子结点SUM&#8221;，再比如结点的MAX/MIN域表示该结点区间上所有元素的最大/小值，那么维护方法就是&#8220;父结点MAX/MIN=max/min{左子结点MAX/MIN,右子结点MAX/MIN}&#8221;。这种维护方法也比较简单，只要在每次对子结点进行修改之后upd一下就行了（对于那些自顶向下递归，而且涉及到改值的操作，在递归完左右子结点后一定要记得upd一下），在这之中有一个很重要的思想就是&#8220;左右连续段&#8221;思想：如果题目中要求任意一个区间内的具有某种性质的最长的连续序列（也就是子区间），比如最长连续上升子序列、01值问题中连续的0段或者非0段（在具体问题中就是连续的空闲段或者占用段）等，可以在每个结点上维护三个域：lS、rS和S，分别表示该结点区间左端（从区间的最左端开始的）具有这种性质的最长连续序列的长度，该结点区间右端（到区间的最右端结束的）具有这种性质的最长连续序列的长度和该区间内具有这种性质的最长连续序列的长度（也就是要求的那个东东），则维护方法为&#8220;父结点lS=左子结点lS（左子结点lS&lt;左子结点len）或左子结点len+右子结点lS（左子结点lS=左子结点len），父结点rS类似，父结点S=max{左子结点S,右子结点S,左子结点rS+右子结点lS}&#8221;，此外，由于要求的这个区间可能被拆成多个连续的结点区间，因此需要按顺序合并这些区间，合并的方法是：设立S0和S1，S0表示不保证能延伸下去的区间长度，S0=上一个区间的S1+本区间的lS；S1表示可以延伸下去的区间长度，S1=上一个区间的S1+本区间len（如果本区间整个都是满足条件的，即S=len）或本区间的rS（本区间不都是满足条件的，即S&lt;len），取过程中所有S0和区间S的最大值即为结果。<br />在HDU2871中，应用左右归中的方法维护的信息就是&#8220;最长连续空闲段&#8221;的长度，New操作需要；<br /><br />（2）调整边界型：<br />考虑这样一个问题：现在要插入、删除一些[0, 100000)的整数，并且在此过程中不断询问第K小的整数是多少，怎么办？平衡树可以实现，但线段树显然是更好的方法。对每个结点，存储一个K0值表示位于该结点区间内的整数的个数，则查找第K小的时候只需要不断执行以下操作：Kth(A, K)，表示在结点A代表的区间内找第K小的，然后，若K&lt;=结点A的左子结点K0值，则执行Kth(A的左子结点, K)，否则执行Kth(A的右子结点, K-A左子结点的K0)（这和平衡树神似），直到找到叶结点为止。这种方法称为&#8220;调整边界型&#8221;，即随着结点深入，不断缩小（自顶向下）或扩大（自底向上）范围，最后找到结果。像找第K小这样的操作属于自顶向下型，而像&#8220;找到X所在的具有某种性质的最长的连续区间&#8221;就属于自底向上型（注意和本题的Free不一样）；<br /><br />（3）标记辅助型：<br />这种维护信息的方法，特点是利用标记来维护信息，即对于某些结点（主要是叶结点，因为其标记不再下放），直接使用标记来得到一些数据，比如对于HDU2871这一题，其中对于叶结点位于的插入线段的标号，使用的就是标记。<br /><br />下面是本题4个操作的具体实现：<br />&lt;1&gt;线段树结点定义：<br />本题需要两棵线段树，这是因为New与Free操作对于tot域（插入线段左端点的总个数）会造成不同的影响，具体来说，在New操作中，tot值不会被同时加上（需要另外一个操作加上），然而在Free操作中，tot值会被同时清空，这样就会导致在对某个结点清空（该结点包含在某个Free操作要清空的线段中）并打上0标记之后，如果紧接着又插入一条包含这个结点区间的新线段，则这个结点的0标记就会丧失，这样在紧接着下传的时候，其子结点的tot值就不会被清空（事实上已经被清空了）。所以，将tot域彻底转移到另一棵线段树里。 
<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-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: #0000ff">struct</span><span style="color: #000000">&nbsp;node&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;len,&nbsp;mr,&nbsp;lsc,&nbsp;rsc,&nbsp;sc;<br />}&nbsp;T[MAXN&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">];<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;node0&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;tot;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;mr;<br />}&nbsp;T0[MAXN&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">];</span></div>其中lsc、rsc、sc就是连续空闲段的长度（用左右归中的方法维护），mr是一个整体赋值标记，在T中，mr的值若为-1表示无标记（未被整体赋值），若为0表示被整体清空，若大于0表示整体被一条线段覆盖，mr值就是这条线段的编号（为区分不同线段，这里按照输入顺序对每一条New操作插入的线段以1、2&#8230;&#8230;编号），在T0中，mr=1表示在Reset中被整体清空，mr=0表示无标记。<br />&lt;2&gt;操作处理：<br />1)Reset操作：将T、T0的根结点打上清空标记即可；<br />2)New：涉及到两个操作，分别是找最左的长度为x的连续空闲段，以及插入一条线段。对于前者，可以根据lsc、rsc、sc的值，按照&#8220;先左子结点，再跨越两个子结点，最后右子结点&#8221;的顺序求得（详见代码）；对于后者就不用说了，太容易实现了（注意标记的处理以及upd，另外要插入一个tot）；<br />3)Free：也涉及两个操作，分别是找一个点x所在的线段（插入过的线段）长度以及删除一条线段，对于前者可将New插入过的所有线段的左右端点预存起来，然后找到代表区间[x, x]的结点的mr值（也就是结点x被编号为神马的线段覆盖），再在预存的线段中找到即可。对于后者，直接清空即可（不要在T0中打标记，而要单独删除一个tot）；<br />4)Get：直接利用T0中的tot找到第K小的值即可；<br /><br /><a title="代码" href="http://www.ideone.com/LBj8f">代码</a></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/162313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-12-18 08:58 <a href="http://www.cppblog.com/MatoNo1/archive/2011/12/18/162313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>划分树</title><link>http://www.cppblog.com/MatoNo1/archive/2011/06/27/149604.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Mon, 27 Jun 2011 12:54:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/06/27/149604.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/149604.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/06/27/149604.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/149604.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/149604.html</trackback:ping><description><![CDATA[首先，Orz一下AHdoc神犇，本沙茶是看他的总结才搞懂划分树的。<br /><a title="原文地址" href="http://blog.renren.com/blog/367737224/728617495">原文地址</a><br /><br />划分树，就是每个结点代表一个序列，设这个序列的长度为len，若len&gt;1，则序列中前len/2（上取整，这里数学公式不好打，真囧）个元素被分到左子结点，左子结点代表的序列就是这些元素<span style="color: red"><strong>按照根结点中的顺序</strong></span>组成的序列，而剩下的元素被分到右子结点，右子结点代表的序列也就是剩下的元素按照根结点中的顺序组成的序列；若len=1，则该结点为叶结点。划分树最重要的应用就是找区间第K小（只是查找，不包括修改）。<br /><br />写划分树时主要有两个函数：建树和找区间第K小。由于后者AHdoc神犇已经总结了，所以这里只总结建树的函数。<br /><br />设目前结点为[l..r]（l&lt;r，就是目前的结点是原序列不断划分后得到[l..r]这一段，其实也就是a0[l..r]打乱顺序后得到的，a0为原序列递增排序后的序列）首先找到中值，就是a0[mid]，mid=l+r&gt;&gt;1。然后可以得到，[l..r]中小于中值的的元素一定被划分到左子结点，[l..r]中大于中值的元素一定被划分到右子结点，而[l..r]中等于中值的元素则不确定，有的被划分到左子结点，有的被划分到右子结点，这就需要先找到应被划分到左子结点的等于中值的元素个数sm（从mid开始不断往左，直到找到边界处或者找到一个小于中值的元素为止，或者说，sm就是a0[l..mid]中等于中值的元素个数），然后开始划分，小于中值分到左子结点，大于中值分到右子结点，等于中值的，若目前还没满sm则分到左子结点否则分到右子结点。另外中间有两个值需要记录（找区间第K小时必须要用到）：sl和sr。sl[i]表示[l..i]中被分到左子结点的元素个数，sr[i]表示[l..i]中被分到右子结点的元素个数（这里l&lt;=i&lt;=r。显然sl[i]+sr[i]=i-l+1，其实sr[i]可以不用记录的，这里只是为了在找第K小操作中减少计算次数，起到空间换时间的作用）。<br />建树代码：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mkt(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;d)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[</span><span style="color: #000000">++</span><span style="color: #000000">No].l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l;&nbsp;T[No].r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;r;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;T[No].mid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;r)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;No;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;midv&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a0[mid],&nbsp;sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;rre2(i,&nbsp;mid,&nbsp;l)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(a0[i]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;midv)&nbsp;{sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;i;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l,&nbsp;y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(a[d][l]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;midv)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[d&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][x</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[d][l];&nbsp;sl[d][l]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;sr[d][l]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(a[d][l]&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;midv&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;sm)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[d&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][x</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[d][l];&nbsp;sl[d][l]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;sr[d][l]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;sm</span><span style="color: #000000">--</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[d&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][y</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[d][l];&nbsp;sl[d][l]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;sr[d][l]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;re3(i,&nbsp;l</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;r)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(a[d][i]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;midv)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[d&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][x</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[d][i];&nbsp;sl[d][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sl[d][i&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;sr[d][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sr[d][i&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(a[d][i]&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;midv&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;sm)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[d&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][x</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[d][i];&nbsp;sl[d][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sl[d][i&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;sr[d][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sr[d][i&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];&nbsp;sm</span><span style="color: #000000">--</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[d&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][y</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[d][i];&nbsp;sl[d][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sl[d][i&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];&nbsp;sr[d][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sr[d][i&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;No0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;No;&nbsp;T[No0].lch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mkt(l,&nbsp;mid,&nbsp;d&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;T[No0].rch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mkt(mid&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;r,&nbsp;d&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;No0;<br />}<br /></span></div>这里a是每层划分后的序列。<br />查找区间第K小的代码：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Find_Kth(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;K)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</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;root,&nbsp;d&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;l0,&nbsp;r0,&nbsp;mid0,&nbsp;s0,&nbsp;s1;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].l,&nbsp;r0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].r;&nbsp;mid0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].mid;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l0&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;r0)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;a[d][l];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;l0)&nbsp;s0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;s0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;sl[d][l&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];&nbsp;s1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;sl[d][r]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(K&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;s1&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;s0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].lch;&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s0;&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s1;&nbsp;d</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;K&nbsp;</span><span style="color: #000000">-=</span><span style="color: #000000">&nbsp;(s1&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;s0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;l0)&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;sr[d][l&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;sr[d][r];&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].rch;&nbsp;d</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span></div><br />【具体题目】<a title="PKU2104" href="http://poj.org/problem?id=2104">PKU2104</a>、<a title="PKU2761" href="http://poj.org/problem?id=2761">PKU2761</a>（两道任选一道）<br /><br /> <img src ="http://www.cppblog.com/MatoNo1/aggbug/149604.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-06-27 20:54 <a href="http://www.cppblog.com/MatoNo1/archive/2011/06/27/149604.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网络流图边表的新表示法：Dancing Link边表（解决需要删边或删点或改容量的多次求最大流问题）</title><link>http://www.cppblog.com/MatoNo1/archive/2011/05/07/145885.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 07 May 2011 06:12:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/05/07/145885.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/145885.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/05/07/145885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/145885.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/145885.html</trackback:ping><description><![CDATA[考虑这样一种网络流问题：需要对同一个图求多次最大流。则在每次求最大流之前，需要将所有边的容量全部恢复到初始值（求最大流的过程中，边的容量f值被改变了）。不过这还不算最猥琐的，有的时候，我们需要在每次求最大流之前都删去图中的一些点或一些边，或者改变某些原有的边的容量，特别是需要删点或删边的情况爆难搞。因为，一般的边表中边类型定义如下：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;edge&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;b,&nbsp;f,&nbsp;next;<br />}&nbsp;ed[MAXM&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;MAXM];</span></div>表示这条边起点为a，终点为b，容量为f，邻接边（就是下一条起点为a的边）的编号为next。<br />如果要求多次最大流，那么在每次求最大流之前就要把所有边的容量恢复到初始值，解决方法是引入一个&#8220;初始容量&#8221;域fs，在这条边刚刚被加入的时候将它的fs值和f值都设为初始给它的容量，在恢复时，只要将所有边的f值恢复到fs即可。若要改变边容量，则将该边的fs值和f值都设为改变后的容量即可。<br /><br />下面来分析需要删边或删点的情况。在这种情况下，如果采用只有next的单向链表，则删除时next域极难处理，而且，在一般的边表中，还设立了表头hd，hd[a]表示边表中起点为a的第一条边的编号。因此，若删除的边&lt;a, b, f&gt;是起点为a的第一条边，还会影响hd[a]的值，使情况变得更为复杂。因此，必须采用双向链表！还记得Dancing Link么？边表其实也可以搞成Dancing Link，方法如下：<br />设图中有N个点，M条边（注意，这M条边只包括正向边，不包括反向边。由于每条正向边&lt;a, b, f&gt;都对应一条反向边&lt;b, a, 0&gt;，因此边表中边的数目其实是M+M）。首先把边表ed的0~N这(N+1)个位置（下标）空出来，作表头（表头不是边，因此在遍历边的时候不会遍历到它们）。其中，ed[0]为总表头，用于遍历ed[1..N]中每个未被删去的点；ed[1..N]为单点表头，ed[i]用来遍历图中所有以i为起点的边（和DLX中的二维DL惊人相似）。然后，若N为偶数，则空一个位置（也就是将ed[N+1]丢弃不用），这是因为我们在增广过程中需要引用到一条边对应的逆向边（正向边对应反向边，反向边对应正向边），一般认为编号为p的边对应的逆向边是p ^ 1，这样，就要求图中所有正向边的编号都是偶数，所有反向边的编号都是奇数（否则会造成混乱）。因此当N为偶数时，(N+1)为奇数，不能放置第一条正向边，需要从ed[N+2]开始放置正向边。若N为奇数则不用空位。<br />接下来就是边类型了。在这里，边类型一共需要包括6个域：a, b, fs, f, pre, next，表示这条边起点为a，终点为b，初始容量为fs，当前容量为f，上一条起点为a的边编号为pre，下一条起点为a的边编号为next。注意，和DL一样，整个链表是循环的，也就是我们认为表中最后一条起点为a的边的下一条邻接边编号就是a（表头），同样，a的上一条邻接边也就是这条边。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;edge&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;b,&nbsp;fs,&nbsp;f,&nbsp;pre,&nbsp;next;<br />}&nbsp;ed[MAXM&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;MAXM];</span></div>接下来就是几个重要过程了。<br />（1）初始化表头：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init_d()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re1(i,&nbsp;n)&nbsp;{ed[i].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;&nbsp;ed[i].b&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">;&nbsp;ed[i].f&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;ed[i].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[i].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(n&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">)&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;2</span><span style="color: #000000">;<br />}</span></div>这里n是图中的点数（相当于N），m是边的编号指针（相当于DLX中的nodes）<br />（2）添加新边：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;add_edge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;f)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ed[m].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;ed[m].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;ed[m].fs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[m].f&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;f;&nbsp;ed[m].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[a].pre;&nbsp;ed[m].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;ed[a].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;&nbsp;ed[ed[m].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;ed[m].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;ed[m].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;ed[m].fs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[m].f&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;ed[m].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[b].pre;&nbsp;ed[m].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;ed[b].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;&nbsp;ed[ed[m].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m</span><span style="color: #000000">++</span><span style="color: #000000">;<br />}</span></div>这个和DLX类似，不解释了囧&#8230;&#8230;<br /><br />最后进入最核心的部分&#8212;&#8212;到底如何处理删边或删点？有了DL型边表就爆好搞了：删去一条边，只要直接删去该边在DL中的位置即可：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;deledge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;No)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ed[ed[No].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[No].next;&nbsp;ed[ed[No].next].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[No].pre;<br />}<br /></span></div>恢复一条已删去的边：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;resuedge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;No)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ed[ed[No].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[ed[No].next].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;No;<br />}</span></div>需要删点的情况类似，对单点表头处理即可。<br /><br />【具体题目】<a title="PKU1815" href="http://poj.org/problem?id=1815">PKU1815</a><br />这题就是求有向图的字典序最小的最小点割集问题，方法是先求出最小点连通度（有关最小点连通度的求法见<a title="图的连通度问题的求法" href="http://www.cppblog.com/MatoNo1/archive/2011/04/05/143449.html">图的连通度问题的求法</a>），然后按编号递增顺序枚举每个点，若删去该点（其实是删去建成的新图中该点i'到该点附加点i''之间的边）后图的最小点连通度减小，则应删去该点，否则不应删去该点。删去后，继续枚举下一个点，直到求出点割集为止。<br />注意，本题只有删边，没有删点，因此总表头可以不需要，直接从ed[0]开始作单点表头。此时，关于是否空位就刚好反过来了：如果N是奇数就要空位，N是偶数不空位（不过这题里由于建出的网络流图中有2*N0个结点，总是偶数，可以不管，不过本沙茶还是管这个了）。<br /><br />代码（神犇不要鄙视）：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></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: #0000ff">#define</span><span style="color: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="color: #000000"><br /></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">501</span><span style="color: #000000">,&nbsp;MAXM&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">100000</span><span style="color: #000000">,&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;edge&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;b,&nbsp;fs,&nbsp;f,&nbsp;pre,&nbsp;next;<br />}&nbsp;ed[MAXM&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;MAXM];<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n0,&nbsp;n,&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;s,&nbsp;t,&nbsp;start[MAXN],&nbsp;pr[MAXN],&nbsp;hs[MAXN],&nbsp;lev[MAXN],&nbsp;q[MAXN],&nbsp;now,&nbsp;flow,&nbsp;reslen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;res[MAXN];<br /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;vst[MAXN];<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init_d()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;{ed[i].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;&nbsp;ed[i].b&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">;&nbsp;ed[i].f&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;ed[i].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[i].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(n&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">)&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;add_edge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;f)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ed[m].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;ed[m].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;ed[m].fs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[m].f&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;f;&nbsp;ed[m].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[a].pre;&nbsp;ed[m].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;ed[a].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;&nbsp;ed[ed[m].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;ed[m].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;ed[m].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;ed[m].fs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[m].f&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;ed[m].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[b].pre;&nbsp;ed[m].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;ed[b].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;&nbsp;ed[ed[m].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m</span><span style="color: #000000">++</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">n0,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">s,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">t);<br />&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n0&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;s</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;t&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;n0&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;init_d();<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n0)&nbsp;re(j,&nbsp;n0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">x);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(i&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;j)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(i&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;s&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;t&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;n0)&nbsp;add_edge(i,&nbsp;i&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;n0,&nbsp;INF);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;add_edge(i,&nbsp;i&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;n0,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(x)&nbsp;add_edge(i&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;n0,&nbsp;j,&nbsp;INF);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;aug()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;hs[t],&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;t,&nbsp;p;&nbsp;flow&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;z;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(i&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;s)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hs[i]&nbsp;</span><span style="color: #000000">-=</span><span style="color: #000000">&nbsp;z;&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pr[i];&nbsp;ed[p].f&nbsp;</span><span style="color: #000000">-=</span><span style="color: #000000">&nbsp;z;&nbsp;ed[p&nbsp;</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">].f&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;z;&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[p].a;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">ed[p].f)&nbsp;now&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;dfs()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;vst[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;vst[s]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;q[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s;&nbsp;lev[s]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i,&nbsp;j,&nbsp;f0;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;front</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;rear</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;front</span><span style="color: #000000">&lt;=</span><span style="color: #000000">rear;&nbsp;front</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;q[front];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">ed[i].next;&nbsp;p&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;i;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">ed[p].next)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ed[p].f)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[p].b;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">vst[j])&nbsp;{vst[j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;q[</span><span style="color: #000000">++</span><span style="color: #000000">rear]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;j;&nbsp;lev[j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lev[i]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">vst[t])&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 />&nbsp;&nbsp;&nbsp;&nbsp;now&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s;&nbsp;re(i,&nbsp;n)&nbsp;{start[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[i].next;&nbsp;vst[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;hs[now]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;INF;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;fd;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">vst[s])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(now&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;t)&nbsp;aug();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">start[now];&nbsp;p&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;now;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">ed[p].next)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[p].b;&nbsp;f0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[p].f;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(lev[now]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;lev[j]&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">vst[j]&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;f0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;start[now]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pr[j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p;&nbsp;hs[j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;hs[now]&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;f0&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;hs[now]&nbsp;:&nbsp;f0;&nbsp;now&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;j;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">fd)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vst[now]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(now&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;s)&nbsp;now&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[pr[now]].a;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;deledge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;No)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ed[ed[No].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[No].next;&nbsp;ed[ed[No].next].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[No].pre;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;resuedge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;No)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ed[ed[No].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[ed[No].next].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;No;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;resu_all()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">ed[i].next;&nbsp;p&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;i;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">ed[p].next)&nbsp;ed[p].f&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[p].fs;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;solve()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;flow&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(dfs())&nbsp;;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;f_&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;flow;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">flow)&nbsp;{reslen&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">;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ed[i].a&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;n0&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;ed[i].b&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;ed[i].a&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;s&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;ed[i].b&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;t)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deledge(i);&nbsp;deledge(i&nbsp;</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;resu_all();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flow&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(dfs())&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(flow&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;f_)&nbsp;{res[reslen</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[i].a&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;f_</span><span style="color: #000000">--</span><span style="color: #000000">;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{resuedge(i&nbsp;</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;resuedge(i);}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;pri()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(reslen&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">)&nbsp;puts(</span><span style="color: #000000">"</span><span style="color: #000000">0</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(reslen)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;reslen);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;reslen&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;res[i]);&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;res[reslen&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;puts(</span><span style="color: #000000">"</span><span style="color: #000000">NO&nbsp;ANSWER!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;init();<br />&nbsp;&nbsp;&nbsp;&nbsp;solve();<br />&nbsp;&nbsp;&nbsp;&nbsp;pri();<br />&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 />}<br /></span></div><br /><img src ="http://www.cppblog.com/MatoNo1/aggbug/145885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-05-07 14:12 <a href="http://www.cppblog.com/MatoNo1/archive/2011/05/07/145885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用A*求图的单源单汇第K短路</title><link>http://www.cppblog.com/MatoNo1/archive/2011/05/01/145456.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sun, 01 May 2011 07:25:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/05/01/145456.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/145456.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/05/01/145456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/145456.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/145456.html</trackback:ping><description><![CDATA[【问题描述】<br>给出一个图G和指定的源点s、汇点t，求图中从点s到点t的第K短路。<br>【具体题目】<a title=PKU2449 href="http://poj.org/problem?id=2449">PKU2449</a>（注意：本题有一个猥琐之处：不允许空路径。也就是当s等于t时要将K值加1）<br>【算法】<br>本题有一种最朴素的办法：改造Dijkstra，一开始路径(s, 0)（这里设路径(i, l)表示从s到i的一条长度为l的路径）入队。然后，<span style="COLOR: red"><strong>每次取队中长度最短的路径</strong></span>，该路径(i, l)出队，可以证明，若这是终点为i的路径第x次出队，该路径一定是图中从s到i的第x短路（若x&gt;K则该路径已无用，舍弃）。然后从点i扩展，将扩展到的路径全部入队。这样直到终点为t的路径第K次出队即可。<br>该算法容易实现（借助priority_queue），但时间复杂度可能达到O(MK)，需要优化。<br>优化：容易发现该算法其实有A*的思想，或者说，该算法<span style="COLOR: red"><strong>其实是所有结点的估价函数h()值均为0的A*算法</strong></span>。为了优化此题，需要将h()值改大。显然，h(i)值可以设为<span style="COLOR: red"><strong>从i到t的最短路径长度</strong></span>（容易证明它是一致的），然后g(i)=目前结点代表的路径长度，f(i)=g(i)+h(i)，然后A*即可。<br><br>注意：更改路径条数应该在出队时更改，而不能在入队时更改，因为可能在该路径出队之前会有新的比它更短的路径入队。<br><br>代码（PKU2449）：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">queue</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></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: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="COLOR: #000000"><br></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">1500</span><span style="COLOR: #000000">,&nbsp;MAXM&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">150000</span><span style="COLOR: #000000">,&nbsp;INF&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">0U</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;edge&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;kk,&nbsp;len,&nbsp;next;<br>}&nbsp;ed[MAXM],&nbsp;ed2[MAXM];<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n,&nbsp;m,&nbsp;s,&nbsp;t,&nbsp;k_,&nbsp;hd[MAXN],&nbsp;tl[MAXN],&nbsp;hd2[MAXN],&nbsp;tl2[MAXN],&nbsp;h[MAXN],&nbsp;q[MAXN&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">],&nbsp;No[MAXN],&nbsp;res&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: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;vst[MAXN];<br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;qnode&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i,&nbsp;g;<br>};<br>typedef&nbsp;priority_queue&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">qnode,&nbsp;vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">qnode</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;pq;<br>pq&nbsp;z;<br></span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;(qnode&nbsp;q1,&nbsp;qnode&nbsp;q2)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;q1.g&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;h[q1.i]&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;q2.g&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;h[q2.i];<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;init()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a0,&nbsp;b0,&nbsp;l0;<br>&nbsp;&nbsp;&nbsp;&nbsp;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);<br>&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;hd[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tl[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;hd2[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tl2[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>&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d%d%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a0,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">b0,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">l0);&nbsp;a0</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">;&nbsp;b0</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ed[i].kk&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;b0;&nbsp;ed[i].len&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;l0;&nbsp;ed[i].next&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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(hd[a0]&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">)&nbsp;hd[a0]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tl[a0]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;tl[a0]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ed[tl[a0]].next&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ed2[i].kk&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;a0;&nbsp;ed2[i].len&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;l0;&nbsp;ed2[i].next&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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(hd2[b0]&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">)&nbsp;hd2[b0]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tl2[b0]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;tl2[b0]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ed2[tl2[b0]].next&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d%d%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">s,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">t,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">k_);&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">s;&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">t;&nbsp;k_&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;s&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;t;<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;prepare()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;{h[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;INF;&nbsp;vst[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;h[t]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;vst[t]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;q[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;t;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i,&nbsp;h0,&nbsp;j,&nbsp;h1;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;front</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;rear</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">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">front&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;rear&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;n&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;front&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;rear&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);&nbsp;front&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;n&nbsp;</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;front&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;:&nbsp;front</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;q[front];&nbsp;h0&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;h[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">hd2[i];&nbsp;p&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">;&nbsp;p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">ed2[p].next)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ed2[p].kk;&nbsp;h1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;h0&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ed2[p].len;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(h1&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;h[j])&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h[j]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;h1;<br>&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">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">vst[j])&nbsp;{vst[j]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(rear&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;n)&nbsp;q[rear&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;j;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;q[</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">rear]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;j;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vst[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>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;solve()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;qnode&nbsp;q0;&nbsp;q0.i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s;&nbsp;q0.g&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;z.push(q0);<br>&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;No[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>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i,&nbsp;d0,&nbsp;j,&nbsp;d1;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">z.empty())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;z.top().i;&nbsp;d0&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;z.top().g;&nbsp;z.pop();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(No[i]&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;k_)&nbsp;</span><span style="COLOR: #0000ff">continue</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;No[i]</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;t&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;No[i]&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;k_)&nbsp;{res&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d0;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">hd[i];&nbsp;p&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">;&nbsp;p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">ed[p].next)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ed[p].kk;&nbsp;d1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d0&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ed[p].len;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q0.i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;j;&nbsp;q0.g&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d1;&nbsp;z.push(q0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;pri()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;res);<br>}<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;init();<br>&nbsp;&nbsp;&nbsp;&nbsp;prepare();<br>&nbsp;&nbsp;&nbsp;&nbsp;solve();<br>&nbsp;&nbsp;&nbsp;&nbsp;pri();<br>&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>}<br></span></div>
<img src ="http://www.cppblog.com/MatoNo1/aggbug/145456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-05-01 15:25 <a href="http://www.cppblog.com/MatoNo1/archive/2011/05/01/145456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态区间最大子序和问题及有关模型</title><link>http://www.cppblog.com/MatoNo1/archive/2011/04/24/144901.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sun, 24 Apr 2011 07:50:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/04/24/144901.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/144901.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/04/24/144901.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/144901.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/144901.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 动态区间最大子序和问题【问题描述】给出一个序列A[0..N-1]和M个操作，每个操作都是以下三种之一：①：查询区间最大子序和操作格式：1 l r表示：查询A[l..r]内的最大子序和（就是A[l..r]内的和最大的连续子序列的和），0&lt;=l&lt;=r&lt;N；②：修改单个值操作格式：2 i&nbsp;x表示：将A[i]的值改为x，0&lt;=i&lt;N；③：修改整段值操作格式：3 l ...&nbsp;&nbsp;<a href='http://www.cppblog.com/MatoNo1/archive/2011/04/24/144901.html'>阅读全文</a><img src ="http://www.cppblog.com/MatoNo1/aggbug/144901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-04-24 15:50 <a href="http://www.cppblog.com/MatoNo1/archive/2011/04/24/144901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>环形串的最优断点问题</title><link>http://www.cppblog.com/MatoNo1/archive/2011/04/23/144852.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 23 Apr 2011 08:09:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/04/23/144852.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/144852.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/04/23/144852.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/144852.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/144852.html</trackback:ping><description><![CDATA[【问题描述】<br>给出一个环形的字符串S，长度为N，现在要找到一个断开点，使得从这里断开后的字符串字典序最小。或者说，对于长度为N的字符串S[0..N-1]，找到一个位置i，使得字符串S' = S[i..N-1] + S[0..i-1]的字典序最小。若存在多个这样的最优断点，则取最左边(i最小)的那个。<br>【Sample Input】<br>amandamanda<br>【Sample Output】<br>10<br>（从第10位断开后得到的字符串"aamandamand"的字典序是11个断开位置中最小的）<br><br>【分析】<br>首先将这个环形串拆开：只需将S[0..N-1]的后面再接上S[0..N-2]即可（如对于样例，可构造字符串T = "amandamandaamandamand"），则T的任意一个长度为N的子串T[i..i-N+1]就是S从第i位断开得到的字符串。此时问题就变成了：<span style="COLOR: red"><strong>给出一个长度为(2N-1)的字符串，求出其所有长度为N的子串中字典序最小的</strong></span>。<br><br>设F[x]为<span style="COLOR: red"><strong>T中所有起始位小于N的长度为x的子串中字典序最小的子串的起始位（若有多个则取最左边的）</strong></span>，如对于T="abaabaaababaabaaa"，有F[0]=F[1]=0，F[2]=2，F[3]=F[4]=5&#8230;&#8230;本题的目的就是求出F[N]的值。一开始已知的只有F[0]=0（长度为0的字符串都是空串，字典序都是最小的，取最左边的第0位）。<br><br>可以发现，F数组有很多重要的性质：<br><span style="COLOR: #ff0000"><strong>性质1 F[0..N]数组是单调递增的。</strong></span><br>证明：用反证法。设存在一个值x(0&lt;=x&lt;N)使得F[x]&gt;F[x+1]则根据定义，有T[F[x+1]..F[x+1]+x]&lt;=T[F[x]..F[x]+x]（这里一定不会越界，即F[x]+x的值一定不大于(2N-1)，因为x&lt;N，又根据得F[x]&lt;N，故F[x]+x&lt;2N），这样，必有T[F[x+1]..F[x+1]+x-1]&lt;=T[F[x]..F[x]+x-1]。然而根据F[x]的定义又可以得到T[F[x+1]..F[x+1]+x-1]&gt;T[F[x]..F[x]+x-1]（否则F[x]的值就应该等于F[x+1]的值了），矛盾，故在F[0..N]中不可能存在任何F[x]&gt;F[x+1]的情况，也即F[0..N]数组是单调递增的（以下将F[0..N]数组简称为F数组）。<br><span style="COLOR: #ff0000"><strong>性质2 对于任意值x(0&lt;=x&lt;N)，必然满足F[x+1]=F[x]或F[x+1]&gt;F[x]+x。</strong></span><br>证明：因为前面已经证明了F数组是单调递增的，这里只需证明对于任意x(0&lt;=x&lt;N)，不存F[x]&lt;F[x+1]&lt;=F[x]+x的情况即可。<br>这里同样用反证法。设存在一个值x(0&lt;=x&lt;N)使得F[x]&lt;F[x+1]&lt;=F[x]+x。则根据定义有T[F[x+1]..F[x+1]+x]&lt;T[F[x]..F[x]+x]且T[F[x]..F[x]+x-1]&lt;=T[F[x+1]..F[x+1]+x-1]，这样必有T[F[x]..F[x]+x-1]=T[F[x+1]..F[x+1]+x-1]且T[F[x+1]+x]&lt;T[F[x]+x]。设D=F[x+1]-F[x]，则T[F[x]]=T[F[x]+D]，因为D&lt;=x，可得T[F[x]+D]=T[F[x]+2D]，即T[F[x]]=T[F[x]+2D]。这样，T[F[x]..F[x]+x-D-1]=T[F[x]+2D..F[x]+x+D-1]；又因为T[F[x]+x-D]=T[F[x]+x]，而T[F[x+1]+x]（即T[F[x]+x+D]]）&lt;T[F[x]+x]，这样，T[F[x]+x+D]&lt;T[F[x]+x-D]，也就是，T[F[x]+2D..F[x]+x+D]&lt;T[F[x]..F[x]+x-D]！这样可以得出，从(F[x]+2D)位开始的任意长度不小于(x-D)的子串，其字典序都小于从F[x]位开始的同样长度的子串，由于F[x]&lt;F[x+1]&lt;=F[x]+x，D=F[x+1]-F[x]，所以有1&lt;=D&lt;=x，这样，F[x]的值就应该是(F[x]+2D)了，这显然不可能。所以，一开始假设的这种情况是不可能存在的，即对于任意值x（0&lt;=x&lt;N），必然满足F[x+1]=F[x]或F[x+1]&gt;F[x]+x。<br><br>根据F数组的以上两个性质可以设计出本题的算法：<br>设目前已经求出了F[0..x-1]的值，且F[x-1]=i。首先将T[0..i-1]全部删去（因为F数组是单调递增的，F[x]的值一定不小于i），然后对T自身作扩展KMP（就是以T为模板串，T为子串的扩展KMP，相当于其预处理部分），一开始先将F[x]置为i，设第j位的匹配长度为next[j]，若next[j]=x-1且T[j+x-1]&lt;T[i+x-1]，则将F[x]的值改为j，这样扫描一遍，即求出了F[x]的值。若扫描过程中未出现任何next[j]=x-1，则设所有next[j]值不小于x的最小next[j]值为y，则可以直接得到F[x..y-1]的值均等于F[x-1]。就这样直到求出F[N]的值为止。<br><br>时间复杂度：O(N<span style="FONT-FAMILY: symbol">&#214;</span>N)，可以根据性质2得到。
<img src ="http://www.cppblog.com/MatoNo1/aggbug/144852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-04-23 16:09 <a href="http://www.cppblog.com/MatoNo1/archive/2011/04/23/144852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RMQ问题</title><link>http://www.cppblog.com/MatoNo1/archive/2011/03/26/142289.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 26 Mar 2011 02:13:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/03/26/142289.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/142289.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/03/26/142289.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/142289.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/142289.html</trackback:ping><description><![CDATA[今天终于搞懂了RMQ问题无比神犇的ST算法&#8230;&#8230;<br><br>【离线RMQ问题】<br>题意：对于一个序列A[1..N]，共有M次提问，每次都是问A[l..r]（1&lt;=l&lt;=r&lt;=N)中的最值，求出每次提问的答案。<br><br>（1）纯暴力枚举：O(NM)；<br>（2）树状数组：O(M(logN)^2)【见<a title=树状数组解决离线RMQ问题 href="http://www.cppblog.com/MatoNo1/archive/2011/03/19/142238.html">树状数组解决离线RMQ问题</a>】<br>（3）ST算法：O(MlogN)&#8230;&#8230;<br>ST算法是基于分块DP的。<br>设F[i][j]为A[i..(i+2^j-1)]（共2^j个元素）中的最值（前提是不能越界，即i+2^j-1 &lt;= N），显然F可以通过DP的方式得到：<br>F[i][j] = min||max{F[i][j-1], F[i+2^(j-1)][j-1]}<br>边界：F[i][0]=A[i]。<br>DP求F的值的时间复杂度为O(NlogN)（一共只有NlogN个F值有意义）；<br><br>然后，对于求A[l..r]中的最值，只要将A[l..r]拆成若干连续的段，使得每段的长度都是2的整数次幂就行了，比如A[3..28]可以拆成A[3..18]、A[19..26]、A[27..28]三段，长度分别是16（2^4）、8（2^3）、2（2^1），所以min||max{A[3..28]} = min||max{F[3][4], F[19][3], F[27][1]}。<br>关键是怎么拆？方法：求出(r-l+1)（即A[l..r]的长度）的二进制形式，然后从高位到低位依次遍历，如果找到1位就加上目前的位对应的幂，如(28-3+1)=(11010)2，所以依次找到F[3][4]、F[3+2^4][3]、F[3+2^4+2^3][1]。注意此时需要预先设一个数组B，B[2^i]=i，以方便找到某个取出的幂对应的指数。<br>显然，最多只有logN段，所以一次提问的时间复杂度为O(logN)。<br><br>其实还有一种方法，就是先求出log(r-l+1)的值（下取整），设为x，然后F[l][x]和F[r-2^x+1][x]中的较大/较小值就是A[l..r]中的最值。这样，一次提问的时间复杂度就降到了O(1)。问题是，系统log函数灰常慢，也许算一次log函数值的时间已经超过了logN，这样显然得不偿失。所以仍然推荐上面的方法。<br><br>【核心代码（以求最小值为例，最大值类似）】<br>分段法：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;MIN(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;l0,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;r0)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;min&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;INF,&nbsp;h&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;l0,&nbsp;d0,&nbsp;b0;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;d&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;r0&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;l0&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;d;&nbsp;d&nbsp;</span><span style="COLOR: #000000">-=</span><span style="COLOR: #000000">&nbsp;d0)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d0&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">d;&nbsp;b0&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;B[d0];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(F[h][b0]&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;min)&nbsp;min&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;F[h][b0];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;d0;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;min;<br>}<br></span></div>
求log值法：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;MIN(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;l0,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;r0)<br>{<br>&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;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)floor(log2(r0&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;l0&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1.0</span><span style="COLOR: #000000">)),&nbsp;s1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;F[l0][v],&nbsp;s2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;F[r0&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;v)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">][v];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;s1&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;s2&nbsp;</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;s1&nbsp;:&nbsp;s2;<br>}<br></span></div>
求F数组值的预处理代码（注意，如果采用求log值的方法就不需要B数组了）：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;prepare()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;F[i][</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;a[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x;<br>&nbsp;&nbsp;&nbsp;&nbsp;re2(j,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;MAXS)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;j)&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;n)&nbsp;B[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;j]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;j;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;n&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;j)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;x)&nbsp;F[i][j]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;min(F[i][j&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">],&nbsp;F[i&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)][j&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</span></div>
<br>【后经效率测试，发现当N=M=100000的随机数据中，两种方法都可以在0.4s以内得出正确结果，其中log值法比分段法略慢0.01s左右，相差不大，但考虑到&#8220;尽量少使用数学函数&#8221;的原则，仍推荐分段法】<br><br>
<img src ="http://www.cppblog.com/MatoNo1/aggbug/142289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-03-26 10:13 <a href="http://www.cppblog.com/MatoNo1/archive/2011/03/26/142289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>