<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Var Bob:^Joy;</title><subtitle type="text">While Working, We're Worthy.Simple,Efficient,and Beautiful.</subtitle><id>http://feed.cnblogs.com/blog/u/74721/rss</id><updated>2012-01-07T09:52:06Z</updated><author><name>Master_Chivu</name><uri>http://www.cnblogs.com/Booble/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Booble/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/74721/rss"/><entry><id>http://www.cnblogs.com/Booble/archive/2011/06/09/2076525.html</id><title type="text">像程序一样去学习</title><summary type="text">学了好多东西 也写了很多很多程序算起来 我是在初一开始认识这些的 当时学习了Pascal 然后初中三年 又学了一些算法然后就可以写一写简单的程序了 随后就初中毕业进了高中如果说要开始认真学习算法和数据结构 是去年的这个时候吧当时也是出于好奇 因为有很多问题之前的学的东西远远不能解决学习算法 实现程序真的给我带来了不少东西 其中有很多实在是在意料之外的也许将来就离不开写程序了..一般的程序都得有个输入 当然有的程序不需要输入因为这些程序需要干什么 写程序的人早就设定好了 这种设定也可以算是一种输入吧在不断学习新东西的人 好比就是不断地读取输入流的程序对一个好的程序来说 应该能够不断的读取输入流并</summary><published>2011-06-09T08:19:00Z</published><updated>2011-06-09T08:19:00Z</updated><author><name>Master_Chivu</name><uri>http://www.cnblogs.com/Booble/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Booble/archive/2011/06/09/2076525.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Booble/archive/2011/06/09/2076525.html"/><content type="html">&lt;p&gt;学了好多东西 也写了很多很多程序&lt;/p&gt;&lt;p&gt;算起来 我是在初一开始认识这些的 当时学习了Pascal 然后初中三年 又学了一些算法&lt;/p&gt;&lt;p&gt;然后就可以写一写简单的程序了 随后就初中毕业进了高中&lt;/p&gt;&lt;p&gt;如果说要开始认真学习&lt;strong&gt;算法和数据结构&lt;/strong&gt; 是去年的这个时候吧&lt;/p&gt;&lt;p&gt;当时也是出于好奇 因为有很多问题之前的学的东西远远不能解决&lt;/p&gt;&lt;p&gt;&lt;strong&gt;学习算法 实现程序&lt;/strong&gt;真的给我带来了不少东西 其中&lt;strong&gt;有很多实在是在意料之外的&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;也许将来就离不开写程序了&lt;/p&gt;&lt;p&gt;.&lt;/p&gt;&lt;p&gt;.&lt;/p&gt;&lt;p&gt;一般的程序都得有个&lt;strong&gt;输入&lt;/strong&gt; 当然有的程序不需要输入&lt;/p&gt;&lt;p&gt;因为这些程序需要干什么 写程序的人早就设定好了 这种设定也可以算是一种输入吧&lt;/p&gt;&lt;p&gt;在不断学习新东西的人 好比就是不断地&lt;strong&gt;读取&lt;/strong&gt;输入流的程序&lt;/p&gt;&lt;p&gt;对一个好的程序来说 应该能够不断的读取输入流并&lt;strong&gt;存储 处理&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;而对于一个需要学习的人 更应该能够不断的&lt;strong&gt;接受&lt;/strong&gt;并经由自己的大脑&lt;strong&gt;记忆 思考&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;.&lt;/p&gt;&lt;p&gt;.&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;接受 记忆 思考&lt;/strong&gt; 无疑是一直被人们所长期关注的过程&lt;/p&gt;&lt;p&gt;然而 还有一项更重要的内容 却被忽视了 而被忽视的这一点 确是&lt;strong&gt;最最最重要&lt;/strong&gt;的&lt;/p&gt;难道一个程序光有输入 光能完成数据的处理完整了么&lt;p&gt;&lt;strong&gt;没有输出 不算程序&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;对于一个程序来说 显然地 &lt;strong&gt;输出&lt;/strong&gt;无疑是必要的&lt;/p&gt;&lt;p&gt;这一点显然到经常被人忽略 但是确是实实在在存在在任何一段程序之中&lt;/p&gt;&lt;p&gt;对于一个人来说 学习了 理解了 就应该去&lt;strong&gt;传播自己的思想 去和他人交流&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这一点也经常被人忽略 却不是因为过于显然 所以有很多人不善于传播 不善于交流&lt;/p&gt;&lt;p&gt;人作为有智慧有思想的生物 学习可以说是最为重要的技能 人因为能够学习而胜于其他生命&lt;/p&gt;&lt;p&gt;&lt;strong&gt;不过能够学习和善于学习还是有很大差别的&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果人不去传播自己的思想 不去和其他人交流&lt;/p&gt;&lt;p&gt;那每个人都只能被迫从最原始的学习阶段开始 每个人都得做很多重复的劳动&lt;/p&gt;&lt;p&gt;从整个人类社会来看 效率无疑就十分低下&lt;/p&gt;&lt;p&gt;倘若每个人对自己的思想加以整理并传播 人与人之间就有一个良好的&lt;strong&gt;互动&lt;/strong&gt; 思想就能&lt;strong&gt;共享&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这好比是单纯搜索和记忆化搜索 效率差别往往是&lt;strong&gt;指数级别&lt;/strong&gt;的&lt;/p&gt;&lt;p&gt;将自己的想法传播出去 主动和别人交流&lt;/p&gt;&lt;p&gt;首先会得到很多回应 这会是一个&lt;strong&gt;完善自我思想的契机&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;其次会让更多人得到更有益的信息 其他人学习也会有一个参考&lt;/p&gt;&lt;p&gt;从整体看这样就能&lt;strong&gt;高效形成科学的理论体系&lt;/strong&gt; 自然能推动人类社会的发展&lt;/p&gt;&lt;p&gt;&lt;strong&gt;传播交流能使得能够学习转化为善于学习&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;.&lt;/p&gt;&lt;p&gt;.&lt;/p&gt;&lt;p&gt;当我发现这一点的时候 创建了这个blog&lt;/p&gt;&lt;p&gt;.&lt;/p&gt;&lt;p&gt;.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Booble/aggbug/2076525.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Booble/archive/2011/06/09/2076525.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Booble/archive/2011/06/04/2072724.html</id><title type="text">再解树形数据结构(二)</title><summary type="text">{以前在这里介绍过延迟标记的手法http://www.cnblogs.com/Booble/archive/2010/10/11/1847793.html阅读这本文之前请先阅读上面一段 尤其是对Poj3468的解决线段树作为一种常用的数据结构 通常会被要求支持更复杂的修改因此就产生了延迟标记来保证线段树的复杂度这里通过几个简单应用延迟标记的例子更深入的介绍延迟标记}========================================================一.标记问题引例先看一个例子 HDU3397 这是一个比较水但是比较繁琐的标记题http://acm.hdu.edu.c</summary><published>2011-06-04T11:35:00Z</published><updated>2011-06-04T11:35:00Z</updated><author><name>Master_Chivu</name><uri>http://www.cnblogs.com/Booble/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Booble/archive/2011/06/04/2072724.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Booble/archive/2011/06/04/2072724.html"/><content type="html">&lt;p&gt;{&lt;/p&gt;&lt;p&gt;以前在这里介绍过&lt;strong&gt;延迟标记&lt;/strong&gt;的手法&lt;/p&gt;&lt;p&gt;http://www.cnblogs.com/Booble/archive/2010/10/11/1847793.html&lt;/p&gt;&lt;p&gt;阅读这本文之前请先阅读上面一段 尤其是对&lt;strong&gt;Poj3468&lt;/strong&gt;的解决&lt;/p&gt;&lt;p&gt;线段树作为一种常用的数据结构 通常会被要求支持更复杂的&lt;strong&gt;修改&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;因此就产生了延迟标记来&lt;strong&gt;保证线段树的复杂度&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这里通过几个简单应用延迟标记的例子更深入的介绍延迟标记&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;========================================================&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;一.标记问题引例&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;先看一个例子 HDU3397 这是一个比较水但是比较繁琐的标记题&lt;/p&gt;&lt;p&gt;http://acm.hdu.edu.cn/showproblem.php?pid=3397&lt;/p&gt;&lt;p&gt;其实不需要对线段树标记有什么理解 就可以做&lt;/p&gt;&lt;p&gt;但是需要一定的经验 即对线段树的标记有个朦胧的印象&lt;/p&gt;&lt;p&gt;不过这个通过这个问题恰好可以印证线段树&lt;strong&gt;标记的本质&lt;/strong&gt;和一些&lt;strong&gt;应用的条件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;题目意思相当赤果果 是一个典型的&lt;strong&gt;数据结构维护序列&lt;/strong&gt;的问题&lt;/p&gt;&lt;p&gt;要求支持如下询问和操作:&lt;/p&gt;&lt;p&gt;-----------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;Change operations:&lt;br /&gt;0 a b  change all characters into '0's in [a , b]&lt;br /&gt;1 a b  change all characters into '1's in [a , b]&lt;br /&gt;2 a b  change all '0's into '1's and change all '1's into '0's in [a, b]&lt;br /&gt;Output operations:&lt;br /&gt;3 a b  output the number of '1's in [a, b]&lt;br /&gt;4 a b  output the length of the longest continuous '1' string in [a , b]&lt;/p&gt;&lt;p&gt;其中:&lt;/p&gt;&lt;p&gt;0 1 是比较经典的覆盖类操作&lt;/p&gt;&lt;p&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp; 是一个取反操作&lt;/p&gt;&lt;p&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp; 是询问区间中1的个数&lt;/p&gt;&lt;p&gt;4&amp;nbsp;&amp;nbsp;&amp;nbsp; 是询问区间中最长的连续的1的长度&lt;/p&gt;&lt;p&gt;-----------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;首先考虑&lt;strong&gt;答案域&lt;/strong&gt;和&lt;strong&gt;答案域的附加域&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;其中3的答案域是一个部分和类型的域 单独一个域就可以满足&lt;strong&gt;递推结构&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;即 记录当前节点的区间中有多少个1即可 不妨记为 &lt;strong&gt;SumOne&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;然后可以从儿子推出父亲的这个域&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;SumOne[fa]=SumOne[lson]+SumOne[rson]&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;而4的答案域是一个最大子段和类型的域 单独一个答案域还不满足&lt;strong&gt;最优子结构&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们还要记录 从左端开始 和 从右端开始的 最长连续的1的个数&lt;/p&gt;&lt;p&gt;答案域记为&lt;strong&gt; OptOne&lt;/strong&gt; 左端记为 &lt;strong&gt;LOptOne&lt;/strong&gt; 右端记为 &lt;strong&gt;ROptOne&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;其中 后面两个域就是答案的附加域&lt;/p&gt;&lt;p&gt;这时则从儿子域同样可以推出父亲的域&lt;/p&gt;&lt;p&gt;&lt;strong&gt;OptOne[fa]=Max{ OptOne[lson] , OptOne[rson] , ROptOne[lson]+LOptOne[rson] }&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;LOptOne[fa]=Max{ LOptOne[lson] , SumOne[lson]+LOptOne[rson]&lt;span style="text-decoration: underline;"&gt;|SumOne[lson]=Length(lson)&lt;/span&gt; }&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ROptOne[fa]=Max{ ROptOne[lson] , SumOne[rson]+ROptOne[lson]&lt;span style="text-decoration: underline;"&gt;|SumOne[rson]=Length(rson)&lt;/span&gt; }&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;接下来考虑&lt;strong&gt;标记域&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;先是控制覆盖操作的&lt;strong&gt;覆盖标记域&lt;/strong&gt; 记为&lt;strong&gt;Cover&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;很显然覆盖标记域应该是一个&lt;strong&gt;三值变量&lt;/strong&gt; 不妨用一个&lt;strong&gt;整型变量&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;-1 代表当前区间不执行覆盖操作&lt;/p&gt;&lt;p&gt;&amp;nbsp;0 代表当前去见执行覆盖为0的操作&lt;/p&gt;&lt;p&gt;+1代表当前去见执行覆盖为1的操作&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #0000ff;"&gt;执行覆盖标记域时可以很方便地直接得到当前节点的各个答案域&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #0000ff;"&gt;不过要利用一下当前节点的区间长度 *1&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;然后是控制取反操作的&lt;strong&gt;取反标记域 &lt;/strong&gt;记为&lt;strong&gt;Inverse&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;这显然是一个 &lt;strong&gt;二值的布尔变量&lt;/strong&gt; 真代表区间要取反 假则代表区间不需要取反&lt;/p&gt;&lt;p&gt;当我们考虑到取反操作时 会发现如果一个区间执行了取反标记&lt;/p&gt;&lt;p&gt;那么原来所有答案域都会&lt;strong&gt;流失&lt;/strong&gt; 变成相应的关于0的信息 而我们就失去了需要的答案域&lt;/p&gt;&lt;p&gt;不过 相应的 所有关于0的信息 又都会变成1的信息 所以我们为了保证标记执行之后答案域还能延续&lt;/p&gt;&lt;p&gt;所以还要记录4个与上面关于1的域一致的答案附加域&lt;/p&gt;&lt;p&gt;分别是&lt;strong&gt;SumZero OptZero LOptZero ROptZero&lt;/strong&gt; 递推方程&lt;strong&gt;也一致&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;当执行取反标记的时候就会交换这两组域 也能直接得到答案域&lt;/strong&gt; &lt;strong&gt;*2&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;不过 有过解决这类双标记问题经验的都知道要考虑一个&amp;ldquo;标记顺序&amp;rdquo;&lt;/p&gt;&lt;p&gt;我们总是这样设计标记域 保证任意时刻都&lt;strong&gt;至多只有一个标记域有效&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这样就把双标记问题转化为单个标记的问题&lt;/p&gt;&lt;p&gt;下面要考虑标记下传的问题 并且在标记下传的时候能够保证单个标记域有效的性质&lt;/p&gt;&lt;p&gt;假设所有节点现在都满足单个标记有效 那么如果我们能够在下传之后能仍然有这个性质&lt;/p&gt;&lt;p&gt;就能很完美的解决这个问题 下面分类讨论这个问题&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;如果父亲节点是Cover有效&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;那么无论儿子是Cover域还是Inverse域有效&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;都可以将儿子的标记清空 然后让儿子的Cover域修改为父亲的Cover域&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;如果父亲节点是Inverse域有效&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;那么如果儿子是Cover域有效 则把Cover域取反 0变成1 1变成0&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;而如果是儿子的Inverse域有效 则把Inverse域取反 *3&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;这样就可以将一个双标记的问题转化为一个单标记的问题&lt;/p&gt;&lt;p&gt;再应用上面利用标记域修改答案域的思路就可以完成&lt;strong&gt;清空标记并下传&lt;/strong&gt;的操作了&lt;/p&gt;&lt;p&gt;最后还要考虑一点 才能将这个线段树最终实现好&lt;/p&gt;&lt;p&gt;由于线段树是将任意一个查询区间&lt;strong&gt;分解为不超过LogN个子区间&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;而这些子区间 都能直接得到答案域 所以还要由LogN个答案域得到&lt;strong&gt;最终查询区间的答案&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个问题其实很简单 由于答案域满足&lt;strong&gt;最优子结构&lt;/strong&gt; 只要依次&lt;strong&gt;把答案域从左到右一个一个合并&lt;/strong&gt;即可&lt;/p&gt;&lt;p&gt;这样就可以 得到最终的查询区间的答案域&lt;/p&gt;&lt;p&gt;至此我们已经得到了这个很典型的问题的一个不错的解法&lt;/p&gt;&lt;p&gt;下面给出代码&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('e0696beb-c3d2-4258-851d-6abf679fa6ca')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_e0696beb-c3d2-4258-851d-6abf679fa6ca" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_e0696beb-c3d2-4258-851d-6abf679fa6ca" onclick="cnblogs_code_hide('e0696beb-c3d2-4258-851d-6abf679fa6ca',event)" style="display: none;" /&gt;&lt;div id="cnblogs_code_open_e0696beb-c3d2-4258-851d-6abf679fa6ca" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;    maxn&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;200000&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    dat:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;..maxn]&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;of&lt;/span&gt;&lt;span style="color: #000000;"&gt; longint;&lt;br /&gt;    sl,ml,sr,mr,s,m,l,r,ls,rs,c,n:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;..maxn&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;of&lt;/span&gt;&lt;span style="color: #000000;"&gt; longint;&lt;br /&gt;    d:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;..maxn&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;of&lt;/span&gt;&lt;span style="color: #000000;"&gt; boolean;&lt;br /&gt;    tt,rec,last,p,q,i,ch,x,y:longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; max(a,b:longint):longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; a&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;b &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; max:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;a &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; max:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;b;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; swap(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; a,b:longint):longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    temp:longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;temp:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;a; a:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;b; b:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;temp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;procedure&lt;/span&gt;&lt;span style="color: #000000;"&gt; clean(x:longint);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; c[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    n[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(r[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;l[x])&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;c[x];&lt;br /&gt;    ml[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;n[x]; mr[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;n[x]; m[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;n[x];&lt;br /&gt;    s[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;r[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;l[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;n[x];&lt;br /&gt;    sl[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;s[x]; sr[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;s[x];&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; ls[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        c[ls[x]]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;c[x]; c[rs[x]]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;c[x];&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; d[x]&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        n[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;r[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;l[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;n[x];&lt;br /&gt;        swap(sl[x],ml[x]); swap(sr[x],mr[x]); swap(s[x],m[x]);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; ls[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; c[ls[x]]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; c[ls[x]]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;c[ls[x]]&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; d[ls[x]]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;not&lt;/span&gt;&lt;span style="color: #000000;"&gt; d[ls[x]];&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; c[rs[x]]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; c[rs[x]]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;c[rs[x]]&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; d[rs[x]]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;not&lt;/span&gt;&lt;span style="color: #000000;"&gt; d[rs[x]];&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;c[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; d[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;false;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;procedure&lt;/span&gt;&lt;span style="color: #000000;"&gt; update(x:longint);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    templ,tempr:longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;clean(ls[x]); clean(rs[x]);&lt;br /&gt;n[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;n[ls[x]]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;n[rs[x]]; templ:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;r[ls[x]]&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;l[ls[x]]; tempr:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;r[rs[x]]&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;l[rs[x]];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; ml[ls[x]]&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;templ &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; ml[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;ml[ls[x]]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;ml[rs[x]] &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; ml[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;ml[ls[x]];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; mr[rs[x]]&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;tempr &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; mr[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;mr[rs[x]]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;mr[ls[x]] &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; mr[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;mr[rs[x]];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; sl[ls[x]]&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;templ &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; sl[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;sl[ls[x]]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;sl[rs[x]] &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; sl[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;sl[ls[x]];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; sr[rs[x]]&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;tempr &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; sr[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;sr[rs[x]]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;sr[ls[x]] &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt; sr[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;sr[rs[x]];&lt;br /&gt;m[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;max(max(m[ls[x]],m[rs[x]]),mr[ls[x]]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;ml[rs[x]]);&lt;br /&gt;s[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;max(max(s[ls[x]],s[rs[x]]),sr[ls[x]]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;sl[rs[x]]);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;procedure&lt;/span&gt;&lt;span style="color: #000000;"&gt; build(a,b:longint);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    mid,x:longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;inc(tt); x:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;tt;&lt;br /&gt;l[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;a; r[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;b;&lt;br /&gt;c[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; d[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;false;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; b&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;a&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    n[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;dat[b]; s[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;n[x];&lt;br /&gt;    ml[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;n[x]; mr[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;n[x]; m[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;n[x];&lt;br /&gt;    sl[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;s[x]; sr[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;s[x];&lt;br /&gt;    exit &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;mid:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(a&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;b)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;ls[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;tt&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; build(a,mid);&lt;br /&gt;rs[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;tt&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; build(mid,b);&lt;br /&gt;update(x);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;procedure&lt;/span&gt;&lt;span style="color: #000000;"&gt; change(x,a,b,cx:longint);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    mid:longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;clean(x);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (a&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;l[x])&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt;(r[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;b)&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; c[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;cx&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    mid:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(l[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;r[x])&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; a&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;mid &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; change(ls[x],a,b,cx);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; b&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;mid &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; change(rs[x],a,b,cx);&lt;br /&gt;    update(x);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;procedure&lt;/span&gt;&lt;span style="color: #000000;"&gt; negate(x,a,b:longint);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    mid:longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;clean(x);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (a&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;l[x])&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt;(r[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;b)&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; c[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; c[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;c[x] &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; d[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;not&lt;/span&gt;&lt;span style="color: #000000;"&gt; d[x]&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    mid:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(l[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;r[x])&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; a&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;mid &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; negate(ls[x],a,b);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; b&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;mid &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; negate(rs[x],a,b);&lt;br /&gt;    update(x);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; query(x,a,b:longint):longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    mid:longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;clean(x);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (a&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;l[x])&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt;(r[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;b)&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; query:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;n[x]&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    mid:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(l[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;r[x])&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; query:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; a&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;mid &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; query:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;query&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;query(ls[x],a,b);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; b&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;mid &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; query:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;query&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;query(rs[x],a,b);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;procedure&lt;/span&gt;&lt;span style="color: #000000;"&gt; answer(x,a,b:longint);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    mid:longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;clean(x);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (a&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;l[x])&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt;(r[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;b)&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    rec:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;max(rec,max(m[x],last&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;ml[x]));&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; mr[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;r[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;l[x] &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; last:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;mr[x] &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; last:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;last&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;mr[x];&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    mid:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(l[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;r[x])&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; a&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;mid &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; answer(ls[x],a,b);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; b&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;mid &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; answer(rs[x],a,b);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;assign(input,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;GSS0.in&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;); reset(input);&lt;br /&gt;assign(output,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;GSS0.out&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;); rewrite(output);&lt;br /&gt;readln(p,q);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; p &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    read(dat[i]);&lt;br /&gt;build(&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;,p);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; q &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    readln(ch,x,y);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; ch &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;of&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;:change(&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,x,y&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;:change(&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,x,y&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;:negate(&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,x,y&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;:writeln(query(&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,x,y&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt; last:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; rec:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; answer(&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,x,y&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;); writeln(rec); &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;close(input); close(output);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;========================================================&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;二&lt;/strong&gt;&lt;strong&gt;.标记的本质与应用条件&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;虽然解决了这一个问题 但是这个问题的手法却不是很通用&lt;/p&gt;&lt;p&gt;首先 我们是直接根据两个操作得到了直接相关两个标记域 在很多问题中标记域通常是自己设计的&lt;/p&gt;&lt;p&gt;其次 这是一个双标记的问题 我们却把双标记通过处理转化为单标记&lt;/p&gt;&lt;p&gt;实际上很多双标记甚至是多标记问题是不能这样处理的&lt;/p&gt;&lt;p&gt;下面我们还是通过这个例子分析线段树&lt;strong&gt;标记的本质&lt;/strong&gt;和&lt;strong&gt;应用条件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;首先应用标记的初衷是为了不要对修改区间内的所有线段树节点修改&lt;/p&gt;&lt;p&gt;通过打一个标记的方法来保证每次只有LogN个节点被操作到&lt;/p&gt;&lt;p&gt;而剩余实际上要被执行修改的其他节点会在被访问的时候逐级传递祖先的标记 从而可以得到正确的答案域&lt;/p&gt;&lt;p&gt;由于最终打到这个节点的标记 是很多祖先的很多标记的综合&lt;/p&gt;&lt;p&gt;所以&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;标记的本质就是概括 在这个节点的 上一个答案域之后 来不及直接执行的 操作序列&lt;/strong&gt;&lt;strong&gt;的一个变量或几个变量&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;注意到上面蓝色粗体字 这记录了我们应用标记的几个关键点&lt;/p&gt;&lt;p&gt;*1*2:&lt;strong&gt;清空标记&lt;/strong&gt; *3:&lt;strong&gt;下传标记&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;由此我们得到应用标记的两个必要条件&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;1.标记域要能够和答案域快速合并 这样保证了清空标记域并得到新的答案域的时间复杂度&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;2.标记域要能够和标记域快速合并 这样保证了下传标记域得到新的儿子标记域的时间复杂度&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;有了样几个结论 我们就能很好的&lt;strong&gt;鉴别设计出的标记域是否能够解决问题&lt;/strong&gt;了&lt;/p&gt;&lt;p&gt;当然 分析得到一个适用的标记域并不是一件简单的事&lt;/p&gt;&lt;p&gt;除了&lt;strong&gt;一点灵感&lt;/strong&gt;之外 所以还要一个比较好的方法 我通常是&lt;strong&gt;分类讨论然后整理&lt;/strong&gt;的&lt;/p&gt;&lt;p&gt;下面通过一个我改编的题目 来介绍这个方法&lt;/p&gt;&lt;p&gt;========================================================&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;三.分类讨论的分析方法&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;我改编了GSS2这个问题 减少了很多离线手法和建模思考&lt;/p&gt;&lt;p&gt;但是我添加了一个操作 这使得这个问题的难度变大了不少 下面是这个题目&lt;/p&gt;&lt;p&gt;http://www.tyvj.cn:8080/Problem_Show.asp?id=1518&lt;/p&gt;&lt;p&gt;题目要求支持2个询问和2个操作&lt;/p&gt;&lt;p&gt;-----------------------------------------------------------------&lt;/p&gt;&lt;p&gt;Q X Y:询问从X到Y的区间的最大值&lt;br /&gt;A X Y:询问从X到Y的区间的历史最大值&lt;br /&gt;P X Y Z:从X到Y的区间内所有数增加Z&lt;br /&gt;C X Y Z:X到Y的区间内所有数变为Z&lt;/p&gt;&lt;p&gt;-----------------------------------------------------------------&lt;/p&gt;&lt;p&gt;我们逐步分析这个问题 注意到问题含有大量部分分&lt;/p&gt;&lt;p&gt;所以 不妨根据数据范围提示来慢慢分析 这样不但可以分块得到不同的数据 也可以帮助得到最终的解&lt;/p&gt;&lt;p&gt;其中前面4个数据是很基本的方法 略去不讨论&lt;/p&gt;&lt;p&gt;============&lt;/p&gt;&lt;p&gt;如果只包含C操作 Q询问和A询问 我们容易想到给每个节点维护两个标记域&lt;strong&gt;Cx&lt;/strong&gt;和&lt;strong&gt;C&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;C表示当前&lt;strong&gt;要把节点覆盖成C&lt;/strong&gt; Cx表示当前这个操作序列中&lt;strong&gt;曾经最大的C值&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;1.标记域与答案域合并&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;Ms*=Max{Ms',Cx}&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;Mc*=C|C&amp;lt;&amp;gt;-oo&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;2.标记域和标记域合并&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;Cx*=Max{Cx',Cx}&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;C*=C|C&amp;lt;&amp;gt;-oo&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;这样又可以得到24分 此时期望分数达到44分&lt;/p&gt;&lt;p&gt;不过代码量要加上前两个方面&lt;/p&gt;&lt;p&gt;============&lt;/p&gt;&lt;p&gt;而如果只包含P操作 Q询问和A询问&lt;/p&gt;&lt;p&gt;这只是GSS2问题的化简 做过GSS2的选手应该能很快解决 记录两个标记域Ds和Dc&lt;/p&gt;&lt;p&gt;D为把节点加上差值D Ds表示当前操作序列中曾经最大的D值&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;1.标记域与答案域合并&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;Ms*=Max{Ms',Mc'+Ds}&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;Mc*=Mc'+D&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;2.标记域和标记域合并&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;Ds*=Max{Ds',Dc'+Ds}&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;Dc*=Dc'+Dc&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;这样又可以得到26分 此时期望分数达到70分 可以只把前面24分的部分的标记部分修改&lt;/p&gt;&lt;p&gt;融入这一部分的标记 不过分开处理 代码量不会加大很多&lt;/p&gt;&lt;p&gt;============&lt;/p&gt;&lt;p&gt;最后我们分析所有操作俱全的情况&lt;/p&gt;&lt;p&gt;14分部分的思路 &lt;strong&gt;诱使我们思考设置C和Cx先处理&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果C和Cx不存在再处理Ds和Dc标记 不过很快会发现Ds域是&lt;strong&gt;必须维护&lt;/strong&gt;的&lt;/p&gt;&lt;p&gt;即使有C和Cx域 &lt;strong&gt;Ds仍然不会像Dc域一样被清除&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们给每个节点加上4个标记域&lt;/p&gt;&lt;p&gt;Ds表示历史上曾经的最大差量 Dc表示现在的差量 如果存在C和Cx 则Dc域不存在&lt;/p&gt;&lt;p&gt;C表示节点被覆盖为C Cx表示历史上最大的覆盖值 如果不存在C Cx也不存在&lt;/p&gt;&lt;p&gt;则存在两种标记情况&lt;strong&gt; Ds Cx C并存&lt;/strong&gt; 或者 &lt;strong&gt;Ds Dc并存&lt;/strong&gt; 分别记为&lt;strong&gt;A情况&lt;/strong&gt;和&lt;strong&gt;B情况&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011060419294333.jpg" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011060419295353.jpg" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;1.标记域与答案域合并&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;Ms*=Max{Ms',Mc'+Ds,Cx}&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;Mc*=Mc'+Dc|C=-oo 或 Mc=C|C&amp;lt;&amp;gt;-oo&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;2.标记域和标记域合并&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;A情况并上B情况 变成A情况&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;Ds*=Ds' ; Cx*=Max{C'+Ds,Cx'} ; C*=C'+Dc&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;B情况并上A情况 变成A情况&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;Ds*=Max{Ds',Dc'+Ds} ; Cx*=Cx ; C*=C ; DC*=0&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;A情况并上A情况 变成A情况&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;Ds*=Ds' ; Cx*=Max{Cx',C'+Ds,Cx} ; C*=C&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;B情况并上B情况 变成B情况&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;和GSS2的方式类似 不再赘述&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;上面就是分类讨论的典型过程 很多标记题通过一些经验 然后严密的论证就能得到很好的解决&lt;/p&gt;&lt;p&gt;以上4类情况没有配图 不过完全可以自己画出来 主要的递推式都给出了&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;其实思考线段树标记和思考DP的方程很类似 &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;具体代码可以化简不用明确分4类 总代码长度为180行&lt;/p&gt;&lt;p&gt;.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Booble/aggbug/2072724.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Booble/archive/2011/06/04/2072724.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Booble/archive/2011/06/03/2063678.html</id><title type="text">再解树形数据结构(一)</title><summary type="text">{最近做了很多有意思的数据结构问题在这里小结一下 顺便介绍一下数据结构问题的基本解决方法由于以前零零散散介绍过几部分数据结构所以标题就是 再解数据结构了由于碰到的问题基本都和树形结构脱不了干系这几段文章都是围绕树形数据结构的}=================吐槽的分割线====================在这神奇的世界上有个神奇的地方叫做Online Judge 简称OJ 是ACMER OIER打发寂寞空虚的地方在众多OJ中有两个神奇的OJ: SPOJ和SGUSGU是一个卡内存的地方 很多题目的内存少的可怜而SPOJ是一个卡常数的地方 很多很多理论复杂度很好的程序经常被判定为TLE原因就</summary><published>2011-06-03T06:26:00Z</published><updated>2011-06-03T06:26:00Z</updated><author><name>Master_Chivu</name><uri>http://www.cnblogs.com/Booble/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Booble/archive/2011/06/03/2063678.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Booble/archive/2011/06/03/2063678.html"/><content type="html">&lt;p&gt;{&lt;/p&gt;&lt;p&gt;最近做了很多有意思的&lt;strong&gt;数据结构&lt;/strong&gt;问题&lt;/p&gt;&lt;p&gt;在这里小结一下 顺便介绍一下数据结构问题的基本解决方法&lt;/p&gt;&lt;p&gt;由于以前零零散散介绍过几部分数据结构&lt;/p&gt;&lt;p&gt;所以标题就是 &lt;strong&gt;再解&lt;/strong&gt;数据结构了&lt;/p&gt;&lt;p&gt;由于碰到的问题基本都和树形结构脱不了干系&lt;/p&gt;&lt;p&gt;这几段文章都是围绕&lt;strong&gt;树形数据结构&lt;/strong&gt;的&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;em&gt;&lt;span style="text-decoration: underline;"&gt;=================吐槽的分割线====================&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;em&gt;在这神奇的世界上有个神奇的地方&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;em&gt;叫做Online Judge 简称OJ 是ACMER OIER打发寂寞空虚的地方&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;em&gt;在众多OJ中有两个神奇的OJ: SPOJ和SGU&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;em&gt;SGU是一个卡内存的地方 很多题目的内存少的可怜&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;em&gt;而SPOJ是一个卡常数的地方 很多很多理论复杂度很好的程序经常被判定为TLE&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;em&gt;原因就是测评机的速度不是一般的速度&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;em&gt;据神牛考证 以前可以AC的题 现在在SPOJ都面临AC不能的境遇&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;em&gt;可见SPOJ测评机的速度不仅慢 而且是一种动态的慢 越来越慢&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;em&gt;一句老话说得好 黑发不知勤学早 白首方悔读书迟 啊&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;em&gt;用在神奇的SPOJ上真是一点也不为过&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;em&gt;不过 和SGU相比 SPOJ倒是不卡内存的&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;em&gt;几百M的内存任你开 通常SPOJ上不会出现MLE这个错误&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;em&gt;取而代之的是TLE 因为开那么多内存&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;em&gt;再加上SPOJ测评机的神速 足以让测评机判定为TLE了&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;em&gt;与国外众多OJ相比 中国本土的OJ相对而言很和谐&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;em&gt;测评机速度快 网页也快 社会主义国家的OJ果然不一样&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&lt;em&gt;&lt;span style="text-decoration: underline;"&gt;=================吐槽的分割线====================&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;由于SPOJ的神奇......&lt;/p&gt;&lt;p&gt;在SPOJ上过一些有意思的题 也成了神奇的事情&lt;/p&gt;&lt;p&gt;本来很有意思的问题 解决的也比较顺利 应该算是一件很爽的事&lt;/p&gt;&lt;p&gt;但是SPOJ却常常卡一个正确程序的常数&lt;/p&gt;&lt;p&gt;辛苦了很久换来一个黄色的TLE &lt;strong&gt;实在不是什么好玩的事情&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;但是 值得肯定的是 &lt;span style="color: #000000;"&gt;&lt;strong&gt;SPOJ上确实有很多值得一做的题&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;所以这里介绍一下 不被神奇的SPOJ囧到的一个技巧...尽量使用&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;指针&lt;/strong&gt;&lt;/span&gt;!&lt;/p&gt;&lt;p&gt;=============================================&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;一.指针与数组&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;一般的树形数据结构都离开不了&lt;strong&gt;指针&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In computer science, a &lt;b&gt;pointer&lt;/b&gt; is a programming language data type whose value refers directly to (or "&lt;b&gt;points&lt;/b&gt; to") another value stored elsewhere in the computer memory using its address.&lt;/p&gt;&lt;p&gt;&lt;em&gt;(From: http://en.wikipedia.org/wiki/Pointer_%28computing%29 )&lt;/em&gt;&lt;/p&gt;&lt;p&gt;指针变量存储一个内存地址&lt;/p&gt;&lt;p&gt;非常形象地 指针变量的作用就好比一个导引方向的指针&lt;/p&gt;&lt;p&gt;利用指针 我们可以非常自由地组织内存中的数据&lt;/p&gt;&lt;p&gt;这无疑给我们实现各种数据结构都提供了方便&lt;/p&gt;&lt;p&gt;而&lt;strong&gt;数组&lt;/strong&gt; 则是另一种常用的数据类型&lt;/p&gt;&lt;p&gt;In computer science, an &lt;b&gt;array data structure&lt;/b&gt; or simply &lt;b&gt;array&lt;/b&gt; is a data structure consisting of a collection of elements (values or &lt;span class="mw-redirect"&gt;variables&lt;/span&gt;), each identified by at least one &lt;span class="mw-redirect"&gt;index&lt;/span&gt;. An array is stored so that the position of each element can be computed from its index tuple by a mathematical formula.&lt;a href="http://en.wikipedia.org/wiki/Array_data_structure#cite_note-0"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;(From: http://en.wikipedia.org/wiki/Array_data_structure )&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;用数组存储一段数据 可以让我们方便地检索第K个数据是什么&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;另外 作为一种几乎所有语言都支持的基本数据类型 利用数组的程序也可以很方便地调试&lt;/span&gt;&lt;/p&gt;&lt;p&gt;=============================================&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;二.利用数组和指针实现数据结构&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;以二叉排序树为例 介绍两种基本的实现方式&lt;/p&gt;&lt;p&gt;一种就是最最和谐的指针实现方式 通常教材上都是介绍的这种实现&lt;/p&gt;&lt;p&gt;一个二叉排序树的节点通常有三个域 即左儿子 右儿子 键值&lt;/p&gt;&lt;p&gt;而且保证左子树所有节点的键值都小于根节点的键值 右子树所有节点的键值都大于根节点的键值&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;typeBST=^BSTnode;&lt;br/&gt;BSTnode=record&lt;br/&gt;l,r:BST;&lt;br/&gt;n:longint;&lt;br/&gt;end;&lt;br/&gt;varroot:BST;&lt;br/&gt;begin&lt;br/&gt;new(root);&lt;br/&gt;root^.l:=nil; root^.r:=nil;&lt;br/&gt;root^.n:=1;&lt;br/&gt;end.&lt;br/&gt;&lt;/div&gt;&lt;p&gt;由于指针变量是一个内存地址 所以对于我们调试程序增加了难度&lt;/p&gt;&lt;p&gt;正是由于指针变量的调试不方便 在对某些数据结构不熟悉的情况下&lt;/p&gt;&lt;p&gt;我们可以使用一种折中的办法 &lt;strong&gt;数组模拟指针&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;注意到 &lt;strong&gt;数组下标&lt;/strong&gt;可以和&lt;strong&gt;内存地址&lt;/strong&gt;等价 我们可以用数组来模拟指针操作&lt;/p&gt;&lt;p&gt;所以上面的代码可以改写成这样&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;typeBSTnode=record&lt;br/&gt;l,r:longint;&lt;br/&gt;n:longint;&lt;br/&gt;end;&lt;br/&gt;varpool:array[1..100]of BSTnode;&lt;br/&gt;tt:longint;&lt;br/&gt;begin&lt;br/&gt;tt:=0;&lt;br/&gt;inc(tt); root:=tt;&lt;br/&gt;pool[root].l:=0; pool[root].r:=0;&lt;br/&gt;pool[root].n:=1;&lt;br/&gt;end.&lt;br/&gt;&lt;/div&gt;&lt;p&gt;为了方便书写 我们通常不是用record类型来定义&lt;/p&gt;&lt;p&gt;而是写成下面的样子 这样虽然结构松散 但是更加&lt;strong&gt;方便&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;varl,r,n:array[1..100]of longint;&lt;br/&gt;begin&lt;br/&gt;tt:=0;&lt;br/&gt;inc(tt); root:=tt;&lt;br/&gt;l[root]:=0; r[root]:=0;&lt;br/&gt;n[root]:=1;&lt;br/&gt;end;&lt;br/&gt;&lt;/div&gt;&lt;p&gt;=============================================&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;三.比较快的写法&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;上面两种写法 其实速度都不是很快 下面介绍一种我常用的速度还可以的写法&lt;/p&gt;&lt;p&gt;首先有一个结论 &lt;strong&gt;引用一次指针变量比引用一次数组变量要快&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这是因为: 数组在内存中是连续的一段 通常计算机存储数组都是存储一个数组头部地址&lt;/p&gt;&lt;p&gt;然后引用数组元素是把下标作为偏移量 用数组头部地址加偏移量 得到元素地址&lt;/p&gt;&lt;p&gt;所以 引用一次数组元素比 直接引用指针变量 &lt;strong&gt;多一次加法&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;加法是一种不可忽略的基本运算 尤其是在多次调用的时候&lt;/p&gt;&lt;p&gt;而实现数据结构 通常都会多次的引用节点信息 由此带来的就是&lt;strong&gt;多出上百万甚至是上千万级别的加法&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;所以我们要尽量使用指针来代替数组模拟 这样可以使程序速度得到明显的提高&lt;/p&gt;&lt;p&gt;然而 使用指针也有&lt;strong&gt;瓶颈&lt;/strong&gt; 就是每次给节点分配地址的操作New函数&lt;/p&gt;&lt;p&gt;借鉴上面数组模拟指针的实现 可以得到一个比较好的解决方法&lt;/p&gt;&lt;p&gt;分配数组的空间是分配一段连续内存 通常要比动态分配很多节点要快&lt;/p&gt;&lt;p&gt;&lt;strong&gt;只要预先开好一个内存池 然后利用尾指针++&lt;/strong&gt; 就可以不断得到新的节点&lt;/p&gt;&lt;p&gt;而且速度非常快 这样就可以得到一个比较完美的数据结构通用实现方法&lt;/p&gt;&lt;p&gt;基本代码如下:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;typeBST=^BSTnode&lt;br/&gt;BSTnode=record&lt;br/&gt;l,r:BST;&lt;br/&gt;n:longint;&lt;br/&gt;end;&lt;br/&gt;varBSTpool:array[0..100]of BSTnode;&lt;br/&gt;tt,root,null:BST;&lt;br/&gt;begin&lt;br/&gt;null:=@BSTpool[0];&lt;br/&gt;null^.l:=null; null^.r:=null;&lt;br/&gt;tt:=null;&lt;br/&gt;&lt;br/&gt;inc(tt); root:=tt;&lt;br/&gt;root^.l:=null; root^.r:=null;&lt;br/&gt;root^.n:=1;&lt;br/&gt;end.&lt;br/&gt;&lt;/div&gt;&lt;p&gt;其中null是一个&lt;strong&gt;哨兵节点&lt;/strong&gt; 可以&lt;strong&gt;减少对于空指针的特殊判断&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;@就是取变量地址的操作 以内存池的第一个节点作为哨兵节点&lt;/p&gt;&lt;p&gt;初始尾指针就是内存池的第一个节点&lt;/p&gt;&lt;p&gt;=============================================&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;四.指针与数组模拟指针的实践测试&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;为了更有力地证明指针和数组模拟指针的效率差距&lt;/p&gt;&lt;p&gt;我作了实际测试 测试代码是两棵写法一致 但是分别使用了指针和数组模拟指针的平衡树&lt;/p&gt;&lt;p&gt;测试结果如下:&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011060314173784.jpg" height="379" width="543" /&gt;&lt;/p&gt;&lt;p&gt;其中&lt;strong&gt;输入流由程序内部伪随机函数提供 输出流省略&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;所以测试直接针对两种不同实现的平衡二叉树&lt;/p&gt;&lt;p&gt;实测中 数组模拟指针实现的平衡二叉树比指针实现的速度&lt;strong&gt;要慢1/2左右&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;作为这一部分的序篇 主要介绍一些常数优化的方法&lt;/p&gt;&lt;p&gt;之后介绍一些有意思的数据结构问题&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Booble/aggbug/2063678.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Booble/archive/2011/06/03/2063678.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Booble/archive/2011/04/03/2004865.html</id><title type="text">[Poj 2187]计算几何之凸包(三) {旋转卡壳初步}</title><summary type="text">{上一节介绍了凸包的高效算法和一个最远点对的应用这一段将更好的解决最远点对问题}(若不做特殊说明 下文讨论的问题均是在欧氏空间若不做特殊说明 下文中距离均是指空间中欧氏距离)==============================一.简单枚举算法的不足上一次介绍了一个基本的求平面最远点对的算法即先求点集的凸包 然后枚举凸包上的点来求最远点集这是利用了凸包上的点相比 点集中的点 一般是很少的 平均情况很好 并且我们也能AC这个问题但是这是有局限性的 当凸包上的点达到O(N)的级别时 凸包的优化作用就不存在了不过我们还要考虑到 凸包还起了对凸包上点集排序的作用凸包有很多的优美的性质 我们可以加</summary><published>2011-04-03T14:19:00Z</published><updated>2011-04-03T14:19:00Z</updated><author><name>Master_Chivu</name><uri>http://www.cnblogs.com/Booble/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Booble/archive/2011/04/03/2004865.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Booble/archive/2011/04/03/2004865.html"/><content type="html">&lt;p&gt;{&lt;/p&gt;&lt;p&gt;上一节介绍了凸包的高效算法&lt;/p&gt;&lt;p&gt;和一个最远点对的应用&lt;/p&gt;&lt;p&gt;这一段将更好的解决最远点对问题&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;(若不做特殊说明 下文讨论的问题均是在欧氏空间&lt;/p&gt;&lt;p&gt;&amp;nbsp;若不做特殊说明 下文中距离均是指空间中欧氏距离)&lt;/p&gt;&lt;p&gt;==============================&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;一.简单枚举算法的不足&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;上一次介绍了一个基本的求&lt;strong&gt;平面最远点对&lt;/strong&gt;的算法&lt;/p&gt;&lt;p&gt;即先求点集的凸包 然后枚举凸包上的点来求最远点集&lt;/p&gt;&lt;p&gt;这是利用了凸包上的点相比 点集中的点 一般是很少的 平均情况&lt;span style="font-size: 14px;"&gt;很好&lt;/span&gt; 并且我们也能AC这个问题&lt;/p&gt;&lt;p&gt;但是这是有局限性的 当凸包上的点达到&lt;strong&gt;O(N)&lt;/strong&gt;的级别时 凸包的&lt;strong&gt;优化作用&lt;/strong&gt;就不存在了&lt;/p&gt;&lt;p&gt;不过我们还要考虑到 凸包还起了&lt;strong&gt;对凸包上点集排序的作用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;凸包有很多的优美的性质 我们可以加以利用 以得到更加高效的算法&lt;/p&gt;&lt;p&gt;&lt;strong&gt;旋转卡壳算法&lt;/strong&gt;就是利用凸包特性的一类解决问题的方法&lt;/p&gt;&lt;p&gt;==============================&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;二.旋转卡壳算法&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;旋转卡(qiǎ)壳算法&lt;/strong&gt;(Rotating Calipers Algorithm):&lt;/p&gt;&lt;p&gt;是解决一些与凸包有关问题的有效算法 就像一对卡壳卡住凸包旋转而得名&lt;/p&gt;&lt;p&gt;Every time one blade of the caliper lies flat against an edge of the polygon, it forms an antipodal pair with the point or edge touching the opposite blade. It turns out that the complete "rotation" of the caliper around the polygon detects all antipodal pairs and may be carried out in &lt;span class="mw-redirect"&gt;O(n)&lt;/span&gt; time.&lt;/p&gt;&lt;p&gt;&lt;a target="_blank" href="http://en.wikipedia.org/wiki/Rotating_calipers"&gt;http://en.wikipedia.org/wiki/Rotating_calipers&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011040318073013.gif" /&gt;&lt;/p&gt;&lt;p&gt;(图片来自:&lt;a href="http://cgm.cs.mcgill.ca/~orm/rotcal.html"&gt;http://cgm.cs.mcgill.ca/~orm/rotcal.html&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;被一对卡壳正好卡住的对应点对称为&lt;strong&gt;对踵点(&lt;span style="font-size: 14px;"&gt;Antipodal point&lt;/span&gt;)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a target="_blank" href="http://en.wikipedia.org/wiki/Antipodal_point"&gt;http://en.wikipedia.org/wiki/Antipodal_point&lt;/a&gt;&lt;/p&gt;&lt;p&gt;可以证明对踵点的个数不超过&lt;strong&gt;3N/2&lt;/strong&gt;个 也就是说对踵点的个数是&lt;strong&gt;O(N)&lt;/strong&gt;的&lt;/p&gt;&lt;p&gt;对踵点的个数也是我们下面解决问题时间复杂度的保证&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011040318174581.png" height="427" width="504" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011040318205530.png" height="415" width="503" /&gt;&lt;/p&gt;&lt;p&gt;上第一个图是卡壳的一般情况 卡住两点 图二是卡住&lt;strong&gt;一条边和一个点&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;由于实现中 卡住两点的情况不好处理 我们通常关注第二种情况&lt;/p&gt;&lt;p&gt;在第二种情况中 我们可以看到 &lt;strong&gt;一个对踵点和对应边之间的距离比其他点要大&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;也就是一个对踵点和对应边所形成的&lt;strong&gt;三角形&lt;/strong&gt;是最大的 下面我们会据此得到对踵点的简化求法&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011040319074871.png" /&gt;&lt;/p&gt;&lt;p&gt;看一下官方的伪代码:&lt;/p&gt;&lt;p&gt;当时我看完了 就一个字 &lt;span style="color: #000000;"&gt;&lt;strong&gt;长&lt;/strong&gt;&lt;/span&gt;... 我最讨厌冗长的程序了...&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;     p0:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;pn;&lt;br /&gt;     q:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;NEXT[p];&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; (Area(p,NEXT[p],NEXT[q]) &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; Area(p,NEXT[p],q)) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;          q:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;NEXT[q];&lt;br /&gt;          q0:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;q;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; (q !&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; p0) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;               &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                    p:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;NEXT[p];&lt;br /&gt;                    Print(p,q);&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; (Area(p,NEXT[p],NEXT[q]) &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; Area(p,NEXT[p],q) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                         &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                              q:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;NEXT[q];&lt;br /&gt;                              &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; ((p,q) !&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (q0,p0)) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; Print(p,q)&lt;br /&gt;                              &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; return&lt;br /&gt;                         &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (Area(p,NEXT[p],NEXT[q]) &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Area(p,NEXT[p],q)) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; ((p,q) !&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (q0,p0)) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; Print(p,NEXT[q])&lt;br /&gt;                      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; Print(NEXT[p],q)&lt;br /&gt;               &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;几经折腾 终于找到了一个不错的实现:&lt;a target="_blank" href="http://www.cnblogs.com/DreamUp/archive/2010/09/16/1828131.html"&gt;http://www.cnblogs.com/DreamUp/archive/2010/09/16/1828131.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;不过不是很好理解 这里作一下说明&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #000000;"&gt;ch[m&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;ch[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]; j:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; m &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; cross(ch[i],ch[j],ch[i&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;])&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;cross(ch[i],ch[j&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;],ch[i&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt; inc(j); &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; j&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;m &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; j:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;6&lt;/span&gt; &lt;span style="color: #000000;"&gt;    writeln(ch[i].x,' ',ch[i].y,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,ch[j].x,' ',ch[j].y);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;7&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;上面就是&lt;strong&gt;旋转卡壳寻找对踵点&lt;/strong&gt;的过程&lt;/p&gt;&lt;p&gt;其中叉积函数Cross(A,B,C:Point):Real 返回AB到AC的二维定义下的叉积&lt;/p&gt;&lt;p&gt;这里主要用到了叉积求三角形面积的功能&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011040319405316.png" /&gt;&lt;/p&gt;&lt;p&gt;我们对于一条对应边&amp;lt;CH&lt;span style="font-size: 12px;"&gt; i&lt;/span&gt;,CH&lt;span style="font-size: 12px;"&gt; Next[i]&lt;/span&gt;&amp;gt;求出距离这条边最远的点CH &lt;span style="font-size: 12px;"&gt;j&lt;/span&gt;&lt;/p&gt;&lt;p&gt;则由上面第二种情况可知 CH i 和 CH j 为一对对踵点 这样让 CH i &lt;strong&gt;绕行凸包一周&lt;/strong&gt;即可得到所有的对踵点&lt;/p&gt;&lt;p&gt;下面面这个图 由于本人的gif图制作水平拙劣 所以不好看&lt;/p&gt;&lt;p&gt;需要的可以下载几何画板察看原版GSP文件 &lt;a target="_blank" href="http://files.cnblogs.com/Booble/RCpp.rar"&gt;点击这里&lt;/a&gt;下载GSP文件&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011040321530938.gif" /&gt;&lt;/p&gt;&lt;p&gt;接下来考虑 如何得到距离每条对应边的的最远点呢?&lt;/p&gt;&lt;p&gt;稍加分析 我们可以发现 凸包上的点依次与对应边产生的距离成&lt;strong&gt;单峰函数&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;具体证明可以从凸包定义入手 用反证法解决&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011040322065770.png" /&gt;&lt;/p&gt;&lt;p&gt;这样我们再找到一个点 &lt;strong&gt;使下一个点的距离小于当前的点时就可以停止了&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;而且随着对应边的旋转 最远点也只会顺着这个方向旋转 我们可以&lt;strong&gt;从上一次的对踵点开始继续寻找这一次的&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;由于内层while循环的执行次数取决于j&lt;strong&gt;增加次数&lt;/strong&gt; j最多增加&lt;strong&gt;O(N)&lt;/strong&gt;次&lt;/p&gt;&lt;p&gt;所以求出所有对踵点的时间复杂度为&lt;strong&gt;O(N)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;还有有两点需要注意:&lt;/p&gt;&lt;p&gt;1.上面这段代码及代码的分析都是需要凸包上没有三点共线的&lt;/p&gt;&lt;p&gt;2.Next[i] 不需要手动求 在原代码中有很好的处理&lt;/p&gt;&lt;p&gt;最后指出网上很多文章的一个错误 一个点的对踵点并不是离这个点最远的点!&lt;/p&gt;&lt;p&gt;这样子的点对是根本不满足对踵点的性质的 即最为重要的单峰分布性质&lt;/p&gt;&lt;p&gt;下图是一个反例:&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011040322144419.png" /&gt;&lt;/p&gt;&lt;p&gt;==============================&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;三.旋转卡壳算法的简单应用&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;至此我们终于可以更高效的解决平面最远点对问题了&lt;/p&gt;&lt;p&gt;有一个很重要的结论是 &lt;strong&gt;最远点对必然属于对踵点对集合&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;那么我们先求出凸包 然后求出对踵点对集合 然后选出距离最大的即可&lt;/p&gt;&lt;p&gt;用这个算法可以47ms AC这个问题 算上凸包的时间 总复杂度为O(Nlog&lt;span style="font-size: 12px;"&gt;2&lt;/span&gt;N)&lt;/p&gt;&lt;p&gt;代码如下:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('5b3f8e29-b1a3-48ed-96d6-faf9b267a988')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_5b3f8e29-b1a3-48ed-96d6-faf9b267a988" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_5b3f8e29-b1a3-48ed-96d6-faf9b267a988" onclick="cnblogs_code_hide('5b3f8e29-b1a3-48ed-96d6-faf9b267a988',event)" style="display: none;" /&gt;&lt;div id="cnblogs_code_open_5b3f8e29-b1a3-48ed-96d6-faf9b267a988" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;span style="color: #008000;"&gt;{&lt;/span&gt;&lt;span style="color: #008000;"&gt;$inline on&lt;/span&gt;&lt;span style="color: #008000;"&gt;}&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;{&lt;/span&gt;&lt;span style="color: #008000;"&gt;$optimization on&lt;/span&gt;&lt;span style="color: #008000;"&gt;}&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;    maxn&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;50000&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;type&lt;/span&gt;&lt;span style="color: #000000;"&gt;    point&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;record&lt;/span&gt;&lt;span style="color: #000000;"&gt; x,y:longint; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    n,i,x,m,ans,j:longint;&lt;br /&gt;    ch,p:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;..maxn&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;of&lt;/span&gt;&lt;span style="color: #000000;"&gt; point;&lt;br /&gt;    s:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;..maxn]&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;of&lt;/span&gt;&lt;span style="color: #000000;"&gt; longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; cross(a,b,c:point):longint; inline;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;cross:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(b.x&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;a.x)&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;(c.y&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;a.y)&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;(b.y&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;a.y)&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;(c.x&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;a.x);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; dist(a,b:point):longint; inline;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;dist:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;sqr(a.x&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;b.x)&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;sqr(a.y&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;b.y);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; cmp(a,b:point):boolean; inline;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;cmp:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(a.x&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;b.x)&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;or&lt;/span&gt;&lt;span style="color: #000000;"&gt;(a.x&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;b.x)&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt;(a.y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;b.y);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; max(a,b:longint):longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; a&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;b &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; max:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;a &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; max:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;b;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;procedure&lt;/span&gt;&lt;span style="color: #000000;"&gt; swap(a,b:longint); inline;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    x:point;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;x:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;p[a]; p[a]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;p[b]; p[b]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;x;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;procedure&lt;/span&gt;&lt;span style="color: #000000;"&gt; hull(l,r:longint; a,b:point);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    x,i,j,k:longint;&lt;br /&gt;    y:point;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;x:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;l; y:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;p[l];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; k:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;l &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; r &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (s[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;s[k])&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;or&lt;/span&gt;&lt;span style="color: #000000;"&gt;(s[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;s[k])&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt;(cmp(y,p[k]))&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt; x:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;k; y:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;p[k]; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;l&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; j:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;r&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; k:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;l &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; r &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    inc(i); s[i]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;cross(p[k],a,y);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; s[i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; swap(i,k) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; dec(i);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; k:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;r &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;downto&lt;/span&gt;&lt;span style="color: #000000;"&gt; l &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    dec(j); s[j]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;cross(p[k],y,b);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; s[j]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; swap(j,k) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; inc(j);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; l&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;i &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; hull(l,i,a,y);&lt;br /&gt;inc(m); ch[m]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;y;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; j&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;r &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; hull(j,r,y,b);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;assign(input,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Maxd.in&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;); reset(input);&lt;br /&gt;assign(output,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Maxd.out&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;); rewrite(output);&lt;br /&gt;readln(n);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; n &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    readln(p[i].x,p[i].y);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (x&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;or&lt;/span&gt;&lt;span style="color: #000000;"&gt; cmp(p[i],p[x]) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; x:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;i;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;swap(&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,x);&lt;br /&gt;m:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; ch[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]; hull(&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;,n,p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;],p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br /&gt;ch[m&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;ch[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]; j:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;; ans:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; m &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; cross(ch[i],ch[j],ch[i&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;])&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;cross(ch[i],ch[j&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;],ch[i&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt; inc(j); &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; j&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;m &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; j:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    ans:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;max(ans,dist(ch[i],ch[j]));&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;writeln(ans);&lt;br /&gt;close(input); close(output);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;下一节介绍旋转卡壳的更多应用&lt;/p&gt;&lt;p&gt;之后开始介绍一点3D凸包&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Booble/aggbug/2004865.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Booble/archive/2011/04/03/2004865.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Booble/archive/2011/03/10/1980089.html</id><title type="text">[Poj 2187] 计算几何之凸包(二) {更高效的算法}</title><summary type="text">{承上一节继续介绍点集的凸包(下文中所有凸包 若不做特殊说明均指点集的凸包)这一节介绍相比更高效的算法}====================================================================一.卷包裹算法(Gift Wrapping Algorithm)的特性前面提到过卷包裹算法的复杂度问题由于卷包裹算法是两重循环实现的 因此很好分析它的复杂度 1 while true do 2 begin 3 k:=0; 4 inc(m); ch[m]:=j; 5 for i:=1 to n do 6 if (i&lt;&gt;j)and((k=0)or 7</summary><published>2011-03-10T13:22:00Z</published><updated>2011-03-10T13:22:00Z</updated><author><name>Master_Chivu</name><uri>http://www.cnblogs.com/Booble/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Booble/archive/2011/03/10/1980089.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Booble/archive/2011/03/10/1980089.html"/><content type="html">&lt;p&gt;{&lt;/p&gt;&lt;p&gt;承上一节&lt;/p&gt;&lt;p&gt;继续介绍点集的凸包&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;(下文中所有凸包 若不做特殊说明均指点集的凸包)&lt;/p&gt;&lt;p&gt;这一节介绍相比更高效的&lt;strong&gt;算法&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;====================================================================&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;一.卷包裹算法(Gift Wrapping Algorithm)的特性&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;前面提到过卷包裹算法的&lt;strong&gt;复杂度问题&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;由于卷包裹算法是&lt;strong&gt;两重循环&lt;/strong&gt;实现的 因此很好分析它的复杂度&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; true &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;    k:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;    inc(m); ch[m]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;j;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; n &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (i&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;j)&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt;((k&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;or&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;        cmp(p[j],p[k],p[i]))&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; k:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;i;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; k&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;temp &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; break;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;    j:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;k;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;内部循环N次 外循环的次数决定于凸包上的点数H&lt;/p&gt;&lt;p&gt;所以卷包裹算法复杂度为&lt;strong&gt;O(HN)&lt;/strong&gt; 这个复杂度很有特点&lt;/p&gt;&lt;p&gt;考虑一个随机点集的凸包上的点数&lt;strong&gt;往往很少&lt;/strong&gt; 但是最坏情况下是&lt;strong&gt;O(N)&lt;/strong&gt;级别的&lt;/p&gt;&lt;p&gt;比如所有的点都&lt;strong&gt;在一个圆上&lt;/strong&gt;的时候&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011031016315419.png" height="371" width="384" /&gt;&lt;/p&gt;&lt;p&gt;这就决定了卷包裹算法&lt;strong&gt;很适合随机的点集&lt;/strong&gt; 但是如果是&lt;strong&gt;刻意构造的数据&lt;/strong&gt;或是比较特殊的数据&lt;/p&gt;&lt;p&gt;就会达到&lt;strong&gt;O(N^2)&lt;/strong&gt;的&lt;strong&gt;最坏复杂度&lt;/strong&gt; 这是我们不愿意看到的&lt;/p&gt;&lt;p&gt;下面介绍最坏情况下复杂度更好的Graham扫描算法(Graham Scan Algorithm)&lt;/p&gt;&lt;p&gt;====================================================================&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;二.Graham扫描算法(Graham Scan Algorithm)&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Graham扫描算法维护一个&lt;strong&gt;凸壳&lt;/strong&gt; 通过不断在凸壳中&lt;strong&gt;加入新的点&lt;/strong&gt;和去除&lt;strong&gt;影响凸性&lt;/strong&gt;的点 最后形成凸包&lt;/p&gt;&lt;p&gt;The Graham scan is a method of computing the convex hull of a finite set of points in the plane with time complexity O(n log n). It is named after Ronald Graham, who published the original algorithm in 1972.[1] The algorithm finds all vertices of the convex hull ordered along its boundary.&lt;/p&gt;&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Graham_scan"&gt;http://en.wikipedia.org/wiki/Graham_scan&lt;/a&gt;&lt;/p&gt;&lt;p&gt;算法主体由两部分组成 先是&lt;strong&gt;排序&lt;/strong&gt; 后是&lt;strong&gt;扫描&lt;/strong&gt; 分块讲解一下&lt;/p&gt;&lt;p&gt;----------------------------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1.点集排序&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;为了得到加入新点的顺序 Graham扫描法的第一步是对点集排序 &lt;/p&gt;&lt;p&gt;排序是对杂乱的点集进行了&lt;strong&gt;梳理&lt;/strong&gt; 这也是这种算法能够得到更高效率的根本原因&lt;/p&gt;&lt;p&gt;排序的方法也有两种 &lt;strong&gt;极角坐标排序(极角序)&lt;/strong&gt; 和 &lt;strong&gt;直角坐标排序(水平序)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;前者&lt;strong&gt;好理解&lt;/strong&gt;一些 但是在实现的时候 后者&lt;strong&gt;更方便&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;先说极角序 为了极角排序 我们先得得到一个参考点&lt;/p&gt;&lt;p&gt;一般的 我们取最左边(横坐标最小)的点作为&lt;strong&gt;参考点&lt;/strong&gt; 如果有多个这样的点就取最下面的(纵坐标最小)&lt;/p&gt;&lt;p&gt;看这样一个例子 这是一个任意给出的平面点集:&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011031017121366.png" height="361" width="461" /&gt;&lt;/p&gt;&lt;p&gt;参考点的&lt;strong&gt;定义&lt;/strong&gt;:在&lt;strong&gt;横坐标最小&lt;/strong&gt;的情况下取&lt;strong&gt;纵坐标最小&lt;/strong&gt;的点&lt;/p&gt;&lt;p&gt;所以所有的点只能在这个&lt;strong&gt;黄色的半平面&lt;/strong&gt;中 而且&lt;strong&gt;正上方为闭(可取得) 正下方为开(不可取)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这就决定了参考点的&lt;strong&gt;性质&lt;/strong&gt;:点集中&lt;strong&gt;任意两点&lt;/strong&gt;和参考点所成的到角为&lt;strong&gt;锐角&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这样我们取得参考点 然后再考虑极角排序&lt;/p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011031017221378.png" height="361" width="461" /&gt;&lt;br /&gt;&lt;p&gt;极角排序以参考点为&lt;strong&gt;极角坐标系原点&lt;/strong&gt; 各个点的&lt;strong&gt;极角&lt;/strong&gt;为关键字&lt;/p&gt;&lt;p&gt;由于上面我们得到的参考点的性质 我们可以设所有点的极角&lt;strong&gt;均在(-90,90]之间&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;排序完成后应该是这样的:&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011031017323131.png" height="361" width="461" /&gt;&lt;/p&gt;&lt;p&gt;比较极角我们仍然可以利用&lt;strong&gt;向量的叉积&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;叉积在这里已经介绍了 &lt;a href="http://www.cnblogs.com/Booble/archive/2011/02/28/1967179.html"&gt;http://www.cnblogs.com/Booble/archive/2011/02/28/1967179.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;同样由于参考点的性质 所有向量之间的到角都是在&lt;strong&gt;180度以内&lt;/strong&gt; 不会产生错误&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011031017491387.png" height="361" width="461" /&gt;&lt;/p&gt;&lt;p&gt;----------------------------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.Graham的栈扫描&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Graham的扫描是一个很优美的过程 用到的数据结构也很简单 仅仅是一个栈而已&lt;/p&gt;&lt;p&gt;核心的思想是按照排好的序 依次加入新点得到新的边&lt;/p&gt;&lt;p&gt;如果和上一条边&lt;strong&gt;成左转关系就压栈继续&lt;/strong&gt; 如果右转就&lt;strong&gt;弹栈直到和栈顶两点的边成左转关系 压栈继续&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;实现的时候我们不用存边 只需要含顺序在栈里存点 相邻两点就是一条边&lt;/p&gt;&lt;p&gt;由于我们&lt;strong&gt;时时刻刻都保证栈内是一个凸壳&lt;/strong&gt; 所以最后扫描完毕 就得到了一个凸包&lt;/p&gt;&lt;p&gt;下面还是继续上面的那个样例 演示一下栈扫描的过程&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011031018085630.png" height="361" width="461" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011031018193031.png" height="361" width="461" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011031018230049.png" height="361" width="461" /&gt;&lt;/p&gt;&lt;p&gt;这样Graham扫描算法基本完成&lt;/p&gt;&lt;p&gt;复杂度是&lt;strong&gt;排序O(Nlog&lt;span style="font-size: 12px;"&gt;2&lt;/span&gt;N) 扫描O(N)&lt;/strong&gt; {每个点仅仅出入栈一次}&lt;/p&gt;&lt;p&gt;合起来是一个O(Nlog&lt;span style="font-size: 12px;"&gt;2&lt;/span&gt;N)的算法 很优秀&lt;/p&gt;&lt;p&gt;&amp;nbsp;----------------------------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3.双重共线点难题&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;和卷包裹算法一样 我们同样还要考虑共线点问题&lt;/p&gt;&lt;p&gt;而且Graham扫描算法的&lt;strong&gt;共线问题更复杂&lt;/strong&gt; 所以需要仔细考虑&lt;/p&gt;&lt;p&gt;&lt;strong&gt;i).排序时的共线问题&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011031019520655.png" height="368" width="461" /&gt;&lt;/p&gt;&lt;p&gt;如果极角相同 我们应该怎么定先后呢?&lt;/p&gt;&lt;p&gt;我们得加上&lt;strong&gt;第二关键字距离&lt;/strong&gt; 比如极角相同 距离参考点近的先&lt;/p&gt;&lt;p&gt;不过不管是近的先还是 远的先 开始和结束的两条边&lt;strong&gt;总是矛盾&lt;/strong&gt;的&lt;/p&gt;&lt;p&gt;我们必须对其中一条特殊处理 除了&lt;strong&gt;结束边外距离近的先 结束边上距离远的先&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这就是为什么极角排序不是很好实现的原因了 下面会介绍一下&lt;strong&gt;水平序&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ii).扫描时的共线问题&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个和卷包裹算法的处理放法如出一辙&lt;/p&gt;&lt;p&gt;如果需要保留共线的点就在到角相同时取距离最近的&lt;/p&gt;&lt;p&gt;如果仅仅需要凸包极点就取距离最远的&lt;/p&gt;&lt;p&gt;----------------------------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4.直角坐标排序(水平序)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;直角坐标排序方法没有了极角排序的不足&lt;/p&gt;&lt;p&gt;以横坐标为第一关键字 纵坐标为第二关键字 排序点集&lt;/p&gt;&lt;p&gt;然后从第一个点开始 分别利用Graham扫描生成&lt;strong&gt;左链&lt;/strong&gt;和&lt;strong&gt;右链&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;需要注意以下两点:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;i).左链和右链的旋转方向是相反的&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ii).注意生成第二条链要忽略第一条链上的点&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011031020105070.png" /&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;由于水平序的&lt;strong&gt;CMP函数&lt;/strong&gt;比较简单 代码也更短&lt;/p&gt;&lt;p&gt;还有一件有意思的事 Graham扫描算法是1972年提出的 卷包裹算法是1973年提出的&lt;/p&gt;&lt;p&gt;其实不奇怪 &lt;span style="color: #00ffff;"&gt;&lt;strong&gt;这两个算法本来也没有优劣 所用的思想不同 各自善于处理不同的情况&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Graham扫描所用时间在点集随机时 还不如卷包裹算法快&lt;/p&gt;&lt;p&gt;正如第一节所说 卷包裹算法已经可以处理大部分情况 也是一个&lt;strong&gt;可取的算法&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;实际应用中点集&lt;strong&gt;更趋向于均匀&lt;/strong&gt; 而不是集中在凸包上&lt;/p&gt;&lt;p&gt;----------------------------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;最后给一下比较难实现的极角排序代码&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('bcfb5705-b860-4232-bdbf-3aa50fcaf918')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_bcfb5705-b860-4232-bdbf-3aa50fcaf918" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_bcfb5705-b860-4232-bdbf-3aa50fcaf918" onclick="cnblogs_code_hide('bcfb5705-b860-4232-bdbf-3aa50fcaf918',event)" style="display: none;" /&gt;&lt;div id="cnblogs_code_open_bcfb5705-b860-4232-bdbf-3aa50fcaf918" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;span style="color: #008000;"&gt;{&lt;/span&gt;&lt;span style="color: #008000;"&gt;$inline on&lt;/span&gt;&lt;span style="color: #008000;"&gt;}&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;    zero&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1e-6&lt;/span&gt;&lt;span style="color: #000000;"&gt;; maxn&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;100000&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;type&lt;/span&gt;&lt;span style="color: #000000;"&gt;    point&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;record&lt;/span&gt;&lt;span style="color: #000000;"&gt; x,y:extended; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    p,ch:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;..maxn]&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;of&lt;/span&gt;&lt;span style="color: #000000;"&gt; point;&lt;br /&gt;    i,j,n,m,temp:longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; sgn(x:extended):longint; inline;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; abs(x)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;zero &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; exit(&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; x&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; sgn:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; sgn:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; cross(a,b,c,d:point):extended; inline;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;cross:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(b.x&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;a.x)&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;(d.y&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;c.y)&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;(d.x&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;c.x)&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;(b.y&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;a.y);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; dist(a,b:point):extended; inline;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;dist:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;sqr(a.x&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;b.x)&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;sqr(a.y&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;b.y);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; cmp1(a,b,c:point):boolean; inline;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    temp:longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;temp:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;sgn(cross(a,b,a,c));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; temp&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; exit(temp&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;); &lt;/span&gt;&lt;span style="color: #008000;"&gt;{&lt;/span&gt;&lt;span style="color: #008000;"&gt;*B&lt;/span&gt;&lt;span style="color: #008000;"&gt;}&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;cmp1:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;dist(a,b)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;dist(a,c);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; cmp2(a,b,c:point):boolean; inline;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    temp:longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;temp:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;sgn(cross(a,b,b,c));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; temp&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; exit(temp&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;); &lt;/span&gt;&lt;span style="color: #008000;"&gt;{&lt;/span&gt;&lt;span style="color: #008000;"&gt;*B&lt;/span&gt;&lt;span style="color: #008000;"&gt;}&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;cmp2:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;dist(a,b)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;dist(a,c); &lt;/span&gt;&lt;span style="color: #008000;"&gt;{&lt;/span&gt;&lt;span style="color: #008000;"&gt;*A&lt;/span&gt;&lt;span style="color: #008000;"&gt;}&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;procedure&lt;/span&gt;&lt;span style="color: #000000;"&gt; swap(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; a,b:point); inline;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    temp:point;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;temp:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;a; a:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;b; b:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;temp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;procedure&lt;/span&gt;&lt;span style="color: #000000;"&gt; sort(l,r:longint);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    i,j:longint;&lt;br /&gt;    x:point;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;l; j:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;r;&lt;br /&gt;x:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;p[(l&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;r)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;repeat&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; cmp1(p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;],p[i],x) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt; inc(i);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; cmp1(p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;],x,p[j]) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt; dec(j);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;not&lt;/span&gt;&lt;span style="color: #000000;"&gt;(i&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;j)&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    swap(p[i],p[j]);&lt;br /&gt;    inc(i); dec(j);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;until&lt;/span&gt;&lt;span style="color: #000000;"&gt; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;j;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;r &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; sort(i,r);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; l&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;j &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; sort(l,j);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;assign(input,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Hull.in&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;); reset(input);&lt;br /&gt;assign(output,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Hull2.out&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;); rewrite(output);&lt;br /&gt;readln(n);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; n &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    readln(p[i].x,p[i].y);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (p[i].x&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;].x)&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;or&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    (sgn(p[i].x&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;].x)&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt;(p[i].y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;].y)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; swap(p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;],p[i]);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;sort(&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;,n);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; sgn(cross(p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;],p[i],p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;],p[i&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]))&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; break; dec(i);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;temp:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(i&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;n&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; j:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;n &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;downto&lt;/span&gt;&lt;span style="color: #000000;"&gt; temp &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    swap(p[j],p[i&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;n&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;j]);&lt;br /&gt;m:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; ch[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;inc(n); p[n]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; n &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; m&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;not&lt;/span&gt;&lt;span style="color: #000000;"&gt; cmp2(ch[m&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;],ch[m],p[i])&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; break; dec(m);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    inc(m); ch[m]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;p[i];&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; m&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    writeln(ch[i].x:&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,ch[i].y:&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;close(input); close(output);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;A Change Direction&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;B Remove Colinear Points&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;====================================================================&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;三.快速凸包算法(Quickhull Algorithm)&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;对比Graham扫描算法和卷包裹算法&lt;/p&gt;&lt;p&gt;我们发现 Graham扫描算法在凸包上的点很密集时仍然适用&lt;/p&gt;&lt;p&gt;卷包裹算法在凸包上点集随机分布时是很高效的&lt;/p&gt;&lt;p&gt;那么有没有两个优点都具备的算法呢?&lt;/p&gt;&lt;p&gt;是有的! &lt;span style="color: #000000;"&gt;&lt;strong&gt;快速凸包算法(Quickhull Algorithm)&lt;/strong&gt;&lt;/span&gt;就是这样的一个算法&lt;/p&gt;&lt;p&gt;快速凸包算法是一个&lt;strong&gt;和快速排序(Quicksort Algorithm)神似&lt;/strong&gt;的算法&lt;/p&gt;&lt;p&gt;尽管快速排序的最坏复杂度可以达到O(N^2)&lt;/p&gt;&lt;p&gt;但是有着极小的常数 实现方便 思路优美 绝大多数情况特别高效的快速排序 还是赢得了更多人的青睐&lt;/p&gt;&lt;p&gt;快速凸包算法也是这样 尽管可以构造一个数据使之达到O(N^2)的复杂度&lt;/p&gt;&lt;p&gt;但这需要刻意针对程序经过分析 才能做到 是实际应用中根本不会碰到的情况&lt;/p&gt;&lt;p&gt;在点集&lt;strong&gt;均匀分布&lt;/strong&gt;时 快速凸包的复杂度更是达到了&lt;strong&gt;O(N)&lt;/strong&gt; 是上面两种算法难以企及的&lt;/p&gt;&lt;p&gt;在绝大多数情况下 &lt;strong&gt;平均复杂度是O(Nlog&lt;span style="font-size: 12px;"&gt;2&lt;/span&gt;N)&lt;/strong&gt; 也很高效&lt;/p&gt;&lt;p&gt;快速凸包继承了快速排序&lt;strong&gt;分治&lt;/strong&gt;的思想 这是一个&lt;strong&gt;递归&lt;/strong&gt;的过程&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011031021105993.png" /&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011031021110691.png" /&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011031021111384.png" /&gt;&lt;/p&gt;&lt;p&gt;------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011031021111976.png" /&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011031021112572.png" /&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011031021113270.png" /&gt;&lt;/p&gt;&lt;p&gt;伪代码如下:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; 快速凸包(P:点集 , S:向量 &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;S.p,S.q:点)&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt; ){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; P 在 S 左侧&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;选取 P 中距离 S 最远的 点 Y ;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;向量 A &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; { S.p , Y } ; 向量 B &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; { Y , S.q } ;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;点集 Q &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; 在 P 中 且在 A 左侧的点 ;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;点集 R &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; 在 P 中 且在 B 左侧的点 ; &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 划分 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;快速凸包 ( Q , A ) ; &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 分治 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;输出 (点 Y) ; &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 按中序输出 保证顺序&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;快速凸包 ( P , B ) ; &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 分治 &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;初始化就选取 &lt;strong&gt;最左下和最右上的点 划分好&lt;/strong&gt; 然后调用两次快速凸包函数&lt;strong&gt;分别求上下凸包&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;其中 选取和划分都需要用到&lt;strong&gt;向量的叉乘&lt;/strong&gt; 注意方向&lt;/p&gt;&lt;p&gt;另外 存储点集可以用&lt;strong&gt;数组里的连续一段 传参的时候就传左右下标&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;划分的时候就是给数组&lt;strong&gt;交换元素&lt;/strong&gt; 使新的点集 变成&lt;strong&gt;连续的一段&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这里有一个很好的演示&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cs.princeton.edu/courses/archive/spr10/cos226/demo/ah/QuickHull.html"&gt;http://www.cs.princeton.edu/courses/archive/spr10/cos226/demo/ah/QuickHull.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;还要补充说明一下&lt;/p&gt;&lt;p&gt;快速凸包在所有点都在圆周上的时候还是O(Nlog2N) 不过会比Graham扫描算法&lt;strong&gt;慢一些&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;可以说 这种数据&lt;strong&gt;是Graham扫描法的最好情况&lt;/strong&gt; 一遍走完就行了&lt;/p&gt;&lt;p&gt;构造快速凸包的最坏情况就是使&lt;strong&gt;划分不均等&lt;/strong&gt; 和构造快速排序最坏情况一样&lt;/p&gt;&lt;p&gt;贴以下我很辛苦写出来的代码吧 为了好看些 还心血来潮用cpp写了...&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('0d89ff8d-9b81-4d2b-8d64-f1800310e1b0')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_0d89ff8d-9b81-4d2b-8d64-f1800310e1b0" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_0d89ff8d-9b81-4d2b-8d64-f1800310e1b0" onclick="cnblogs_code_hide('0d89ff8d-9b81-4d2b-8d64-f1800310e1b0',event)" style="display: none;" /&gt;&lt;div id="cnblogs_code_open_0d89ff8d-9b81-4d2b-8d64-f1800310e1b0" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;iostream&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;math.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt;&lt;span style="color: #000000;"&gt; maxn 100000&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt;&lt;span style="color: #000000;"&gt; zero 1e-12&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt;&lt;span style="color: #000000;"&gt; sgn(x) (fabs(x)&amp;lt;zero?0:(x&amp;gt;0?1:-1))&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt;&lt;span style="color: #000000;"&gt; cross(a,b,c) ((b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x))&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt;&lt;span style="color: #000000;"&gt; cmp(a,b) (a.x&amp;lt;b.x || sgn(a.x-b.x)==0 &amp;amp;&amp;amp; a.y&amp;lt;b.y)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; std;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt;&lt;span style="color: #000000;"&gt; point{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt;&lt;span style="color: #000000;"&gt; x,y;&lt;br /&gt;}p[maxn];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt;&lt;span style="color: #000000;"&gt; s[maxn];&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; hull(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; l,&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; r,point a,point b){&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; x&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;l,i&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;l&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,j&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;r&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,k;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (k&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;l;k&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;r;k&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;){&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt;&lt;span style="color: #000000;"&gt; temp&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;sgn(s[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;s[k]);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (temp&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt; temp&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; cmp(p[x],p[k])) x&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;k;&lt;br /&gt;    }&lt;br /&gt;    point y&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;p[x];&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (k&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;l;k&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;r;k&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;){&lt;br /&gt;        s[&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;cross(p[k],a,y);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (sgn(s[i])&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;) swap(p[i],p[k]); &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (k&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;r;k&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;l;k&lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #000000;"&gt;){&lt;br /&gt;        s[&lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #000000;"&gt;j]&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;cross(p[k],y,b);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (sgn(s[j])&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;) swap(p[j],p[k]); &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; j&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (l&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;i) hull(l,i,a,y);&lt;br /&gt;    printf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%.4lf %.4lf\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,y.x,y.y);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (j&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;r) hull(j,r,y,b);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; main(){&lt;br /&gt;    freopen(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CH2D.in&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;r&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,stdin);&lt;br /&gt;    freopen(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CH2D1.out&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;w&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,stdout);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; n,i,x&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    scanf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;n);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (i&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;i&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;n;i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;){&lt;br /&gt;        scanf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%lf %lf&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;p[i].x,&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;p[i].y);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (x&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt; cmp(p[i],p[x])) x&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;i;&lt;br /&gt;    }&lt;br /&gt;    swap(p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;],p[x]);&lt;br /&gt;    printf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%.4lf %.4lf\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;].x,p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;].y);&lt;br /&gt;    hull(&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;,n,p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;],p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;====================================================================&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;四.凸包算法复杂度下界&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;(引自&amp;lt;算法艺术与信息学竞赛&amp;gt;)&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011031021160322.png" /&gt;&lt;/p&gt;&lt;p&gt;====================================================================&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;五.高效算法的应用&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这里有一个&lt;strong&gt;平面最远点对&lt;/strong&gt;的问题 可以利用凸包解决&lt;/p&gt;&lt;p&gt;Poj 2187 &lt;a href="http://poj.org/problem?id=2187"&gt;http://poj.org/problem?id=2187&lt;/a&gt;&lt;/p&gt;&lt;p&gt;由于最远点对必然在凸包上&lt;/p&gt;&lt;p&gt;我们先求凸包 然后枚举凸包上的点 不过这个复杂度最坏是O(N^2)的&lt;/p&gt;&lt;p&gt;不过凸包在很多情况下会&lt;strong&gt;改善问题的平均复杂度&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;凸包上的点通常很少 所以这个问题也可以过&lt;/p&gt;&lt;p&gt;篇幅关系 在下一节会介绍降低最坏复杂度的&lt;strong&gt;旋转卡壳算法&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;====================================================================&lt;/p&gt;&lt;p&gt;文中部分图片来源&lt;/p&gt;&lt;p&gt;http://westhoffswelt.de/blog/0040_quickhull_introduction_and_php_implementation.html&lt;/p&gt;&lt;p&gt;http://en.wikipedia.org/wiki/Graham_scan&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Booble/aggbug/1980089.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Booble/archive/2011/03/10/1980089.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Booble/archive/2011/03/04/1970453.html</id><title type="text">[Poj 1459] 网络流(一) {基本概念与算法}</title><summary type="text">{凸包的内容还欠整理先来侃侃一个月以前就想写写的网络流本文介绍网络流 网络流的算法 及其应用这些问题没事想想还是很有意思的}==================================================================================一.网络流:流&amp;网络&amp;割1.网络流问题(NetWork Flow Problem):给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow).The network flow pro</summary><published>2011-03-04T05:37:00Z</published><updated>2011-03-04T05:37:00Z</updated><author><name>Master_Chivu</name><uri>http://www.cnblogs.com/Booble/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Booble/archive/2011/03/04/1970453.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Booble/archive/2011/03/04/1970453.html"/><content type="html">&lt;p&gt;{&lt;/p&gt;&lt;p&gt;凸包的内容还欠整理&lt;/p&gt;&lt;p&gt;先来侃侃一个月以前就想写写的&lt;strong&gt;网络流&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;本文介绍&lt;strong&gt;网络流&lt;/strong&gt; 网络流的&lt;strong&gt;算法&lt;/strong&gt; 及其&lt;strong&gt;应用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这些问题没事想想还是很有意思的&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;==================================================================================&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;一.网络流:流&amp;amp;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;网络&amp;amp;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;割&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1.网络流问题(NetWork Flow Problem):&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;给定指定的一个有向图,其中有两个特殊的点&lt;strong&gt;源S(Sources)&lt;/strong&gt;和汇&lt;strong&gt;T(Sinks)&lt;/strong&gt;,每条边有指定的&lt;strong&gt;容量(Capacity)&lt;/strong&gt;,求满足条件的从S到T的&lt;strong&gt;最大流(MaxFlow)&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;The network flow problem considers a graph G with a set of sources S and sinks T and for which each edge has an assigned capacity (weight), and then asks to find the maximum flow that can be routed from S to T while respecting the given edge capacities.&lt;/p&gt;&lt;p&gt;&lt;a href="http://mathworld.wolfram.com/NetworkFlow.html"&gt;http://mathworld.wolfram.com/NetworkFlow.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011030323472858.jpg" /&gt;&lt;/p&gt;&lt;p&gt;下面给出一个通俗点的解释&lt;/p&gt;&lt;p&gt;(下文基本&lt;strong&gt;避开形式化的证明&lt;/strong&gt; 基本都用此类描述&lt;strong&gt;叙述&lt;/strong&gt;)&lt;/p&gt;&lt;p&gt;好比你家是汇 自来水厂(有需要的同学可以把自来水厂当成银行之类 以下类似)是源&lt;/p&gt;&lt;p&gt;然后自来水厂和你家之间修了很多条水管子接在一起 水管子规格不一 有的容量大 有的容量小&lt;/p&gt;&lt;p&gt;然后问自来水厂开闸放水 你家收到水的最大流量是多少&lt;/p&gt;&lt;p&gt;如果自来水厂停水了 你家那的流量就是0 当然不是最大的流量&lt;/p&gt;&lt;p&gt;但是你给自来水厂交了100w美金 自来水厂拼命水管里通水 但是你家的流量也就那么多不变了 这时就达到了&lt;strong&gt;最大流&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;-------------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.三个基本的性质:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果 &lt;strong&gt;C代表每条边的容量 F代表每条边的流量&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;一个显然的实事是F小于等于C 不然水管子就爆了&lt;/p&gt;&lt;p&gt;这就是网络流的第一条性质 &lt;strong&gt;容量限制(Capacity Constraints):F&amp;lt;x,y&amp;gt; &amp;le; C&amp;lt;x,y&amp;gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;再考虑节点任意一个节点 流入量总是等于流出的量 否则就会蓄水(爆炸危险...)或者平白无故多出水(有地下水涌出?)&lt;/p&gt;&lt;p&gt;这是第二条性质 &lt;strong&gt;流量守恒(Flow Conservation):&amp;Sigma; F&amp;lt;v,x&amp;gt; = &amp;Sigma; F&amp;lt;x,u&amp;gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当然源和汇不用满足流量守恒 我们不用去关心自来水厂的水是河里的 还是江里的&lt;/p&gt;&lt;p&gt;&lt;span style="color: #00ccff;"&gt;&lt;strong&gt;(插播广告: 节约水资源 人人有责!)&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;最后一个不是很显然的性质 是&lt;strong&gt;斜对称性(Skew Symmetry): F&amp;lt;x,y&amp;gt; = - F&amp;lt;y,x&amp;gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这其实是完善的网络流理论不可缺少的 就好比中学物理里用正负数来定义一维的位移一样&lt;/p&gt;&lt;p&gt;百米起点到百米终点的位移是100m的话 那么终点到起点的位移就是-100m&lt;/p&gt;&lt;p&gt;同样的 x向y流了F的流 y就向x流了-F的流&lt;/p&gt;&lt;p&gt;-------------------------------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3.容量网络&amp;amp;流量网络&amp;amp;残留网络:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;网络就是有源汇的有向图 关于什么就是指边权的含义是什么&lt;/p&gt;&lt;p&gt;&lt;strong&gt;容量网络&lt;/strong&gt;就是关于容量的网络 基本是&lt;strong&gt;不改变&lt;/strong&gt;的(极少数问题需要变动)&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011030400015287.png" height="331" width="634" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;流量网络&lt;/strong&gt;就是关于流量的网络 在求解问题的过程中&lt;/p&gt;&lt;p&gt;通常在不断的改变 但是总是&lt;strong&gt;满足上述&lt;span style="color: #000000;"&gt;三&lt;/span&gt;个性质&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;调整到最后就是&lt;strong&gt;最大流网络&lt;/strong&gt; 同时也可以得到最大流值&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011030400020663.png" height="329" width="633" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;残留网络&lt;/strong&gt;往往概括了容量网络和流量网络 是最为常用的&lt;/p&gt;&lt;p&gt;&lt;strong&gt;残留网络=容量网络-流量网络&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个等式是始终成立的 残留值当流量值为负时甚至会大于容量值&lt;/p&gt;&lt;p&gt;流量值为什么会为负?有正必有负,记住&lt;strong&gt;斜对称性&lt;/strong&gt;!&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011030400041780.png" height="338" width="631" /&gt;&lt;/p&gt;&lt;p&gt;-------------------------------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;4.割&amp;amp;割集&lt;/strong&gt;&lt;/span&gt;:&lt;/p&gt;&lt;p&gt;无向图的&lt;strong&gt;割集(Cut Set)&lt;/strong&gt;:C[A,B]是将图G分为A和B两个点集 &lt;strong&gt;A和B之间的边&lt;/strong&gt;的全集&lt;/p&gt;&lt;p&gt;A set of edges of a graph which, if removed (or "cut"), disconnects the graph (i.e., forms a disconnected graph).&lt;/p&gt;&lt;p&gt;&lt;a href="http://mathworld.wolfram.com/CutSet.html"&gt;http://mathworld.wolfram.com/CutSet.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;网络的割集:C[S,T]是将网络G分为s和t两部分点集 S属于s且T属于t &lt;strong&gt;从S到T的边&lt;/strong&gt;的全集&lt;/p&gt;&lt;p&gt;带权图的&lt;strong&gt;割(Cut)&lt;/strong&gt;就是割集中边或者有向边的权和&lt;/p&gt;&lt;p&gt;Given a weighted, undirected graph G=(V,E) and a graphical partition of V into two sets A and B, the cut of G with respect to A and B is defined as cut(A,B)=sum_(i in A,j in B)W(i,j),where W(i,j) denotes the weight for the edge connecting vertices i and j. The weight of the cut is the sum of weights of edges crossing the cut.&lt;/p&gt;&lt;p&gt;&lt;a href="http://mathworld.wolfram.com/Cut.html"&gt;http://mathworld.wolfram.com/Cut.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011030411350167.png" /&gt;&lt;/p&gt;&lt;p&gt;通俗的理解一下:&lt;/p&gt;&lt;p&gt;割集好比是一个恐怖分子 把你家和自来水厂之间的水管网络砍断了一些&lt;/p&gt;&lt;p&gt;然后自来水厂无论怎么放水 水都只能从水管断口哗哗流走了 你家就停水了&lt;/p&gt;&lt;p&gt;&lt;span style="color: #00ccff;"&gt;&lt;strong&gt;(插播广告: 节约水资源 人人有责!)&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;割的大小应该是恐怖分子应该关心的事 毕竟细管子好割一些&lt;/p&gt;&lt;p&gt;而最小割花的力气最小&lt;/p&gt;&lt;p&gt;==================================================================================&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;二.计算最大流的基本算法&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;那么怎么求出一个网络的最大流呢?&lt;/p&gt;&lt;p&gt;这里介绍一个最简单的算法:&lt;span size="-1"&gt;&lt;strong&gt;Edmonds-Karp算法&lt;/strong&gt; 即&lt;strong&gt;最短路径增广算法 &lt;/strong&gt;简称EK算法&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;EK算法基于一个基本的方法:&lt;span size="-1"&gt;&lt;strong&gt;Ford-Fulkerson方法&lt;/strong&gt; 即&lt;strong&gt;增广路方法&lt;/strong&gt; 简称FF方法&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;增广路方法是很多网络流算法的基础 一般都在&lt;strong&gt;残留网络&lt;/strong&gt;中实现&lt;/p&gt;&lt;p&gt;其思路是每次找出一条从源到汇的&lt;strong&gt;能够增加流的路径&lt;/strong&gt; 调整流值和残留网络 不断调整&lt;strong&gt;直到没有增广路为止&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;FF方法的基础是&lt;strong&gt;增广路定理(Augmenting Path Theorem):网络达到最大流当且仅当残留网络中没有增广路&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;证明略 这个定理应该能够接受的吧&lt;/p&gt;&lt;p&gt;EK算法就是不断的找最短路 找的方法就是每次找一条&lt;strong&gt;边数最少&lt;/strong&gt;的增广 也就是最短路径增广&lt;/p&gt;&lt;p&gt;这样就产生了三个问题:&lt;/p&gt;&lt;p&gt;-------------------------------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1.最多要增广多少次?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;可以证明 最多&lt;strong&gt;O(VE)&lt;/strong&gt;次增广 可以达到最大流 证明略&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.如何找到一条增广路?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;先明确什么是增广路 增广路是这样一条从s到t的路径 路径上每条边残留容量都为正&lt;/p&gt;&lt;p&gt;把残留容量为正的边设为可行的边 那么我们就可以用简单的&lt;strong&gt;BFS&lt;/strong&gt;得到边数最少的增广路&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3.如何增广?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;BFS得到增广路之后 这条增广路能够增广的流值 是路径上&lt;strong&gt;最小残留容量边&lt;/strong&gt;决定的&lt;/p&gt;&lt;p&gt;把这个最小残留容量MinCap值加到最大流值Flow上 同时路径上每条边的残留容量值减去MinCap&lt;/p&gt;&lt;p&gt;最后 路径上每条边的反向边残留容量值要加上MinCap 为什么? 下面会具体解释&lt;/p&gt;&lt;p&gt;-------------------------------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;这样每次增广的复杂度为&lt;strong&gt;O(E)&lt;/strong&gt; EK算法的总复杂度就是&lt;strong&gt;O(VE^2)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;事实上 大多数网络的增广次数很少 EK算法能处理绝大多数问题&lt;/p&gt;&lt;p&gt;平均意义下增广路算法都是很快的&lt;/p&gt;&lt;p&gt;增广路算法好比是自来水公司不断的往水管网里一条一条的通水&lt;/p&gt;&lt;p&gt;上面还遗留了一个反向边的问题: 为什么增广路径上每条边的反向边残留容量值要加上MinCap?&lt;/p&gt;&lt;p&gt;因为&lt;strong&gt;斜对称性&lt;/strong&gt;! 由于残留网络=容量网络-流量网络&lt;/p&gt;&lt;p&gt;容量网络不改变的情况下&lt;/p&gt;&lt;p&gt;由于增广好比给增广路上通了一条流 路径说所有边流量加MinCap&lt;/p&gt;&lt;p&gt;流量网络中路径上边的流量加MinCap 反向边流量减去MinCap&lt;/p&gt;&lt;p&gt;相对应的残留网络就发生&lt;strong&gt;相反&lt;/strong&gt;的改变&lt;/p&gt;&lt;p&gt;这样我们就完成了EK算法 具体实现可以用邻接表存图 也可以用邻接矩阵存图&lt;/p&gt;&lt;p&gt;邻接表存图 由于流量&lt;strong&gt;同时存在于边与反向边&lt;/strong&gt; 为了方便求取反向边 建图&lt;strong&gt;把一对互为反向边的边建在一起&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;代码很简单 最好自己实现一下&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('f5d90a99-27fa-44e1-808a-ee50cfd0e094')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_f5d90a99-27fa-44e1-808a-ee50cfd0e094" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_f5d90a99-27fa-44e1-808a-ee50cfd0e094" onclick="cnblogs_code_hide('f5d90a99-27fa-44e1-808a-ee50cfd0e094',event)" style="display: none;" /&gt;&lt;div id="cnblogs_code_open_f5d90a99-27fa-44e1-808a-ee50cfd0e094" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;    maxn&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1000&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    oo&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;maxlongint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    a,b,c,n,m,h,t,i,min,ans:longint;&lt;br /&gt;    g:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;..maxn,&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;..maxn]&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;of&lt;/span&gt;&lt;span style="color: #000000;"&gt; longint;&lt;br /&gt;    q,p,prev:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;..maxn]&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;of&lt;/span&gt;&lt;span style="color: #000000;"&gt; longint;&lt;br /&gt;    flag:boolean;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;assign(input,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Ditch.in&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;); reset(input);&lt;br /&gt;assign(output,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Ditch.out&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;); rewrite(output);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;not&lt;/span&gt;&lt;span style="color: #000000;"&gt; eof &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    readln(m,n);&lt;br /&gt;    fillchar(g,sizeof(g),&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; m &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        readln(a,b,c);&lt;br /&gt;        g[a,b]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;g[a,b]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;c;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    ans:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; true &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        h:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; t:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        fillchar(p,sizeof(p),&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        q[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; p[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        flag:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;false;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;t &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; n &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (p[i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt;(g[q[h],i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                    inc(t); q[t]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;i;&lt;br /&gt;                    p[i]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; prev[t]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;h;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; q[t]&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;n&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                        flag:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;true;&lt;br /&gt;                        break;&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; flag &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; break;&lt;br /&gt;            inc(h);&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;not&lt;/span&gt;&lt;span style="color: #000000;"&gt; flag&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; break;&lt;br /&gt;        i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;t; min:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;oo;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; q[i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; g[q[prev[i]],q[i]]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;min&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; min:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;g[q[prev[i]],q[i]];&lt;br /&gt;            i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;prev[i];&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;t;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; q[i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            g[q[prev[i]],q[i]]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;g[q[prev[i]],q[i]]&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;min;&lt;br /&gt;            g[q[i],q[prev[i]]]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;g[q[i],q[prev[i]]]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;min;&lt;br /&gt;            i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;prev[i];&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        ans:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;ans&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;min;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    writeln(ans);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;close(input); close(output);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;看一个具体的增广路算法的例子吧&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011030413212039.png" height="395" width="708" /&gt;&lt;/p&gt;&lt;p&gt;==================================================================================&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;三.最大流最小割定理&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;下面介绍网络流理论中一个最为重要的定理&lt;/p&gt;&lt;p&gt;&lt;strong&gt;最大流最小割定理&lt;span class="nowrap"&gt;(Maximum Flow, Minimum Cut Theorem&lt;/span&gt;):网络的最大流等于最小割&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The maximum flow between vertices v_i and v_j in a graph G is exactly the weight of the smallest set of edges to disconnect G with v_i and v_j in different components.&lt;/p&gt;&lt;p&gt;&lt;a href="http://mathworld.wolfram.com/MaximumFlowMinimumCutTheorem.html"&gt;http://mathworld.wolfram.com/MaximumFlowMinimumCutTheorem.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;具体的证明分三部分&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1.任意一个流都小于等于任意一个割&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个很好理解 自来水公司随便给你家通点水 构成一个流&lt;/p&gt;&lt;p&gt;恐怖分子随便砍几刀 砍出一个割&lt;/p&gt;&lt;p&gt;由于容量限制 每一根的被砍的水管子流出的水流量都小于管子的容量&lt;/p&gt;&lt;p&gt;每一根被砍的水管的水本来都要到你家的 现在流到外面 加起来得到的流量还是等于原来的流&lt;/p&gt;&lt;p&gt;管子的容量加起来就是割 所以流小于等于割&lt;/p&gt;&lt;p&gt;由于上面的流和割都是任意构造的 所以任意一个流小于任意一个割&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.构造出一个流等于一个割&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当达到最大流时 根据增广路定理&lt;/p&gt;&lt;p&gt;残留网络中s到t已经没有通路了 否则还能继续增广&lt;/p&gt;&lt;p&gt;我们把s能到的的点集设为S 不能到的点集为T&lt;/p&gt;&lt;p&gt;构造出一个割集C[S,T] S到T的边必然满流 否则就能继续增广&lt;/p&gt;&lt;p&gt;这些满流边的流量和就是当前的流即最大流&lt;/p&gt;&lt;p&gt;把这些满流边作为割 就构造出了一个和最大流相等的割&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3.最大流等于最小割&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;设相等的流和割分别为Fm和Cm&lt;/p&gt;&lt;p&gt;则因为任意一个流小于等于任意一个割&lt;/p&gt;&lt;p&gt;任意F&amp;le;Fm=Cm&amp;le;任意C&lt;/p&gt;&lt;p&gt;定理说明完成&lt;/p&gt;&lt;p&gt;==================================================================================&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;四.简单的应用&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Poj 1459是一个很典型的网络流应用&lt;/p&gt;&lt;p&gt;把电流想象成水流&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011030413333680.jpg" /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://poj.org/problem?id=1459"&gt;http://poj.org/problem?id=1459&lt;/a&gt;&lt;/p&gt;&lt;p&gt;注意把&lt;strong&gt;多源多汇&lt;/strong&gt;转化为&lt;strong&gt;单源单汇&lt;/strong&gt;即可利用EK算法解决问题&lt;/p&gt;&lt;p&gt;网络流的应用还有很多 &lt;strong&gt;化归&lt;/strong&gt;的思想是网络流最具魅力的地方&lt;/p&gt;&lt;p&gt;代码如下:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('ce731b50-2cbd-4d47-9a8a-6dfab442a8d3')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_ce731b50-2cbd-4d47-9a8a-6dfab442a8d3" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_ce731b50-2cbd-4d47-9a8a-6dfab442a8d3" onclick="cnblogs_code_hide('ce731b50-2cbd-4d47-9a8a-6dfab442a8d3',event)" style="display: none;" /&gt;&lt;div id="cnblogs_code_open_ce731b50-2cbd-4d47-9a8a-6dfab442a8d3" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;  1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;    maxh&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  2&lt;/span&gt; &lt;span style="color: #000000;"&gt;    maxn&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;; maxq&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;110&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  3&lt;/span&gt; &lt;span style="color: #000000;"&gt;    num:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;of&lt;/span&gt;&lt;span style="color: #000000;"&gt; char&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;..&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;9&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  4&lt;/span&gt; &lt;span style="color: #000000;"&gt;    oo&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1000000&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  5&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    c,f:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;..maxn&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;..maxn&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;of&lt;/span&gt;&lt;span style="color: #000000;"&gt; longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  6&lt;/span&gt; &lt;span style="color: #000000;"&gt;    n,m,k1,k2,tx,hx,head,tail,s,t,x,y,z,i:longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  7&lt;/span&gt; &lt;span style="color: #000000;"&gt;    pre,h:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;..maxn&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;of&lt;/span&gt;&lt;span style="color: #000000;"&gt; longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  8&lt;/span&gt; &lt;span style="color: #000000;"&gt;    p:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;..maxn&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;of&lt;/span&gt;&lt;span style="color: #000000;"&gt; boolean;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  9&lt;/span&gt; &lt;span style="color: #000000;"&gt;    q:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;..maxq]&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;of&lt;/span&gt;&lt;span style="color: #000000;"&gt; longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 10&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;procedure&lt;/span&gt;&lt;span style="color: #000000;"&gt; getc(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; x:longint);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 11&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    ch:char;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 12&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 13&lt;/span&gt; &lt;span style="color: #000000;"&gt;x:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 14&lt;/span&gt; &lt;span style="color: #000000;"&gt;read(ch);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 15&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;not&lt;/span&gt;&lt;span style="color: #000000;"&gt;(ch &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; num) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 16&lt;/span&gt; &lt;span style="color: #000000;"&gt;    read(ch);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 17&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; ch &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; num &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 18&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 19&lt;/span&gt; &lt;span style="color: #000000;"&gt;    x:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;x&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #800080;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;ord(ch)&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;48&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 20&lt;/span&gt; &lt;span style="color: #000000;"&gt;    read(ch);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 21&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 22&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 23&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;procedure&lt;/span&gt;&lt;span style="color: #000000;"&gt; pop;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 24&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 25&lt;/span&gt; &lt;span style="color: #000000;"&gt;p[q[head]]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;false;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 26&lt;/span&gt; &lt;span style="color: #000000;"&gt;inc(head); inc(hx);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 27&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; head&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;maxq &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; head:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 28&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 29&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;procedure&lt;/span&gt;&lt;span style="color: #000000;"&gt; push(x:longint);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 30&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 31&lt;/span&gt; &lt;span style="color: #000000;"&gt;inc(tail); inc(tx);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 32&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; tail&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;maxq &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; tail:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 33&lt;/span&gt; &lt;span style="color: #000000;"&gt;q[tail]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;x; p[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;true;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 34&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 35&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; min(x,y:longint):longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 36&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 37&lt;/span&gt; &lt;span style="color: #000000;"&gt;min:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;x;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 38&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;x &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; min:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;y;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 39&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 40&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 41&lt;/span&gt; &lt;span style="color: #000000;"&gt;assign(input,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;PowerNet.in&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;); reset(input);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 42&lt;/span&gt; &lt;span style="color: #000000;"&gt;assign(output,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;PowerNet.out&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;); rewrite(output);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 43&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;not&lt;/span&gt;&lt;span style="color: #000000;"&gt; seekeof &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 44&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 45&lt;/span&gt; &lt;span style="color: #000000;"&gt;        read(n,k1,k2,m);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 46&lt;/span&gt; &lt;span style="color: #000000;"&gt;    s:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;n; t:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;n&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 47&lt;/span&gt; &lt;span style="color: #000000;"&gt;    fillchar(c,sizeof(c),&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 48&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; m &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 49&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 50&lt;/span&gt; &lt;span style="color: #000000;"&gt;        getc(x); getc(y); getc(z);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 51&lt;/span&gt; &lt;span style="color: #000000;"&gt;        c[x,y]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;c[x,y]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;z;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 52&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 53&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; k1 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 54&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 55&lt;/span&gt; &lt;span style="color: #000000;"&gt;        getc(x); getc(y);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 56&lt;/span&gt; &lt;span style="color: #000000;"&gt;        c[s,x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;y;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 57&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 58&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; k2 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 59&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 60&lt;/span&gt; &lt;span style="color: #000000;"&gt;        getc(x); getc(y);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 61&lt;/span&gt; &lt;span style="color: #000000;"&gt;        c[x,t]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;y;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 62&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 63&lt;/span&gt; &lt;span style="color: #000000;"&gt;    hx:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; tx:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 64&lt;/span&gt; &lt;span style="color: #000000;"&gt;    head:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; tail:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 65&lt;/span&gt; &lt;span style="color: #000000;"&gt;    fillchar(p,sizeof(p),false);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 66&lt;/span&gt; &lt;span style="color: #000000;"&gt;    p[s]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;true; p[t]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;true;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 67&lt;/span&gt; &lt;span style="color: #000000;"&gt;    fillchar(f,sizeof(f),&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 68&lt;/span&gt; &lt;span style="color: #000000;"&gt;    fillchar(pre,sizeof(pre),&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 69&lt;/span&gt; &lt;span style="color: #000000;"&gt;    fillchar(h,sizeof(h),&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 70&lt;/span&gt; &lt;span style="color: #000000;"&gt;    h[s]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;maxh; dec(n);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 71&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; n &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 72&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; c[s,i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 73&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 74&lt;/span&gt; &lt;span style="color: #000000;"&gt;            h[i]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; pre[i]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;c[s,i];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 75&lt;/span&gt; &lt;span style="color: #000000;"&gt;            f[s,i]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;c[s,i]; f[i,s]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=-&lt;/span&gt;&lt;span style="color: #000000;"&gt;c[s,i];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 76&lt;/span&gt; &lt;span style="color: #000000;"&gt;            push(i);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 77&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 78&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; hx&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;tx &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 79&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 80&lt;/span&gt; &lt;span style="color: #000000;"&gt;        x:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;q[head];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 81&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; t &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 82&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 83&lt;/span&gt; &lt;span style="color: #000000;"&gt;            y:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;c[x,i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;f[x,i];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 84&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (h[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;h[i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt;(y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 85&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 86&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;not&lt;/span&gt;&lt;span style="color: #000000;"&gt; p[i] &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; push(i);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 87&lt;/span&gt; &lt;span style="color: #000000;"&gt;                z:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;min(pre[x],y);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 88&lt;/span&gt; &lt;span style="color: #000000;"&gt;                f[x,i]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;f[x,i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;z;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 89&lt;/span&gt; &lt;span style="color: #000000;"&gt;                f[i,x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;f[i,x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;z;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 90&lt;/span&gt; &lt;span style="color: #000000;"&gt;                pre[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;pre[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;z;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 91&lt;/span&gt; &lt;span style="color: #000000;"&gt;                pre[i]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;pre[i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;z;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 92&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 93&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; pre[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; break;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 94&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 95&lt;/span&gt; &lt;span style="color: #000000;"&gt;        pop;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 96&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; pre[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 97&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 98&lt;/span&gt; &lt;span style="color: #000000;"&gt;            y:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;oo;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 99&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; t &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;100&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; c[x,i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;f[x,i]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;101&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; y:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;min(y,h[i]);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;102&lt;/span&gt; &lt;span style="color: #000000;"&gt;            h[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;y&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;103&lt;/span&gt; &lt;span style="color: #000000;"&gt;            push(x);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;104&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;105&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;106&lt;/span&gt; &lt;span style="color: #000000;"&gt;    writeln(pre[t]);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;107&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;108&lt;/span&gt; &lt;span style="color: #000000;"&gt;close(input); close(output);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;109&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;==================================================================================&lt;p&gt;本文部分图片来源:&lt;/p&gt;&lt;p&gt;http://wenku.baidu.com/view/65a8290d4a7302768e99395a.html&lt;/p&gt;&lt;p&gt;http://wenku.baidu.com/view/6b4baf1ffc4ffe473368ab25.html&lt;/p&gt;&lt;p&gt;http://www.cppblog.com/mythit/archive/2009/04/19/80470.aspx&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Booble/aggbug/1970453.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Booble/archive/2011/03/04/1970453.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Booble/archive/2011/02/28/1967179.html</id><title type="text">[Poj 1113] 计算几何之凸包(一) {卷包裹算法}</title><summary type="text">{半个寒假都在写凸包这几篇文章整理一下主要介绍 二维凸包的求解算法以及一个简单的应用｝====================================================================一.凸集&amp;凸包(下文中所有的集合 若不作特殊说明 都是指欧氏空间上的集合)凸集(Convex Set):任意两点的连线都在这个集合内的集合就是一个凸集.A set in Euclidean space is convex set if it contains all the line segments connecting any pair of its points</summary><published>2011-02-28T10:52:00Z</published><updated>2011-02-28T10:52:00Z</updated><author><name>Master_Chivu</name><uri>http://www.cnblogs.com/Booble/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Booble/archive/2011/02/28/1967179.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Booble/archive/2011/02/28/1967179.html"/><content type="html">&lt;p&gt;{&lt;/p&gt;&lt;p&gt;半个寒假都在写凸包&lt;/p&gt;&lt;p&gt;这几篇文章整理一下&lt;/p&gt;&lt;p&gt;主要介绍 &lt;strong&gt;二维凸包&lt;/strong&gt;的求解算法&lt;/p&gt;&lt;p&gt;以及一个简单的应用&lt;/p&gt;&lt;p&gt;｝&lt;/p&gt;&lt;p&gt;====================================================================&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;一.凸集&amp;amp;凸包&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;(下文中所有的集合 若不作特殊说明 都是指欧氏空间上的集合)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;凸集(Convex Set)&lt;/strong&gt;:任意两点的连线都在这个集合内的集合就是一个凸集.&lt;/p&gt;&lt;p&gt;A set in Euclidean space &amp;nbsp;is convex set if it contains all the line segments connecting any pair of its points.&lt;/p&gt;&lt;p&gt;&lt;a href="http://mathworld.wolfram.com/Convex.html"&gt;http://mathworld.wolfram.com/Convex.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011022816281562.gif" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;凸包(Convex Hull)&lt;/strong&gt;:包含集合S的所有凸集的交集就是集合S的凸包.&lt;/p&gt;&lt;p&gt;The convex hull of a set of points S in N dimensions is the intersection of all convex sets containing S.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011022816343732.gif" /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;img height="200" width="202" src="http://pic002.cnblogs.com/images/2011/139826/2011022816365060.png" /&gt;&lt;/p&gt;&lt;p&gt;我们经常关注一个点集的凸包 这也是计算几何学的一个基本问题&lt;/p&gt;&lt;p&gt;我们现在已经有成熟的算法可以求出平面点集的凸包和空间点集的凸包&lt;/p&gt;&lt;p&gt;甚至有的算法可以方便的求出任意维度欧氏空间内的一个点集的凸包&lt;/p&gt;&lt;p&gt;凸包有着优美而实用的性质 我们可以利用凸包把一个杂乱的点集所包含的信息进行有效的&lt;strong&gt;概括 梳理&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;====================================================================&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;二.平面点集的凸包的算法&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;(下文中所有凸包 若不作特殊说明 都是指平面点集的凸包)&lt;/p&gt;&lt;p&gt;有两种直观的理解凸包的方式&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011022816490587.png" /&gt;&lt;/p&gt;&lt;p&gt;在木板上钉钉子 用一个有弹性的橡皮筋去框住所有钉子&lt;/p&gt;&lt;p&gt;橡皮筋形成的图形就是这个钉子所构成的点集的凸包&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011022816500311.png" /&gt;&lt;/p&gt;&lt;p&gt;还有一种理解我们用一根麻绳绑住一个外面的钉子 然后拉着麻绳绕所有钉子一圈&lt;/p&gt;&lt;p&gt;这个麻绳最后也构成了点集的凸包&lt;/p&gt;&lt;p&gt;其中 第二种理解是我们一个经典算法 &lt;strong&gt;卷包裹法(Gift Wrapping)&lt;/strong&gt;的思路&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011022816564452.png" /&gt;&lt;/p&gt;&lt;p&gt;卷包裹算法从一个必然在凸包上的点开始向着一个方向依次选择最外侧的点&lt;/p&gt;&lt;p&gt;当回到最初的点时 所选出的点集就是所要求的凸包&lt;/p&gt;&lt;p&gt;这里还有两个问题不是很清楚:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1.怎么确定一个肯定在凸包上的点?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个问题很好解决 取一个最左边的也就是横坐标最小的点&lt;/p&gt;&lt;p&gt;如果有多个这样的点 就取这些点里 纵坐标最小的&lt;/p&gt;&lt;p&gt;这样可以很好的处理共线的情况&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.如何确定下一个点(即最外侧的点)?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们需要利用向量的叉积来解决这个问题&lt;/p&gt;&lt;p&gt;-----------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;strong&gt;向量的叉积(Cross Product)&lt;/strong&gt;原本是三维空间中的问题 在二维中也有巧妙的应用&lt;/p&gt;&lt;p&gt;&lt;a href="http://mathworld.wolfram.com/CrossProduct.html"&gt;http://mathworld.wolfram.com/CrossProduct.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;(下文中所有的叉积 若不作特殊说明 都是指二维中新定义的叉积&lt;/p&gt;&lt;p&gt;下文中所有的向量乘法 若不作特殊说明 都是指向量的叉积)&lt;/p&gt;&lt;p&gt;我们定义二维向量&amp;lt;x1,y1&amp;gt;和&amp;lt;x2,y2&amp;gt;的叉积为一个实数Cp=x1*y2-x2*y1&lt;/p&gt;&lt;p&gt;叉积有两条性质很常用 也很好用&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011022817101222.png" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1.叉积的一半是一个三角形的有向面积&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个公式可以避免面积计算的误差 如果点是整点 那么所有运算都是整数&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.向量的叉积的符号代表着向量旋转的方向&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;向量的叉积是不满足交换律的&lt;/p&gt;&lt;p&gt;向量A乘以向量B 如果为正则为A逆时针旋转向B 否则为顺时针&lt;/p&gt;&lt;p&gt;当然这里A转向B的角总是考虑一个小于180度以内的角 否则就会出错&lt;/p&gt;&lt;p&gt;-----------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;有了向量 我们就可以选取一个&lt;strong&gt;最外侧&lt;/strong&gt;的点了&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011022818131866.png" /&gt;&lt;/p&gt;&lt;p&gt;比如现在我们卷包裹卷到J点我们要选取一个最外侧的点&lt;/p&gt;&lt;p&gt;当然比较红色的到角可以直接得到最外侧的点 不过不方便&lt;/p&gt;&lt;p&gt;我们可以考虑那个蓝色的到角&lt;/p&gt;&lt;p&gt;利用向量 我们可以&lt;strong&gt;比较哪个点"更外侧"&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;比如点K和点I 我们利用向量JK乘以向量JI得到一个数 这个数应该是负数 说明I比K更外侧&lt;/p&gt;&lt;p&gt;两个向量的比较具有&lt;strong&gt;传递性&lt;/strong&gt; 所以我们可以像N个数里取最大的数一样取出最外侧的&lt;/p&gt;&lt;p&gt;遍历所有点 每个点都和现有最外侧的点比较 得到新的最外侧的点&lt;/p&gt;&lt;p&gt;至此两个问题都得以解决 我们可以写出满足一般要求的卷包裹算法了&lt;/p&gt;&lt;p&gt;不过还遗留有一个问题 就是处理&lt;strong&gt;共线&lt;/strong&gt;的问题&lt;/p&gt;&lt;p&gt;有时候我们需要凸包边上的点也考虑到 有时候却需要去掉这些点&lt;/p&gt;&lt;p&gt;我们通常称在凸包顶点处的点为&lt;strong&gt;极点&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果我们只要求保留极点而去除在边上的点&lt;/p&gt;&lt;p&gt;我们只需在取外侧的点的时候 碰到共线的点取最远的&lt;/p&gt;&lt;p&gt;相反 如果我们要保留所有在边上的点我们只需要在共线的点中取最近的&lt;/p&gt;&lt;p&gt;这样整个卷包裹法终于完成了&lt;/p&gt;&lt;p&gt;给出完整的代码:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('8cf80e88-dab8-4d19-a4e8-54bfc0a3b5be')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_8cf80e88-dab8-4d19-a4e8-54bfc0a3b5be" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_8cf80e88-dab8-4d19-a4e8-54bfc0a3b5be" onclick="cnblogs_code_hide('8cf80e88-dab8-4d19-a4e8-54bfc0a3b5be',event)" style="display: none;" /&gt;&lt;div id="cnblogs_code_open_8cf80e88-dab8-4d19-a4e8-54bfc0a3b5be" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;span style="color: #008000;"&gt;{&lt;/span&gt;&lt;span style="color: #008000;"&gt;$inline on&lt;/span&gt;&lt;span style="color: #008000;"&gt;}&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;    zero&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1e-6&lt;/span&gt;&lt;span style="color: #000000;"&gt;; maxn&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;100000&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;type&lt;/span&gt;&lt;span style="color: #000000;"&gt;    point&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;record&lt;/span&gt;&lt;span style="color: #000000;"&gt; x,y:extended; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    p:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;..maxn]&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;of&lt;/span&gt;&lt;span style="color: #000000;"&gt; point;&lt;br /&gt;    ch:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;..maxn]&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;of&lt;/span&gt;&lt;span style="color: #000000;"&gt; longint;&lt;br /&gt;    temp,n,m,i,j,k:longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; sgn(x:extended):longint; inline;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; abs(x)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;zero &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; exit(&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; x&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; sgn:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; sgn:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; cross(a,b,c:point):extended; inline;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;cross:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(b.x&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;a.x)&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;(c.y&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;a.y)&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;(b.y&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;a.y)&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;(c.x&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;a.x);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; dist(a,b:point):extended; inline;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;dist:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;sqr(a.x&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;b.x)&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;sqr(a.y&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;b.y);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; cmp(a,b,c:point):boolean; inline;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    temp:longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;temp:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;sgn(cross(a,b,c));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; temp&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; exit(temp&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;); &lt;/span&gt;&lt;span style="color: #008000;"&gt;{&lt;/span&gt;&lt;span style="color: #008000;"&gt;*B&lt;/span&gt;&lt;span style="color: #008000;"&gt;}&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;cmp:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;dist(a,b)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;dist(a,c); &lt;/span&gt;&lt;span style="color: #008000;"&gt;{&lt;/span&gt;&lt;span style="color: #008000;"&gt;*A&lt;/span&gt;&lt;span style="color: #008000;"&gt;}&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;assign(input,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Hull.in&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;); reset(input);&lt;br /&gt;assign(output,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Hull1.out&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;); rewrite(output);&lt;br /&gt;readln(n);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; n &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    readln(p[i].x,p[i].y);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (j&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;or&lt;/span&gt;&lt;span style="color: #000000;"&gt;(p[i].x&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;p[j].x)&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;or&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    (sgn(p[i].x&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;p[j].x)&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt;(p[i].y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;p[j].y)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; j:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;i;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;temp:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;j;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; true &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    k:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    inc(m); ch[m]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;j;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; n &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (i&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;j)&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt;((k&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;or&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        cmp(p[j],p[k],p[i]))&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; k:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;i;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; k&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;temp &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; break;&lt;br /&gt;    j:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;k;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; m &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    writeln(p[ch[i]].x:&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,p[ch[i]].y:&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;close(input); close(output);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;A Change Direction&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;B Remove Colinear Points&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;还有两点要补充说明一下:&lt;/p&gt;&lt;p&gt;1.卷包裹算法的复杂度是&lt;strong&gt;O(NH)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;N是全部的点数 H是最终在凸包上的点数&lt;/p&gt;&lt;p&gt;所以卷包裹算法很适合凸包上的点很少的时候 通常随机数据很快&lt;/p&gt;&lt;p&gt;但是构造出的凸包上的点很多的数据 这个算法就会很慢&lt;/p&gt;&lt;p&gt;比如所有的点都在一个圆周上&lt;/p&gt;&lt;p&gt;2.卷包裹算法输出的点是&lt;strong&gt;有序&lt;/strong&gt;的&lt;/p&gt;&lt;p&gt;这也是对二维凸包算法的一个基本要求&lt;/p&gt;&lt;p&gt;通常只有保证有序才能进行进一步的计算&lt;/p&gt;&lt;p&gt;通过改变&lt;strong&gt;CMP函数&lt;/strong&gt;可以改变上文中提到的共线(取/不取)以及这里的序(顺时针/逆时针)的问题&lt;/p&gt;&lt;p&gt;====================================================================&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;三.凸包的面积和周长&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;凸包的一个简单算法介绍完了&lt;/p&gt;&lt;p&gt;来看一个具体的问题 Poj 1113&amp;nbsp;&lt;a href="http://poj.org/problem?id=1113"&gt;http://poj.org/problem?id=1113&lt;/a&gt;&lt;/p&gt;&lt;p&gt;问题是求到一个简单多边形距离最少为L的点的轨迹的周长&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/139826/2011022818365644.gif" /&gt;&lt;/p&gt;&lt;p&gt;我们可以先求凸包 然后得到计算公式&lt;/p&gt;&lt;p&gt;实际上 圆的部分可以拼接起来变成一个整圆&lt;/p&gt;&lt;p&gt;这样就好算多了 注意把共线的都去掉 不然误差会很大的&lt;/p&gt;&lt;p&gt;代码就不贴了 很简单的&lt;/p&gt;&lt;p&gt;下一篇介绍更快速的平面凸包算法&lt;/p&gt;&lt;p&gt;Graham Scan 和 QuickHull&lt;/p&gt;&lt;p&gt;强烈推荐QuickHull&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Booble/aggbug/1967179.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Booble/archive/2011/02/28/1967179.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Booble/archive/2011/02/01/1948675.html</id><title type="text">写程序需要做的几件事</title><summary type="text">兔年到啦 大家新年快乐！以下几条摘自http://old.blog.edu.cn/user3/Hailer/archives/2007/1752875.shtml有几句话看了很有同感 灰字标注这些不止是写给在校大学生的 每个写程序的人都应做到4.C语言是基础,很重要,如果你不学好C语言,那么什么高级语言你都学不好.5.C语言与C++语言是两回事.就像大熊猫和小熊猫一样,只是名字很像.6.请先学习专业课《数据结构》《计算机组成原理》,不要刚开始就拿着一本VC在看,你连面向对象都搞不清楚,看VC没有任何用处.7.对编程有一定的认识后,就可以学习C++了.(是C++而不是VC,这两个也是两码事.C+</summary><published>2011-02-01T06:21:00Z</published><updated>2011-02-01T06:21:00Z</updated><author><name>Master_Chivu</name><uri>http://www.cnblogs.com/Booble/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Booble/archive/2011/02/01/1948675.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Booble/archive/2011/02/01/1948675.html"/><content type="html">&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;兔年到啦 大家新年快乐！&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;以下几条摘自http://old.blog.edu.cn/user3/Hailer/archives/2007/1752875.shtml&lt;/p&gt;&lt;p&gt;有几句话看了很有同感 &lt;strong&gt;&lt;span style="color: #888888;"&gt;灰字&lt;/span&gt;&lt;/strong&gt;标注&lt;/p&gt;&lt;p&gt;这些不止是写给在校大学生的 每个写程序的人都应做到&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;4.C语言是基础,很重要,如果你不学好C语言,那么什么高级语言你都学不好.&lt;/p&gt;&lt;p&gt;5.C语言与C++语言是两回事.就像大熊猫和小熊猫一样,只是名字很像.&lt;/p&gt;&lt;p&gt;6.请先学习专业课《数据结构》《计算机组成原理》,不要刚开始就拿着一本VC在看,你连面向对象都搞不清楚,看VC没有任何用处.&lt;/p&gt;&lt;p&gt;7.对编程有一定的认识后,就可以学习C++了.(是C++而不是VC,这两个也是两码事.C++是一门语言,而VC教程则是讲解如何使用MFC类库,学习VC应建立在充分了解C++的基础之上.看VC的书,是学不了C++语言的.)&lt;/p&gt;&lt;p&gt;&lt;span style="color: #888888;"&gt;以上几条都是关于C语言的 个人觉得ANSI C是每个学习与C相关语言的人都要&lt;strong&gt;特别理解&lt;/strong&gt;的&lt;/span&gt;&lt;/p&gt;&lt;p&gt;8.学习编程的秘诀是:编程,编程,再编程;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #888888;"&gt;实践出真知 停留在YY的思考&lt;strong&gt;永远不完备&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;10.在学校的实验室就算你做错一万次程序都不会有人骂你,如果在公司你试试看!所以多去实验室上机,现在错得多了,毕业后就错得少了.&lt;/p&gt;&lt;p&gt;&lt;span style="color: #888888;"&gt;犯错意味着要失去很多 但是不要忘记 &lt;strong&gt;失去的都是谬误&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;14.VC C#. NET这些东西都会过时,不会过时的是数据结构和优秀的算法!&lt;/p&gt;&lt;p&gt;&lt;span style="color: #888888;"&gt;后者才是&lt;strong&gt;真金&lt;/strong&gt; 前者只不过是工具&lt;/span&gt;&lt;/p&gt;&lt;p&gt;16.我还是强调认真听专业课,因为有些课像《数据结构》《编译原理》《操作系统》等等,这种课老师讲一分钟能让你明白的内容,你自己看要看好几个月,有的甚至看了好几年都看不明白.]&lt;/p&gt;&lt;p&gt;&lt;span style="color: #888888;"&gt;学会找一个好老师 学会与别人交流 &lt;strong&gt;写程序的人和程序一样 需要输入&amp;amp;输出&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;19.编程不是技术活,而是体力活.&lt;/p&gt;&lt;p&gt;&lt;span style="color: #888888;"&gt;&lt;strong&gt;身心健康&lt;/strong&gt;是革命的本钱&lt;/span&gt;&lt;/p&gt;&lt;p&gt;20.如果你决定了要当一个好的程序员,那么请你放弃游戏,除非你是那种每天只要玩游戏就能写出好程序的天才!&lt;/p&gt;&lt;p&gt;&lt;span style="color: #888888;"&gt;&lt;strong&gt;主业一定要让你放不下 副业一定要能够放得下&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;21.你要有足够的韧性和毅力!有个高手出一道题测试你的韧性和毅力:找个10000以内的素数表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这一条.&lt;/p&gt;&lt;p&gt;&lt;span style="color: #888888;"&gt;有没有发现过自己在写程序的时候走神了? &lt;strong&gt;很多错误由此而来&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;22.找到只属于你自己的学习方法.不要盲目的追随别人的方法,适合自己的才是最好的!&lt;/p&gt;&lt;p&gt;&lt;span style="color: #888888;"&gt;任何东西都是这样 当找到了适合自己的 &lt;strong&gt;一定会觉得那是最好的&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #888888;"&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;以上只是我特别有同感的话和我自己的感受 欢迎评论交流&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Booble/aggbug/1948675.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Booble/archive/2011/02/01/1948675.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Booble/archive/2011/01/02/1924125.html</id><title type="text">[Pku 2777] 线段树(六) {总结}</title><summary type="text">{很久以前就说过线段树的内容要写6篇了没想到跨年了都 现在是总结的时候了这里是以前的5篇}线段树总结关键字二分 将父亲区间均分设为儿子区间 切割 将查询区间切割为Log级别个的树上区间 概括 高效概括每个区间上的状况合并 将不同的区间情况合并起来得到总区间的情况二分来源于线段树的定义了解更多关于线段树的定义和基本性质 请移步这里这是线段树之所以能够达到Log级别的本质原因也是二进制思想的一个应用还记得这一个问题吧Pku 2777 http://poj.org/problem?id=2777我在这里 也就是介绍线段树的第一篇里 把它做为例子不知有没有发现 这个做法的最坏情况是O(Q*L)的这一篇</summary><published>2011-01-02T07:46:00Z</published><updated>2011-01-02T07:46:00Z</updated><author><name>Master_Chivu</name><uri>http://www.cnblogs.com/Booble/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Booble/archive/2011/01/02/1924125.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Booble/archive/2011/01/02/1924125.html"/><content type="html">&lt;p&gt;{&lt;/p&gt;&lt;p&gt;很久以前就说过线段树的内容要写6篇了&lt;/p&gt;&lt;p&gt;没想到跨年了都 现在是总结的时候了&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.cnblogs.com/Booble/tag/%E7%BA%BF%E6%AE%B5%E6%A0%91/" target="_blank"&gt;这里&lt;/a&gt;&lt;/strong&gt;是以前的5篇&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;线段树总结&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;关键字&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000; background-color: #00ff00;"&gt;二分&lt;/span&gt; 将父亲区间均分设为儿子区间&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="background-color: #00ff00; color: #ff0000;"&gt; 切割&lt;/span&gt; 将查询区间切割为Log级别个的树上区间&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="background-color: #00ff00; color: #ff0000;"&gt; 概括&lt;/span&gt; 高效概括每个区间上的状况&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="background-color: #00ff00; color: #ff0000;"&gt;合并&lt;/span&gt; 将不同的区间情况合并起来得到总区间的情况&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000; background-color: #00ff00;"&gt;&lt;strong&gt;二分&lt;/strong&gt;&lt;/span&gt;来源于线段树的定义&lt;/p&gt;&lt;p&gt;了解更多关于线段树的定义和基本性质 请移步&lt;a href="http://www.cnblogs.com/Booble/archive/2010/10/09/1846911.html" target="_blank"&gt;&lt;strong&gt;这里&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这是线段树之所以能够达到Log级别的本质原因&lt;/p&gt;&lt;p&gt;也是&lt;strong&gt;二进制思想&lt;/strong&gt;的一个应用&lt;/p&gt;&lt;p&gt;还记得这一个问题吧&lt;/p&gt;&lt;p&gt;Pku 2777 http://poj.org/problem?id=2777&lt;/p&gt;&lt;p&gt;我在&lt;strong&gt;&lt;a href="http://www.cnblogs.com/Booble/archive/2010/10/09/1846911.html" target="_blank"&gt;这里&lt;/a&gt;&lt;/strong&gt; 也就是介绍线段树的第一篇里 把它做为例子&lt;/p&gt;&lt;p&gt;不知有没有发现 这个做法的最坏情况是&lt;strong&gt;O(Q*L)&lt;/strong&gt;的&lt;/p&gt;&lt;p&gt;这一篇以讨论这个问题为主线 总结线段树的思想&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;我们通过&lt;span style="background-color: #00ff00; color: #ff0000;"&gt;&lt;strong&gt;切割&lt;/strong&gt;&lt;/span&gt;的思想来分析问题&lt;/p&gt;&lt;p&gt;我们引入一个东西叫&lt;strong&gt;混合颜色&lt;/strong&gt; 查询到&lt;strong&gt;混合颜色就继续递归&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;那么 很容易想出一个数据 即&lt;strong&gt;所有的分支节点都是混合颜色 叶子染上黑白相间的颜色&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;那么查询就变成&lt;strong&gt;O(L)&lt;/strong&gt;的了&amp;mdash;&amp;mdash;必须遍历所有叶子节点&lt;/p&gt;&lt;p&gt;可以看到 这里线段树把查询区间切割成了L个区间 其实不如用一个线性表模拟&lt;/p&gt;&lt;p&gt;而实际上 我们发现树上的区间&lt;strong&gt;被查询区间完全包含了之后&lt;/strong&gt;&amp;mdash;&amp;mdash;&lt;/p&gt;&lt;p&gt;就不应当向下递归了&lt;strong&gt; 这样才是货真价实的Log&lt;span style="font-size: 11px;"&gt;2&lt;/span&gt;L个区间&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;关于线段树切割区间与&lt;strong&gt;保证切割性质的Lazy-Tag&lt;/strong&gt;的内容 请移步&lt;a href="http://www.cnblogs.com/Booble/archive/2010/10/11/1847793.html" target="_blank"&gt;&lt;strong&gt;这里&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Booble/archive/2010/10/11/1847793.html" target="_blank"&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;那么我们为什么要记录混合颜色这种东西呢?&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;是因为我们不清楚 这个区间是什么情况 这就牵涉到&lt;span style="background-color: #00ff00;"&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;概括&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;的问题了&lt;/p&gt;&lt;p&gt;&lt;strong&gt;高效&lt;/strong&gt;概括出每个区间的情况 并且支持&lt;strong&gt;高效&lt;/strong&gt;的&lt;strong&gt;&lt;span style="background-color: #00ff00; color: #ff0000;"&gt;合并&lt;/span&gt;&lt;/strong&gt;运算&lt;/p&gt;&lt;p&gt;是我们最终完全解决这个问题的保障&lt;/p&gt;&lt;p&gt;我们讨论过&lt;strong&gt;&lt;a href="http://www.cnblogs.com/Booble/archive/2010/10/18/1855172.html" target="_blank"&gt;树套树&lt;/a&gt;&lt;/strong&gt;和&lt;strong&gt;&lt;a href="http://www.cnblogs.com/Booble/archive/2010/10/24/1859871.html" target="_blank"&gt;树状数组&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;为什么&lt;strong&gt;区间排名问题&lt;/strong&gt;必须要在线段树的节点内加入一个平衡树?&lt;/p&gt;&lt;p&gt;因为我们&lt;strong&gt;非得知道这个区间里所有的数&lt;/strong&gt;才能查询到某个数在这个区间的排名&lt;/p&gt;&lt;p&gt;为了高效维护这些数 我们就得用平衡树来组织&lt;/p&gt;&lt;p&gt;也就是用平衡树来概括区间信息&lt;/p&gt;&lt;p&gt;树状数组的本质是&lt;strong&gt;去除一部分节点的线段树&lt;/strong&gt; 利用了某些&lt;strong&gt;合并运算的可减性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;精简了某些区间 所以能够更高效的概括区间信息&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;回到这个问题 我们要概括&lt;strong&gt;包含某些颜色的区间&lt;/strong&gt;的信息&lt;/p&gt;&lt;p&gt;并且支持&lt;strong&gt;高效的合并运算&lt;/strong&gt; 我们可以看到 颜色最多才30种&lt;/p&gt;&lt;p&gt;利用一个32位长整形概括区间包含不包含各种颜色&lt;/p&gt;&lt;p&gt;合并运算就是Or运算 问题就可以解决了&lt;/p&gt;&lt;p&gt;比如一个区间含有1 2 3 5 号颜色 就存为10111=23&lt;/p&gt;&lt;p&gt;另一个区间含有1 3 4号颜色 就存为1101=11&lt;/p&gt;&lt;p&gt;合并两个区间就是含有1 2 3 4 5号颜色 即11 Or 23=10111 Or 1101=11111=31&lt;/p&gt;&lt;p&gt;就可以得到31这个结果 只要&lt;strong&gt;统计二进制中含有几个1&lt;/strong&gt;就可以得到答案了&lt;/p&gt;&lt;p&gt;代码不难写 直接给出&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('e38e0521-68f3-49b8-b191-2d5204efe26d')"&gt;&lt;div id="cnblogs_code_open_e38e0521-68f3-49b8-b191-2d5204efe26d"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;    max&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;200000&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    tt,n,t,q,x,y,z,i:longint;&lt;br /&gt;    l,r,c,d,ls,rs:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;array&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;..max]&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;of&lt;/span&gt;&lt;span style="color: #000000;"&gt; longint;&lt;br /&gt;    ch:char;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;procedure&lt;/span&gt;&lt;span style="color: #000000;"&gt; down(x:longint);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; d[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    c[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;d[x];&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; ls[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; d[ls[x]]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;d[x];&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; rs[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; d[rs[x]]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;d[x];&lt;br /&gt;    d[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;procedure&lt;/span&gt;&lt;span style="color: #000000;"&gt; update(x:longint);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;down(ls[x]); down(rs[x]);&lt;br /&gt;c[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;c[ls[x]] &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;or&lt;/span&gt;&lt;span style="color: #000000;"&gt; c[rs[x]];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;procedure&lt;/span&gt;&lt;span style="color: #000000;"&gt; build(a,b:longint);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    x,mid:longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;inc(tt); x:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;tt;&lt;br /&gt;c[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; d[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;l[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;a; r[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;b;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; b&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;a&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    mid:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(a&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;b)shr &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    ls[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;tt&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; build(a,mid);&lt;br /&gt;    rs[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;tt&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; build(mid,b);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;procedure&lt;/span&gt;&lt;span style="color: #000000;"&gt; cover(x,a,b,c:longint);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    mid:longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;down(x);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (a&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;l[x])&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt;(r[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;b)&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; d[x]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;c&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    mid:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(l[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;r[x])shr &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; a&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;mid &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; cover(ls[x],a,b,c);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; b&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;mid &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; cover(rs[x],a,b,c);&lt;br /&gt;    update(x);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; count(x,a,b:longint):longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;    mid:longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;down(x);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (a&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;l[x])&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt;(r[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;b)&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; count:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;c[x]&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        count:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    mid:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(l[x]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;r[x])shr &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; a&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;mid &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; count:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;count &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;or&lt;/span&gt;&lt;span style="color: #000000;"&gt; count(ls[x],a,b);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; b&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;mid &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; count:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;count &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;or&lt;/span&gt;&lt;span style="color: #000000;"&gt; count(rs[x],a,b);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; calcu(x:longint):longint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;calcu:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; x&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    calcu:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;calcu&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;x &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    x:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;x shr &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;assign(input,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Count.in&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;); reset(input);&lt;br /&gt;assign(output,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Count.out&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;); rewrite(output);&lt;br /&gt;readln(n,t,q);&lt;br /&gt;build(&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;,n);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; q &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    read(ch,x,y);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; x&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;y&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        z:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;x; x:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;y; y:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;z;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; ch&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;P&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; writeln(calcu(count(&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,x&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,y)))&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        read(z);&lt;br /&gt;        cover(&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,x&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,y,&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; shl (z&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    readln;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;close(input); close(output);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;关于线段树的介绍 到此告一段落&lt;/p&gt;&lt;p&gt;以后如果还有好玩的经典的 线段树问题 还会新写&lt;/p&gt;&lt;p&gt;谢谢阅读 如有不足欢迎指正!&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Booble/aggbug/1924125.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Booble/archive/2011/01/02/1924125.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Booble/archive/2010/12/14/1906147.html</id><title type="text">[字符串统计] 字符串(八) {后缀数组的应用(下)}</title><summary type="text">{承上半部分继续讨论后缀数组的应用这一部分难度较大需要对后缀数组有一个综合的了解主要内容是借助Height数组解决问题即Height分析}重贴一下关于Height数组的内容:Height[]纪录了两个相邻排名的后缀的最长公共前缀最基本的一个性质是:任意两个后缀suffix(j)和suffix(k)的最长公共前缀为height[rank[j]+1] height[rank[j]+2] …height[rank[k]]中的最小值根据这个性质 关于字符串的最优化问题我们通常可以运用贪心法或二分答案而关于字符串的统计问题 为了设计出高效的算法我们还需要对这个性质进行更深入的分析提出一个具体问题统计字符</summary><published>2010-12-14T15:51:00Z</published><updated>2010-12-14T15:51:00Z</updated><author><name>Master_Chivu</name><uri>http://www.cnblogs.com/Booble/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Booble/archive/2010/12/14/1906147.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Booble/archive/2010/12/14/1906147.html"/><content type="html">&lt;p&gt;{&lt;/p&gt;&lt;p&gt;承&lt;strong&gt;&lt;a href="http://www.cnblogs.com/Booble/archive/2010/12/12/1904006.html" target="_blank"&gt;上半部分&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;继续讨论后缀数组的&lt;strong&gt;应用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这一部分难度较大&lt;/p&gt;&lt;p&gt;需要对后缀数组有一个&lt;a href="http://www.cnblogs.com/Booble/archive/2010/12/10/1902730.html" target="_blank"&gt;&lt;strong&gt;综合的了解&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;主要内容是借助Height数组解决问题&lt;/p&gt;&lt;p&gt;即&lt;strong&gt;Height分析&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;重贴一下关于&lt;strong&gt;Height数组&lt;/strong&gt;的内容:&lt;/p&gt;&lt;p&gt;Height[]纪录了两个&lt;strong&gt;相邻排名&lt;/strong&gt;的后缀的&lt;strong&gt;最长公共前缀&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;最基本的一个性质是:&lt;strong&gt;任意两个后缀suffix(j)和suffix(k)的最长公共前缀为&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;height[rank[j]+1] height[rank[j]+2] &amp;hellip;height[rank[k]]中的&lt;span style="color: #ff0000;"&gt;最小值&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;根据这个性质 关于字符串的&lt;strong&gt;最优化问题&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们通常可以运用&lt;strong&gt;贪心法或二分答案&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;而关于字符串的&lt;strong&gt;统计问题&lt;/strong&gt; 为了设计出高效的算法&lt;/p&gt;&lt;p&gt;我们还需要对这个&lt;strong&gt;性质&lt;/strong&gt;进行&lt;strong&gt;更深入的分析&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;提出一个具体问题&lt;/p&gt;&lt;p&gt;统计字符串的&lt;strong&gt;不同子串个数 Spoj 694 Spoj 705&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们&lt;strong&gt;尝试利用后缀数组求解&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;看一个样例 A=aabaaaab&lt;/p&gt;&lt;p&gt;构造后缀数组:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;N/A $&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 0&amp;nbsp;&amp;nbsp; aaaab$&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 3&amp;nbsp;&amp;nbsp; aaab$&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 2&amp;nbsp;&amp;nbsp; aab$&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 3&amp;nbsp;&amp;nbsp; aabaaaab$&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 1 &amp;nbsp; ab$&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 2&amp;nbsp;&amp;nbsp; abaaaab$&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 0&amp;nbsp;&amp;nbsp; b$&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 1&amp;nbsp;&amp;nbsp; baaaab$&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;每个后缀前面就是Height数组的值&lt;/p&gt;&lt;p&gt;由于子串是&lt;strong&gt;后缀的前缀&lt;/strong&gt; 我们考虑&lt;strong&gt;这些后缀有多少不同的前缀&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;如果不考虑重复 每个后缀产生的&lt;strong&gt;前缀个数&lt;/strong&gt;就是它的&lt;strong&gt;长度&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;但是有重复产生 我们利用Height数组完成&lt;strong&gt;去重&lt;/strong&gt;的工作&lt;/p&gt;&lt;p&gt;为了考虑方便 我们只需统计每个后缀产生的&lt;strong&gt;不是前一个后缀的前缀&lt;/strong&gt;的前缀&lt;/p&gt;&lt;p&gt;就举样例的例子&lt;/p&gt;&lt;p&gt;第一个后缀 产生了5个子串(前缀) aaaab aaaa aaa aa a&lt;/p&gt;&lt;p&gt;第二个后缀 本来产生了4个子串 但是 aaa aa a 都是前一个后缀统计过的 最后只产生了1个 即aaab&lt;/p&gt;&lt;p&gt;第三个后缀 也是如此 产生了3个子串 aa a 和第二个后缀重复 一共产生了1个 即aab&lt;/p&gt;&lt;p&gt;...(不断累加 直到最后一个后缀为止)&lt;/p&gt;&lt;p&gt;总结一下就是&lt;strong&gt;每次累加 Length(Suffix[Rank[i]])-Height[i]&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;为什么&lt;strong&gt;只要考虑和前面一个后缀的重复&lt;/strong&gt;呢?&lt;/p&gt;&lt;p&gt;我们可以这样看:&lt;/p&gt;&lt;p&gt;如果某个前缀和前面一个后缀发生重复 那么这个前缀肯定不能再统计了&lt;/p&gt;&lt;p&gt;另外一方面 如果这个前缀不是前面一个后缀的前缀&lt;/p&gt;&lt;p&gt;那么&lt;strong&gt;根据Height基本性质&lt;/strong&gt; 这个后缀更不会是更前面后缀的前缀了&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;*&lt;/strong&gt;&lt;/span&gt; 也就是这个前缀&lt;strong&gt;前面肯定没统计过&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;由于&lt;strong&gt;只考虑和前面的关系 统计过的前缀就不会再统计了&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;所以这个扫描算法是正确的 复杂度很完美 是&lt;strong&gt;O(N)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;贴一下核心的代码&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('9f983b62-dc86-41be-a7f0-de5c950f57b5')"&gt;&lt;div id="cnblogs_code_open_9f983b62-dc86-41be-a7f0-de5c950f57b5"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;j:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    fillchar(h,sizeof(h),&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; n &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; r[i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            k:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;s[r[i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; a[i&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;j]&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;a[k&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;j] &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                inc(j);&lt;br /&gt;            h[r[i]]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;j;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; j&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; dec(j);&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    ans:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; n &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        ans:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;ans&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;n&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;s[i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;h[i];&lt;br /&gt;    writeln(ans&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;n);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;通过以上一个问题的分析[主要是标记*处]&lt;/p&gt;&lt;p&gt;我们似乎看到Height数组的性质 有这样一个特点&lt;/p&gt;&lt;p&gt;任意两点间的最小值起着&lt;strong&gt;隔断的作用&lt;/strong&gt; 最小值前面的值不会在起作用了&lt;/p&gt;&lt;p&gt;针对这个特点 我们有时在扫描的时候利用一个&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;单调递增的栈&lt;/strong&gt;&lt;/span&gt;来维护Height数组&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;单调栈引例 最大矩形面积问题&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;在&lt;span style="font-family: Garamond;" lang="EN-US"&gt;x&lt;/span&gt;轴上水平放置着&lt;span style="font-family: Garamond;" lang="EN-US"&gt;n&lt;/span&gt;个矩形 每个矩形的宽度均为1 但的高度并不相同&lt;/p&gt;&lt;p&gt;求这个面积并中 最大的子矩形面积&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/139826/2010121422395656.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;显然一个有机会成为最大矩形的矩形都满足这样一个条件&lt;/p&gt;&lt;p&gt;设此矩形范围为[A,B] 高度为C &lt;strong&gt;则A-1 B+1处的高度必然小于C&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;而且[A,B]之间的高度都大于等于C&lt;/p&gt;&lt;p&gt;所以&lt;strong&gt;一个矩形被两边高度小于它的条形隔断&lt;/strong&gt;了&lt;/p&gt;&lt;p&gt;我们考虑扫描的过程&lt;/p&gt;&lt;p&gt;扫描到一个新的位置 就把被当前位置隔断的矩形统计并剔出&lt;/p&gt;&lt;p&gt;并把没有被隔断的矩形继续存储下去&lt;/p&gt;&lt;p&gt; 为了做到这一点我们维护一个&lt;strong&gt;关于高度递增&lt;/strong&gt;的&lt;strong&gt;存储矩形&lt;/strong&gt;的&lt;strong&gt;单调&lt;/strong&gt;的栈&lt;/p&gt;&lt;p&gt;每次扫描到新的条形时 就把栈内高度大于这个条形的矩形全部弹出并统计&lt;/p&gt;&lt;p&gt;然后继续 扫描下一个 扫完最后一个时 &lt;strong&gt;清空所有&lt;/strong&gt;即可&lt;/p&gt;&lt;p&gt;存储矩形我们只要存两个量 &lt;strong&gt;矩形高度&lt;/strong&gt;和&lt;strong&gt;开始位置&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;而结束位置是不定的 直到弹栈才会确定下来&lt;/p&gt;&lt;p&gt;由于每个高度只会入栈一次 复杂度达到了&lt;strong&gt;O(N)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;下面是对于样例 2 1 4 5 1 3 3 的模拟&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/139826/2010121422455890.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;看完了这个例子 我们继续讨论单调栈在Height分析时的应用&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pku 3415 统计两个串的公共子串的个数(位置不同即是不同)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;依然用后缀数组解决这个问题&lt;/p&gt;&lt;p&gt;先把两个串拼接然后生成后缀数组&lt;/p&gt;&lt;p&gt;比如两个串A=aababaa B=abaabaa&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp; 0 #&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 0 $abaabaa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 0 a#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 1 a$abaabaa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 1 aa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 2 aa$abaabaa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 2 aabaa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 4 aababaa$abaabaa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 1 abaa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 4 abaa$abaabaa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 4 abaabaa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 3 ababaa$abaabaa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 0 baa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 3 baa$abaabaa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 3 baabaa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 2 babaa$abaabaa#&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;为了统计方便 我们分两次考虑&lt;/p&gt;&lt;p&gt;第一次扫描得&lt;strong&gt;到A串的后缀&lt;/strong&gt;和&lt;strong&gt;排在前面的B串的后缀&lt;/strong&gt;产生的公共子串的个数&lt;/p&gt;&lt;p&gt;第二次扫描得到B串的后缀和排在前面的A串的后缀产生的公共子串的个数&lt;/p&gt;&lt;p&gt;这里每次扫描的思路和讨论单个串的不同子串个数类似 做到了不重复不遗漏&lt;/p&gt;&lt;p&gt;由于两次扫描是类似的 单看第一次&lt;/p&gt;&lt;p&gt;那么如何得到每个A串后缀和前面的B串后缀产生的公共子串个数呢?&lt;/p&gt;&lt;p&gt;举个具体的例子 比如扫描到下图的位置&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp; 0 #&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 0 $abaabaa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 0 a#&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;-B串后缀 (0个)&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 1 a$abaabaa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 1 aa#&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;-B串后缀 (1个)&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 2 aa$abaabaa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 2 aabaa#&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;-B串后缀 (1个)&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 4 aababaa$abaabaa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 1 abaa#&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;-B串后缀 (3个)&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 4 abaa$abaabaa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 4 abaabaa#&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;-B串后缀 (3个)&lt;br /&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp; 3 ababaa$abaabaa# &amp;nbsp; &lt;/span&gt;&lt;/strong&gt;&lt;span style="color: #ff0000;"&gt;&amp;lt;-当前A串后缀&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 0 baa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 3 baa$abaabaa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 3 baabaa#&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp; 2 babaa$abaabaa#&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个后缀X和前面每个B串后缀Y产生的公共子串个数(不计重复)为&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Num=&amp;sum; LCP(Suffix(X),Suffix(Y))&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;LCP就是X到Y的区间最小值&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;上面例子的数值已经标出&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;的每次都去回头扫描 求X和每个Y的RMQ 即使预处理出ST O(1)回答&lt;/p&gt;&lt;p&gt;也是O(N^2)的算法 不可取&lt;/p&gt;&lt;p&gt;回到上面我们发现的Height数组的特点&lt;/p&gt;&lt;p&gt;任意Y和X产生的LCP由他们间的RMQ决定 又好像是被这个值&lt;strong&gt;隔断&lt;/strong&gt;了&lt;/p&gt;&lt;p&gt;也就是这个值以上的所有Y和X产生的LCP都小于等于这个值&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #999999;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/139826/2010121423272996.jpg" alt="" /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #999999;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/139826/2010121423274050.jpg" alt="" /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #999999;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/139826/2010121423274780.jpg" alt="" /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #999999;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/139826/2010121423275677.jpg" alt="" /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #999999;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/139826/2010121423280411.jpg" alt="" /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #999999;"&gt;&lt;span style="color: #000000;"&gt;上面的五个图分别代表了 当前A和前面每个B产生的&lt;strong&gt;公共前缀&lt;/strong&gt;的大小&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="color: #999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;和上面的最大矩形面积类似 用&lt;strong&gt;关于Height单调递增&lt;/strong&gt;的&lt;strong&gt;存储Height值相等的区间&lt;/strong&gt;的栈维护&lt;/p&gt;&lt;p&gt;这里操作比较繁琐 就列举几个注意点 具体可以看代码&lt;/p&gt;&lt;p&gt;每次扫描到一个新的Height就执行&lt;strong&gt;维护单调性的弹栈操作&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;然后把新的Height压入栈中 注意要同时&lt;strong&gt;记录区间范围&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;区间内&lt;strong&gt;B串的个数用部分和统计&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;注意每个栈内节点都&lt;strong&gt;保存一下它以下所有节点的答案和&lt;/strong&gt; 这样每次统计就不用扫描整个栈了&lt;br /&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;每次扫描到一个A就统计一下即可 具体看下图&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/139826/2010121423444338.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;给一下核心的代码&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('9d9dc57c-6ec3-4409-8cb6-27d6162f95b2')"&gt;&lt;div id="cnblogs_code_open_9d9dc57c-6ec3-4409-8cb6-27d6162f95b2"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;    d[&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; n &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; s[i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;m&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; d[i]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;d[i&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; d[i]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;d[i&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    ans:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; n &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; h[i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;l&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            st[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;].h:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            st[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;].x:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;i&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; st[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;].y:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;i&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            st[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;].ans:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            top:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            now:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; st[top].h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;h[i] &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                now:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;now&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;st[top].ans;&lt;br /&gt;                dec(top);&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            next:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;top; inc(top);&lt;br /&gt;            st[top].h:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;h[i];&lt;br /&gt;            st[top].y:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;i&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; st[top].x:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;st[next].y&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            st[top].ans:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(st[top].h&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;l&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;(d[st[top].y]&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;d[st[top].x&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br /&gt;            now:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;now&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;st[top].ans;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; s[i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;m &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; ans:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;ans&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;now;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; n &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; s[i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;m&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; d[i]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;d[i&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; d[i]:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;d[i&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; i:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;to&lt;/span&gt;&lt;span style="color: #000000;"&gt; n &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; h[i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;l&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            st[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;].h:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            st[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;].x:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;i&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; st[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;].y:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;i&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            st[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;].ans:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            top:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            now:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; st[top].h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;h[i] &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                now:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;now&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;st[top].ans;&lt;br /&gt;                dec(top);&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            next:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;top; inc(top);&lt;br /&gt;            st[top].h:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;h[i];&lt;br /&gt;            st[top].y:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;i&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; st[top].x:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;st[next].y&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            st[top].ans:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(st[top].h&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;l&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;(d[st[top].y]&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;d[st[top].x&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br /&gt;            now:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;now&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;st[top].ans;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; s[i]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;m &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; ans:&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;ans&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;now;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    writeln(ans);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;写了一共8篇文章 简要介绍了一下字符串的相关算法和数据结构&lt;/p&gt;&lt;p&gt;到此 告一段落 当然还有很多没写到的 比如&lt;strong&gt;后缀树 扩展的KMP算法&lt;/strong&gt;等&lt;/p&gt;&lt;p&gt;谢谢阅读 如有不足 欢迎指正!&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;BOB HAN 原创 转载请注明出处 http://www.cnblogs.com/Booble/&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Booble/aggbug/1906147.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Booble/archive/2010/12/14/1906147.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
