﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Mato is No.1-随笔分类-专题:数据结构动态模拟问题</title><link>http://www.cppblog.com/MatoNo1/category/18486.html</link><description>Mato是一只超级大沙茶……但他一直以来都想成为各项比赛都No.1的神犇……</description><language>zh-cn</language><lastBuildDate>Sun, 06 Apr 2014 02:32:25 GMT</lastBuildDate><pubDate>Sun, 06 Apr 2014 02:32:25 GMT</pubDate><ttl>60</ttl><item><title>关于树分治的问题</title><link>http://www.cppblog.com/MatoNo1/archive/2013/08/31/202905.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 31 Aug 2013 15:39:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2013/08/31/202905.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/202905.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2013/08/31/202905.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/202905.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/202905.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: （从NOI以后一直在各网站上做水题&#8230;&#8230;谁叫我这么弱做不动难题呢&#8230;&#8230;）（最近实在感觉到弱得令人吃惊&#8230;&#8230;这样下去还混什么集训队啊&#8230;&#8230;于是只好去挑难题了&#8230;&#8230;中间对某些知识点有一些见解&#8230;&#8230;就总结在这里了囧&#8230;&#8230;）（最近见到了比较多的树分治的题...&nbsp;&nbsp;<a href='http://www.cppblog.com/MatoNo1/archive/2013/08/31/202905.html'>阅读全文</a><img src ="http://www.cppblog.com/MatoNo1/aggbug/202905.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2013-08-31 23:39 <a href="http://www.cppblog.com/MatoNo1/archive/2013/08/31/202905.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【AHOI2013复仇】再看HDU2871</title><link>http://www.cppblog.com/MatoNo1/archive/2012/11/25/195647.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sun, 25 Nov 2012 06:54:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/11/25/195647.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/195647.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/11/25/195647.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/195647.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/195647.html</trackback:ping><description><![CDATA[<div><a title="原题地址" href="http://acm.hdu.edu.cn/showproblem.php?pid=2871">原题地址</a><br />本沙茶去年曾经用双线段树的方法捉了这题（详见<a title="这里" href="http://www.cppblog.com/MatoNo1/archive/2011/12/18/162313.html">这里</a>），最近重新审视这题发现，借助平衡树，可以得到更简单的方法。<br /><br />题目大意：<br />有一个长度为N的内存条，每个位置的状态有占用和不占用两种，有4种操作：<br />（1）Reset：清空所有内存（即将所有位置的状态改为不占用，删除所有内存块）；<br />（2）New x：申请一个新的内存块，即找到一个长度为x的连续不占用位置区间，将它们标记为占用，若有多个这样的区间，取最左边的，若木有输出Reject New；<br />（3）Free x：在已申请的内存块中，找到包含位置x的并释放（将该内存块删除，同时其占用的所有位置改为不占用），若木有内存块包含位置x，则输出Reject Free；<br />（4）Get x：找出已申请的内存块中，左起第x个，并输出其左端点；若已申请的内存块数目不足x个，则输出Reject Get。<br /><br />可以发现，每个已经申请的内存块尽管代表一段区间，但仍然是独立的单位，因此，可以把内存块当成结点，用平衡树维护（关键字为内存块的左端点位置），New操作中内存块的插入与Free操作中内存块的删除均在此平衡树内进行，Reset操作只需要将整棵树销毁即可。<br />问题是，在New操作中，需要找到一个长度为x的连续不占用区间，而连续的不占用区间并不是独立的单位，因此需要使用线段树维护。在线段树中，需要维护&lt;1&gt;结点区间内最长连续不占用块的长度；&lt;2&gt;结点区间左端、右端连续不占用块的长度（否则无法维护&lt;1&gt;）；同时，由于在New操作中需要区间整体改占用，Free操作中又需要区间整体改不占用，所以应当支持整体改值的标记，对于Reset操作，只需要全部位置改不占用即可（不能重新建树！！）；<br /><br />这样，利用一棵平衡树加一棵线段树，就可以得到一个很简单的方法了（代码量是双平衡树或双线段树的一半左右）；<br /><br />这题的启示是，在解决数据结构统计类题的时候，到底选用什么样的数据结构，是有讲究的，因为它将直接影响到编程复杂度。一般来说，线段树比平衡树好写，但是对本题而言，双线段树反而不如平衡树加线段树好写，这是因为对于内存块使用平衡树维护比使用线段树维护更好。在以后做这种题的时候，要多想一下，找到简便方法。<br /></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/195647.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2012-11-25 14:54 <a href="http://www.cppblog.com/MatoNo1/archive/2012/11/25/195647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>终于会写动态树了</title><link>http://www.cppblog.com/MatoNo1/archive/2012/02/26/166547.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sun, 26 Feb 2012 05:03:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/02/26/166547.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/166547.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/02/26/166547.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/166547.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/166547.html</trackback:ping><description><![CDATA[【背景】<br />2012年1月19日，本沙茶开始看动态树论文，搞懂了一些；<br />2012年1月20日，开始写动态树，使用的题是QTREE，花了整整一天时间总算写完，交上去，TLE&#8230;&#8230;<br />2012年1月21日，又调了一天，对拍了100+组随机数据都瞬间出解，交上去，还是TLE&#8230;&#8230;<br />2012年2月8日，WC2012，fanhq666讲动态树，又搞懂了一点，于是当天晚上回房间以后就开始继续调，交上去，TLE&#8230;&#8230;<br />2012年2月9日，晚上继续调QTREE，TLE&#8230;&#8230;<br />在挑战动态树N次失败之后，本沙茶昨天再次去挑战动态树&#8230;&#8230;这次换了一个题：<a title="BZOJ2002" href="http://www.zybbs.org/JudgeOnline/problem.php?id=2002">BZOJ2002</a>（传说中的动态树模板题）<br />一开始还是TLE了，不过后来把数据搞到手以后，发现TLE的原因并不是常数大，而是死循环了，最后，经过2h+的调试，总算找到了错误（有好几处），终于AC了&#8230;&#8230;<br /><br />【关于BZOJ2002】<br />从每个点i往(i+Ki)连一条边，如果(i+Ki)不存在则往一个附加的结点（本沙茶的代码中为1号点，因为0号点是不能使用的）连一条边，这样就是一棵树（除1号点外，每个点有且只有一个后继&#8230;&#8230;），然后，问题中的两种操作就是&#8220;改接&#8221;和&#8220;询问到根的距离&#8221;，可以用动态树搞；<br /><br />【代码】<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;std;<br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;re1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=1;&nbsp;i&lt;=n;&nbsp;i++)</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;re2(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;r;&nbsp;i++)</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;re3(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;=r;&nbsp;i++)</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;rre(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n-1;&nbsp;i&gt;=0;&nbsp;i--)</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;rre1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n;&nbsp;i&gt;0;&nbsp;i--)</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;rre2(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r-1;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;rre3(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;MAXN&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">200004</span><span style="color: #000000; ">,&nbsp;INF&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">0U</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;node&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;c[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">],&nbsp;p,&nbsp;sz;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;rf,&nbsp;d;<br />}&nbsp;T[MAXN];<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n;<br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;sc(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;_p,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;_c,&nbsp;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;_d)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[_p].c[_d]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;_c;&nbsp;T[_c].p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;_p;&nbsp;T[_c].d&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;_d;<br />}<br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;upd(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;No)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[No].sz&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;T[T[No].c[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]].sz&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;T[T[No].c[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]].sz&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />}<br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;rot(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;No)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;T[No].p;&nbsp;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;d&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;T[No].d;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(T[p].rf)&nbsp;{T[p].rf&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;T[No].rf&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;T[No].p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;T[p].p;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;sc(T[p].p,&nbsp;No,&nbsp;T[p].d);<br />&nbsp;&nbsp;&nbsp;&nbsp;sc(p,&nbsp;T[No].c[</span><span style="color: #000000; ">!</span><span style="color: #000000; ">d],&nbsp;d);&nbsp;sc(No,&nbsp;p,&nbsp;</span><span style="color: #000000; ">!</span><span style="color: #000000; ">d);&nbsp;upd(p);<br />}<br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;splay(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;No)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;p;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">T[No].rf)&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(T[p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;T[No].p].rf)&nbsp;rot(No);&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(T[No].d&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;T[p].d)&nbsp;{rot(p);&nbsp;rot(No);}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{rot(No);&nbsp;rot(No);}&nbsp;upd(No);<br />}<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;access(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">do</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;splay(x);&nbsp;T[T[x].c[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]].rf&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;T[tmp].rf&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;sc(x,&nbsp;tmp,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;upd(x);&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;x;&nbsp;x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;T[x].p;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(x);<br />}<br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;cut(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;access(x);&nbsp;splay(x);&nbsp;T[T[x].c[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]].rf&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;T[T[x].c[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]].p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;sc(x,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);&nbsp;upd(x);<br />}<br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;join(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;x,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;p)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;access(x);&nbsp;T[x].p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;p;<br />}<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;m,&nbsp;x,&nbsp;y,&nbsp;z;<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">n);&nbsp;n</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;re3(i,&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;n)&nbsp;{scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">x);&nbsp;T[i].sz&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;T[i].rf&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(i&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;x&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;n)&nbsp;T[i].p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;x;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;T[i].p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;T[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">].sz&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;T[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">].rf&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;T[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">].sz&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">m);<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">x);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(x&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">y);&nbsp;y&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;access(y);&nbsp;splay(y);&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;T[T[y].c[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]].sz);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">y,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">z);&nbsp;y&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cut(y);&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(y&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;z&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;n)&nbsp;join(y,&nbsp;y&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;z);&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;join(y,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000;">;<br />}<br /></span></div><br />【易疵点】<br />（1）注意一个点的父结点p有两种可能：如果该结点是某棵伸展树的根结点则p为它通过轻边连向的另一棵伸展树中的某一个点的编号（在原树中，就是该结点所在伸展树代表的链的最上层的那个节点的父结点），否则为该结点在伸展树中的父结点编号（通过重边相连）；<br />（2）在改接时删除边的时候，如果删除的是轻边则直接把父结点设为0即可，如果是重边则要sc一下再将父结点设为0；<br />（3）rot里面有一个地方很关键，极易疵！就是如果p是伸展树的根结点，则除了No的rf改为1，p的rf改为0之外，还要把No的父结点设为p的父结点；<br />（4）本题中不涉及整棵大树的根（就是root），如果需要root，则rot中还要加一句：if (root == p) root = No;<br />（5）cut里面有一种简便写法（不需要找到x的父结点的）：先access(x)，将x伸展到根之后，x及其右子树就是原树中以x为根的子树，左子树就是其它部分，所以直接将x与其左子结点断开即可（注意断开的是重边所以要sc一下，再将x的左子结点的父结点设为0、rf设为1，再upd一下）；<br />（6）一定要搞清楚rf的变化（该改时一定要改！）<br /><br />最后，放上fanhq666超级大神的总结：<br /><a title="0" href="http://fanhq666.blog.163.com/blog/static/819434262011179150889/">0</a><a title="1" href="http://fanhq666.blog.163.com/blog/static/819434262011518104215977/">1</a><img src ="http://www.cppblog.com/MatoNo1/aggbug/166547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2012-02-26 13:03 <a href="http://www.cppblog.com/MatoNo1/archive/2012/02/26/166547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>新型LCA算法及树的路径剖分模板总结</title><link>http://www.cppblog.com/MatoNo1/archive/2012/01/14/164163.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 14 Jan 2012 04:34:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/01/14/164163.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/164163.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/01/14/164163.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/164163.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/164163.html</trackback:ping><description><![CDATA[【1】新型LCA算法：（在WJMZBMR神犇空间上发现的，系神犇自创，Orz！！！）<br />这种算法可以在仅使用树的路径剖分预处理中求出的DEP和UP来求任意两点的LCA，时间复杂度为O(log<sub>2</sub>N)，不需要单独的预处理。<br />步骤（假设求a0、b0两点的LCA）：<br />（1）若UP[a0]==UP[b0]，则a0、b0位于同一条重链上，显然a0、b0中深度小的那个就是LCA了，返回结果，结束；<br />（2）若UP[a0]!=UP[b0]且DEP[UP[a0]]&gt;=DEP[UP[b0]]，则<span style="color: red"><strong>LCA不可能在a0所在的那条重链上</strong></span>。证明：若LCA在a0所在的重链上，则UP[a0]必然也是a0、b0的公共祖先，也就是UP[a0]是b0的祖先。由于UP[a0]的深度大于等于UP[b0]，若DEP[UP[a0]]&gt;DEP[b0]，则UP[a0]显然不可能是b0的祖先，否则，在b0所在的重链上必然存在一个点C，满足DEP[C]=DEP[UP[a0]]，显然，C也是b0的祖先，这就说明在树中同一深度处存在两个不同的结点，它们都是b0的祖先，这是不可能的，所以，LCA不可能在a0所在重链上。那么，a0就可以上溯到UP[a0]的父结点处（也就是E[FA[UP[a0]]].a），b0不动，然后继续判断；<br />（3）若UP[a0]!=UP[b0]且DEP[UP[a0]]&lt;DEP[UP[b0]]，则LCA不可能在b0所在的重链上，将b0上溯到E[FA[UP[b0]]].a，a0不动，继续判断。<br />由于a0、b0最多上溯O(log<sub>2</sub>N)次，所以该算法一定能在O(log<sub>2</sub>N)时间内求出LCA(a0, b0)。<br />该算法的应用很广，不光可以在树的路径剖分中快速求出LCA，精简代码，同时也减少了一些时间（因为它不需要像RMQ那样进行预处理），而且，在一般的求LCA问题中，也可以先剖分求出UP再求LCA。<br />代码：
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;LCA(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(UP[a]&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;UP[b])&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;DEP[a]&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;DEP[b]&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;a&nbsp;:&nbsp;b;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(DEP[UP[a]]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;DEP[UP[b]])&nbsp;a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[FA[UP[a]]].a;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[FA[UP[b]]].a;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div><br />【2】树的路径剖分模板总结：<br />（1）预处理部分：由于采用新型LCA算法（注意，求LCA的过程写成专门的函数），所以，原来预处理部分的后3步都不需要了，也就是只要前3步：第一步建有根树求出FA、DEP；第二步求出SZ划分轻重边；第三步找重链建线段树求出UP、ord、tot和root。那些为了求RMQ而设置的数组也不需要了。<br />（2）操作部分：难点在于上溯过程和衔接。设待操作的路径为a0-&gt;b0（注意是有向的，<span>无向的也可以当成有向的处理）</span><span>，LCA0=LCA(a0, </span><span>b0)；</span><br /><span>对于点权型的树，<strong><span style="font-family: Verdana; color: red">a0-&gt;LCA0</span></strong><strong><span style="font-family: 宋体; color: red">的过程需要包含</span></strong><strong><span style="font-family: Verdana; color: red">LCA0</span></strong><strong><span style="font-family: 宋体; color: red">，而</span></strong><strong><span style="font-family: Verdana; color: red">b0-&gt;LCA0</span></strong><strong><span style="font-family: 宋体; color: red">的过程不能包含</span></strong><strong><span style="font-family: Verdana; color: red">LCA0</span></strong><strong><span style="font-family: 宋体; color: red">。因此当</span></strong><strong><span style="font-family: Verdana; color: red">b0==LCA0</span></strong><strong><span style="font-family: 宋体; color: red">时，第二步应该什么事都不做，所以要特判；此外，如果</span></strong><strong><span style="font-family: Verdana; color: red">N==1</span></strong><strong><span style="font-family: 宋体; color: red">（树中只有一个结点），为了防止引用根的父结点，也需要直接特判掉</span><span style="color: red"></span></strong></span>，所以，上溯过程可以分以下4步：<br />&lt;1&gt;特判：若n=1（此时必然有a0==b0==0），直接操作0号结点，结束；<br />&lt;2&gt;(a0-&gt;LCA)若a0是父边是轻边的叶结点，则单独处理a0，最新点设为a0，a0跳到a0的父结点处开始，否则从a0开始（上溯）。上溯终止条件为DEP[a0]&lt;DEP[LCA0]或者上溯到根结点，每次处理时，设c=&#8221;UP[a0]不超越LCA?UP[a0]:LCA"，对[c, a0]段处理（l0=ord[c], r0=ord[a0]），再将a0上溯到c的父结点处（若c是根结点则退出）；处理时，线段树中记录的所有有向的（从左到右的）信息都要反向；衔接时应不断向右衔接；<br />&lt;3&gt;(b0-&gt;LCA)与&lt;2&gt;类似，两个不同点：一是有向的信息不要反向，衔接时应不断向左衔接；二是若c==LCA，则l0=ord[c]+1；<br />&lt;4&gt;最后将&lt;2&gt;中和&lt;3&gt;中得到的两个衔接链再衔接一下即可；<br /><br />对于边权型的树，a0-&gt;LCA0的过程和b0-&gt;LCA0的过程都要包含LCA0引出的边，b0==LCA0以及N==1时不需要特判（因为它们会自动地什么事都不做）；在处理过程中，l0=ord[c], r0=ord[a0]-1；要分轻边和重链分别处理；每次a0上溯到c而不是c的父结点处；终止条件为DEP[a0]&lt;=DEP[LCA0]。<br /><br />模板题：<a title="PKU2831" href="http://poj.org/problem?id=2831">PKU2831</a>（动态最小生成树问题，需要涉及到最小生成树中两点之间路径上的最大边权，用树的路径剖分。其实本题有离线算法，不需要树的路径剖分）<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=1;&nbsp;i&lt;=n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re2(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re3(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;=r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n-1;&nbsp;i&gt;=0;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n;&nbsp;i&gt;0;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre2(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r-1;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre3(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MAXN&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1001</span><span style="color: #000000">,&nbsp;MAXM&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">100001</span><span style="color: #000000">,&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;_edge&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;b,&nbsp;w;<br />}&nbsp;_E[MAXM],&nbsp;_E2[MAXM];<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;edge&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;b,&nbsp;w,&nbsp;pre,&nbsp;next;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;Z;<br />}&nbsp;E0[MAXN&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">],&nbsp;E[MAXN&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">];<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;node&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;maxw,&nbsp;lch,&nbsp;rch;<br />}&nbsp;T[MAXN&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">];<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,&nbsp;_m,&nbsp;m0,&nbsp;m,&nbsp;N,&nbsp;u[MAXN],&nbsp;Q[MAXN],&nbsp;FA[MAXN],&nbsp;DEP[MAXN],&nbsp;SZ[MAXN],&nbsp;UP[MAXN],&nbsp;ord[MAXN],&nbsp;w0[MAXN],&nbsp;tot[MAXN],&nbsp;root[MAXN],&nbsp;l0,&nbsp;r0,&nbsp;x0,&nbsp;res;<br /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;vst[MAXN];<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init_d()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;E0[i].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[i].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[i].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[i].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;m0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;add_edge0(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;w)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;E0[m0].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;E0[m0].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;E0[m0].w&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;w;&nbsp;E0[m0].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[a].pre;&nbsp;E0[m0].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;E0[a].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m0;&nbsp;E0[E0[m0].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m0</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;E0[m0].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;E0[m0].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;E0[m0].w&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;w;&nbsp;E0[m0].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[b].pre;&nbsp;E0[m0].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;E0[b].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m0;&nbsp;E0[E0[m0].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m0</span><span style="color: #000000">++</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;add_edge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;w)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;E[m].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;E[m].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;E[m].w&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;w;&nbsp;E[m].Z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;E[m].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[a].pre;&nbsp;E[m].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;E[a].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;&nbsp;E[E[m].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m</span><span style="color: #000000">++</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;cmp(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">s1,&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">s2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;((_edge&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)s1)</span><span style="color: #000000">-&gt;</span><span style="color: #000000">w&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;((_edge&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)s2)</span><span style="color: #000000">-&gt;</span><span style="color: #000000">w;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;UFS_find(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x,&nbsp;tmp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(u[r]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;u[r];&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(u[x]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;{tmp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;u[x];&nbsp;u[x]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;r;&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp;}&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;r;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;UFS_union(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x1,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(u[x1]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;u[x2])&nbsp;{u[x2]&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;u[x1];&nbsp;u[x1]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x2;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{u[x1]&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;u[x2];&nbsp;u[x2]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x1;}<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mkt(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;No&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">N;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;r)&nbsp;{T[No].maxw&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;w0[l];&nbsp;T[No].lch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[No].rch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;l_r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mkt(l,&nbsp;mid),&nbsp;r_r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mkt(mid&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;r);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T[No].maxw&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[No].lch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l_r].maxw&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;T[T[No].rch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;r_r].maxw&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;T[l_r].maxw&nbsp;:&nbsp;T[r_r].maxw;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;No;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;prepare()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;qsort(_E2,&nbsp;_m,&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(_E2[</span><span style="color: #000000">0</span><span style="color: #000000">]),&nbsp;cmp);<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;u[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;b,&nbsp;r1,&nbsp;r2,&nbsp;total&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;maxsz,&nbsp;x,&nbsp;n0;<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;_m)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_E2[i].a;&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_E2[i].b;&nbsp;r1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;UFS_find(a);&nbsp;r2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;UFS_find(b);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(r1&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;r2)&nbsp;{UFS_union(r1,&nbsp;r2);&nbsp;add_edge0(a,&nbsp;b,&nbsp;_E2[i].w);&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">++</span><span style="color: #000000">total&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;vst[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;Q[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;DEP[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;N&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;vst[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;FA[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;front</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;rear</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;front</span><span style="color: #000000">&lt;=</span><span style="color: #000000">rear;&nbsp;front</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Q[front];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E0[a].next;&nbsp;p&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;a;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E0[p].next)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[p].b;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">vst[b])&nbsp;{FA[b]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;&nbsp;DEP[b]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;DEP[a]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;vst[b]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;Q[</span><span style="color: #000000">++</span><span style="color: #000000">rear]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;add_edge(a,&nbsp;b,&nbsp;E0[p].w);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;rre(i,&nbsp;n)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Q[i];&nbsp;SZ[a]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;maxsz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E[a].next;&nbsp;p&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;a;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E[p].next)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[p].b;&nbsp;SZ[a]&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;SZ[b];&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(SZ[b]&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;maxsz)&nbsp;{maxsz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SZ[b];&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(SZ[a]&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;E[x].Z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;UP[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ord[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;re2(i,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;n)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Q[i];&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;FA[a];&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(E[p].Z)&nbsp;{UP[a]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;UP[E[p].a];&nbsp;ord[a]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ord[E[p].a]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{UP[a]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;ord[a]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(SZ[a]&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;E[FA[a]].Z)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;UP[a];&nbsp;n0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ord[a];&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;j</span><span style="color: #000000">=</span><span style="color: #000000">a;&nbsp;j</span><span style="color: #000000">!=</span><span style="color: #000000">b;&nbsp;j</span><span style="color: #000000">=</span><span style="color: #000000">E[FA[j]].a)&nbsp;w0[</span><span style="color: #000000">--</span><span style="color: #000000">n0]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[FA[j]].w;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tot[b]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ord[a];&nbsp;root[b]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mkt(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;ord[a]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;j</span><span style="color: #000000">=</span><span style="color: #000000">a;&nbsp;j</span><span style="color: #000000">!=</span><span style="color: #000000">b;&nbsp;j</span><span style="color: #000000">=</span><span style="color: #000000">E[FA[j]].a)&nbsp;{tot[j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tot[b];&nbsp;root[j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;root[b];}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;LCA(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(UP[a]&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;UP[b])&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;DEP[a]&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;DEP[b]&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;a&nbsp;:&nbsp;b;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(DEP[UP[a]]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;DEP[UP[b]])&nbsp;a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[FA[UP[a]]].a;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[FA[UP[b]]].a;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;opr0(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;No)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;l0&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;r0)&nbsp;{</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[No].maxw&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;res)&nbsp;res&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[No].maxw;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(mid&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;l0)&nbsp;opr0(l,&nbsp;mid,&nbsp;T[No].lch);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(mid&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;r0)&nbsp;opr0(mid&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;r,&nbsp;T[No].rch);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P,&nbsp;s,&nbsp;a0,&nbsp;b0,&nbsp;w0,&nbsp;LCA0,&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">n,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">_m,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">P);&nbsp;init_d();<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;_m)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">a0,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">b0,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">w0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_E[i].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_E2[i].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">a0;&nbsp;_E[i].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_E2[i].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">b0;&nbsp;_E[i].w&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_E2[i].w&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;w0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;prepare();<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;P)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">s,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">w0);&nbsp;a0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_E[</span><span style="color: #000000">--</span><span style="color: #000000">s].a;&nbsp;b0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_E[s].b;&nbsp;LCA0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;LCA(a0,&nbsp;b0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(DEP[a0]&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;DEP[LCA0])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(E[FA[a0]].Z)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(DEP[UP[a0]]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;DEP[LCA0])&nbsp;c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;UP[a0];&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;LCA0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ord[c];&nbsp;r0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ord[a0]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;opr0(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;tot[a0]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;root[a0]);&nbsp;a0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(E[FA[a0]].w&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;res)&nbsp;res&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[FA[a0]].w;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[FA[a0]].a;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(DEP[b0]&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;DEP[LCA0])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(E[FA[b0]].Z)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(DEP[UP[b0]]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;DEP[LCA0])&nbsp;c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;UP[b0];&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;LCA0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ord[c];&nbsp;r0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ord[b0]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;opr0(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;tot[b0]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;root[b0]);&nbsp;b0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(E[FA[b0]].w&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;res)&nbsp;res&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[FA[b0]].w;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[FA[b0]].a;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts(res&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;w0&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Yes</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">No</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span></div><br />好了，对于模板也就到此为止了，接下来该搞应用了。<img src ="http://www.cppblog.com/MatoNo1/aggbug/164163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2012-01-14 12:34 <a href="http://www.cppblog.com/MatoNo1/archive/2012/01/14/164163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【树的路径剖分】点权型的处理办法、路径的衔接以及一些细节问题</title><link>http://www.cppblog.com/MatoNo1/archive/2012/01/12/164076.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Thu, 12 Jan 2012 12:44:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/01/12/164076.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/164076.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/01/12/164076.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/164076.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/164076.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 【例题】[SDOI2011]染色（注：数据范围木有交代，应为：点数N&lt;=105，操作数M&lt;=105，所有的颜色C为整数且在[0, 109]之间。一、树的路径剖分当中点权型（点上有权值而边上木有）的处理办法：（1）找重链建线段树的时候，w0中存储tot+1个数，为该重链自上而下的各点的权值（例题中为颜色）；（2）除了父边是轻边的叶结点之外，树中的每个结点都属于且仅属于一条重链（根据定义得...&nbsp;&nbsp;<a href='http://www.cppblog.com/MatoNo1/archive/2012/01/12/164076.html'>阅读全文</a><img src ="http://www.cppblog.com/MatoNo1/aggbug/164076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2012-01-12 20:44 <a href="http://www.cppblog.com/MatoNo1/archive/2012/01/12/164076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QTREE——树的路径剖分（又称树链剖分）</title><link>http://www.cppblog.com/MatoNo1/archive/2012/01/03/163491.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Tue, 03 Jan 2012 08:41:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/01/03/163491.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/163491.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/01/03/163491.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/163491.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/163491.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原题地址【有关树的路径剖分的东东在网上介绍的太多了&#8230;&#8230;】常见的路径剖分的方法是轻重边剖分，即把树中的边分为轻重两部分，方法：设SZ[i]为以i为根的子树的大小（结点总数），则若点x不是叶结点，则其子结点中SZ值最大的（注意，有多个SZ值最大的子结点应任选一个，只能选一个，防止出现重链相交，引发歧义）点y，边(x, y)称为重边，其余的边都是轻边。首尾相连的重边称为重链（注意...&nbsp;&nbsp;<a href='http://www.cppblog.com/MatoNo1/archive/2012/01/03/163491.html'>阅读全文</a><img src ="http://www.cppblog.com/MatoNo1/aggbug/163491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2012-01-03 16:41 <a href="http://www.cppblog.com/MatoNo1/archive/2012/01/03/163491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Splay Tree处理区间问题的几道好题及总结</title><link>http://www.cppblog.com/MatoNo1/archive/2011/06/25/149425.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 25 Jun 2011 03:21:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/06/25/149425.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/149425.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/06/25/149425.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/149425.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/149425.html</trackback:ping><description><![CDATA[<div>（1）Robotic Sort（<a title="HDU1890" href="http://acm.hdu.edu.cn/showproblem.php?pid=1890">HDU1890</a>、<a title="ZJU2985" href="http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2985">ZJU2985</a>）<br />本题主要考察的是对此类问题，序列中给定值的索引问题。<br />当Splay Tree用来处理一个序列的时候，其关键字就是序列中元素的下标，而不是元素的值。这样，如果要查找序列中给定的值的位置（假设序列中任意两个元素的值不相等）看起来就无法实现。其实也是有办法实现的：因为元素在树中的<span style="color: red"><strong>下标</strong></span>是永远不变的！也就是，设这个序列为A，如果A[i]在插入Splay Tree时的下标为j，那么在A[i]被删除之前，其下标一直是j，永远不会变（注意元素在序列中的下标和在树中的下标是不同的）。利用这一性质可以解决给定值的索引问题。<br />对于本题，每次将从序列中第i小的元素到序列中第i个元素（这里假定元素下标是从1开始的，而不是从0开始）之间的所有元素反转，并输出第i小的元素在反转之前的在序列中的下标。设B[i]为第i小的数的<span style="color: #ff0000"><strong>初始位置</strong></span>，S[i]为<span style="color: #ff0000"><strong>初始位置</strong></span>在第i位的元素的下标，B[i]和S[i]都可以通过预处理得到。然后，每次交换前，求出S[B[i]]在树中的排名（基本操作），再减1（因为有边界结点）就是该元素目前的位置，而序列中第i个元素就是树中第(i+1)小的元素，再执行交换即可。<br />不过需要千万注意的是本题的标记问题，在求S[B[i]]在树中的排名时，有可能其祖先结点上有标记，需要先遍历其所有的祖先结点，再逆向下放标记（标记只能自顶向下传）。另外在交换的时候需要求出S[B[i]]的后继，在求后继的过程中需要查找，此时千万别忘了下放标记（总的说，凡是有查找的地方，就有dm）<br /><a title="代码" href="http://www.ideone.com/NRqFR">代码</a>（本沙茶太弱了，是抄别人的，因此其算法和上面总结的可能有差别，神犇不要鄙视）</div><br />（2）SuperMemo（<a title="PKU3580" href="http://poj.org/problem?id=3580">PKU3580</a>）<br />本题的6个操作中，add、reverse、insert、delete、min都不难搞，而revolve操作需要涉及到区间交换。<br />可以发现，所谓的旋转其实就是交换两个相邻区间，这对于功能极强的Splay Tree来说根本不难搞。<br />设这两个相邻区间为[x, y]与[y+1, z]，假设它们均非空（也就是x&lt;=y&lt;z，因为若其中至少有一个区间是空区间，则交换没有意义），先找到树中x的前趋P与z的后继S（这里x、z等指的都是对应的结点，下同），将P伸展到根、将S伸展到根的右子结点处，则S的左子树就表示区间[x, z]。然后，设S的左子树的根结点（也就是S的左子结点）为N，在这棵子树中找到第1小的结点P0与第(y-x+2)小的结点S0（这需要涉及到找子树内第K小的操作，只要把找整棵树第K小的操作的root改为N即可），它们分别表示x与(y+1)，这样将P0伸展到N处，将S0伸展到N的右子结点处，显然P0无左子树，S0的左子树T1表示区间[x+1, y]，S0的右子树T2表示区间[y+2, z]。然后，先将S0从P0的右子结点移动到P0的左子结点，再将T1作为P0的右子树（注意移动是两步：插入和删除）。这样整棵子树的中序遍历结果变成了S0-&gt;T2-&gt;P0-&gt;T1，也就是[y+1, z]&#8746;[x, y]。<br />另外本题的标记有点难搞，只需注意rev是逆向标记，以及查找与dm共存就行了。<br /><a title="代码" href="http://www.ideone.com/HPSvO">代码</a><br />（3）Play with Chain(<a title="HDU3487" href="http://acm.hdu.edu.cn/showproblem.php?pid=3487">HDU3487</a>)<br />这个米有神马好说的，里面的操作在SuperMemo里都有；<br /><a title="代码" href="http://www.ideone.com/E4EXT">代码</a><br />（4）<a title="AHOI2006 文本编辑器(editor)" href="http://mail.bashu.cn:8080/BSoiOnline/showproblem?problem_id=2455">AHOI2006 文本编辑器(editor)</a><br />这题在这一类题里面算水的。对于光标，只要用一个值来维护就行了。<br />另外注意本题极为猥琐的2点（题目中米有说明）：一是最初的文本并不是空的，而是有一个空格；二是执行GET操作时光标可能位于文本末尾，此时应输出空格；<br /><a title="代码" href="http://www.ideone.com/dUjKz">代码</a><br />（5）HFTSC2011 高精度计算器(apc)，题目见<a title="这个帖子" href="http://tieba.baidu.com/f?kz=1039909717">这个帖子</a>；<br />这题反映出了一个很囧的问题：有些信息会被rev整体破坏。<br />本题中的操作都是常见操作，但是本题所需要维护的信息却不是那么容易维护。本题要求维护一棵子树中所有结点所表示的元素序列（中序遍历结果）模一个指定的M的值。设F[i]为R^i mod M的值（这里R是进制，也就是题目中的K），则有：<br />T[x].mod = (T[T[x].c[0]].mod * F[T[T[x].c[1]].sz + 1] + T[x].v * F[T[T[x].c[1]].sz] + T[T[x].c[1]].mod) % M;<br />这个式子其实是很好理解的。<br />关键是，本题的猥琐之处并不在此。注意本题的rev操作，它会整体改变树中所有结点所记录的mod值，这时，如果再用上面这个式子来维护T[x].mod，就会出错，因为此时引用到的T[T[x].c[0]].mod和T[T[x].c[1]].mod都是过时的。解决这一问题只有一种方法：记录&#8220;逆mod&#8221;(rmod)，意思是将整个元素序列反转后的mod，即：<br />T[x].rmod = (T[T[x].c[1]].rmod * F[T[T[x].c[0]].sz + 1] + T[x].v * F[T[T[x].c[0]].sz] + T[T[x].c[0]].rmod) % M;<br />这样，在反转某序列的时候，直接将根结点的mod值和rmod值交换就行了。<br />像mod这样会被反转操作整体破坏的信息还有很多，比如NOI2005 sequence里面的lmax和rmax。如果真的遇到这类信息，只有采用上面的方法。<br />另外，本题第6、9、10个点有误。<br /><a title="代码" href="http://www.ideone.com/FK4nQ">代码</a><br /><br />现在Splay Tree差不多弄完了，接下来还有N多知名的、不知名的高级数据结构&#8230;&#8230;时间MS有些不够用了囧&#8230;&#8230;<br /> <img src ="http://www.cppblog.com/MatoNo1/aggbug/149425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-06-25 11:21 <a href="http://www.cppblog.com/MatoNo1/archive/2011/06/25/149425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【NOI2005 维护数列(sequence)】Splay Tree处理序列问题</title><link>http://www.cppblog.com/MatoNo1/archive/2011/06/21/149121.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Tue, 21 Jun 2011 08:06:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/06/21/149121.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/149121.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/06/21/149121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/149121.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/149121.html</trackback:ping><description><![CDATA[<div>【原题见<a title="这里" href="http://mail.bashu.cn:8080/BSoiOnline/showproblem?problem_id=2246">这里</a>】<br />本题是Splay Tree处理序列问题（也就是当线段树用）的一个典型例题。<br /><br />Splay Tree之所以可以当线段树用，是因为它可以支持一个序列，然后用&#8220;左端前趋伸展到根，右端后继伸展到根的右子结点，取根的右子结点的左子结点&#8221;这种伸展方法，对一个序列中的一整段进行整体操作。由于要防止出现前趋或后继不存在的情况，需要在这个序列的两端加入两个边界结点，要求其值不能影响到结点各种记载信息的维护（多取0、&#8734;或-&#8734;）。这两个边界结点在树中永远存在，不会被删除。<br /><br />（1）结点的引用：<br />在当线段树用的Splay Tree中，真正的关键字是下标而不是值，因此，&#8220;序列中第i个结点&#8221;实际上对应的是&#8220;树中第(i+1)小的结点&#8221;（因为左边还有一个边界结点），这就说明在对结点引用时需要找第K小的操作。因此，下面的&#8220;结点x&#8221;指的是&#8220;树中第(x+1)小的结点&#8221;。<br />（2）标记：<br />在线段树中，如果对一个结点所表示的线段整体进行了某种操作，需要在这个结点上打上一个标记，在下一次再找到这个结点时，其标记就会下放到其两个子结点上。在Splay Tree中也可以引入标记。比如要对[2, 6]这一段进行整体操作，就将结点1伸展到根的位置，将结点7伸展到根的右子树的位置，然后结点7的左子树就表示[2, 6]这一段，对这棵子树的根结点打上标记并立即生效（必须是立即生效，而不是等下一次引用再生效），也就是立即改变该结点记录的一些信息的值。如果下次再次引用到这个结点，就要将其标记下放到其两个子结点处；<br />需要注意的一点是，如果要伸展某个结点x到r的子结点的位置，就必须保证从x原来的位置到r的这个子结点（x伸展后的位置）上的所有结点上均没有标记，否则就会导致标记混乱。因此，必须首先找到这个结点x，在此过程中不断下放标记。<br />（3）自底向上维护的信息：<br />标记可以看成一种自顶向下维护的信息。除了标记以外，作为&#8220;线段树&#8221;，往往还要维护一些自底向上维护的信息。比如在sequence这题中，就有lmax（左段连续最大和）、rmax（右段连续最大和）、midmax（全段连续最大和）以及sum（全段总和）等信息要维护。对于这类东东其实也很好办，因为子树大小（sz域）就是一种自底向上维护的信息，因此对于这些信息只要按照维护sz域的办法维护即可（统一写在upd函数里）。唯一的不同点是打标记时它们的值可能要改变。<br />（4）对连续插入的结点建树：<br />本题的插入不是一个一个插入，而是一下子插入一整段，因此需要先将它们建成一棵树。一般建树操作都是递归的，这里也一样。设目前要对A[l..r]建树（A为待插入序列），若l&gt;r则退出，否则找到位于中间的元素mid = l + r &gt;&gt; 1，将A[mid]作根，再对A[l..mid-1]建左子树，对A[mid+1..r]建右子树即可。这样可以保证一开始建的就是一棵平衡树，减小常数因子。<br />（5）回收空间：<br />根据本题的数据范围提示，插入的结点总数最多可能达到4000000，但在任何时刻树中最多只有500002个结点（包括两个边界），此时为了节省空间，可以采用循环队列回收空间的方法。即：一开始将所有的可用空间（可用下标，本题为1~500002）存在循环队列Q里，同时设立头尾指针front和rear，每次如果有新结点插入，就取出Q[front]并作为新结点的下标，如果有结点要删除（本题是一次删除整棵子树，因此在删除后需要分别回收它们的空间），则从rear开始，将每个删除的结点的下标放回到Q里。当然，这种方法是要牺牲一定的时间的，因此在空间不是特别吃紧的情况下不要用。<br /><br />【2012年1月16日更新】<br />今天重写sequence的时候，秃然发现加入的边界点可能会对lmax、rmax、midmax等的维护造成影响：当序列中所有的值都是负数时，若边界点的值设为0，将使这3个值也为0，所以，边界点的值应设为-INF（不会影响到sum，因为可以单独调出[l, r]的sum，避开边界）。这就说明并非所有这样的题中都可以设置边界点（比如HFTSC2011的那题就不行），如果边界点会对维护的信息造成影响，就不能设置边界点，在各个操作中，分4种情况判断。（代码已经修改）<br /><br />下面上代码了： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=1;&nbsp;i&lt;=n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MAXN&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">500002</span><span style="color: #000000">,&nbsp;NOSM&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">2000</span><span style="color: #000000">,&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;node&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;v,&nbsp;c[</span><span style="color: #000000">2</span><span style="color: #000000">],&nbsp;p,&nbsp;sz,&nbsp;sum,&nbsp;lmax,&nbsp;rmax,&nbsp;midmax,&nbsp;sm;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;rev,&nbsp;d;<br />}&nbsp;T[MAXN&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;root,&nbsp;Q[MAXN&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">],&nbsp;front,&nbsp;rear,&nbsp;a[MAXN],&nbsp;len,&nbsp;res;<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SS0,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SS1)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SS0&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;SS1&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;SS0&nbsp;:&nbsp;SS1;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SS0,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SS1,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SS2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;M0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SS0&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;SS1&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;SS0&nbsp;:&nbsp;SS1;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;M0&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;SS2&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;M0&nbsp;:&nbsp;SS2;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;newnode(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_v)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[n].v&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[n].sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[n].lmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[n].rmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[n].midmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_v;&nbsp;T[n].c[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[n].c[</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;T[n].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;T[n].sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NOSM;&nbsp;T[n].rev&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;sc(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_p,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_c,&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;_d)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[_p].c[_d]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_c;&nbsp;T[_c].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_p;&nbsp;T[_c].d&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_d;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;sm_opr(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SM)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].sz&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;SM;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(SM&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;T[x].lmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].rmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].midmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].sum;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;T[x].lmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].rmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].midmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SM;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;rev_opr(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;c0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">],&nbsp;c1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">];&nbsp;sc(x,&nbsp;c0,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;sc(x,&nbsp;c1,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;tmp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].lmax;&nbsp;T[x].lmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].rmax;&nbsp;T[x].rmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;dm(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SM0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].sm;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(SM0&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NOSM)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T[x].v&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">]].sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">]].sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SM0;&nbsp;T[x].sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NOSM;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sm_opr(T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">],&nbsp;SM0);&nbsp;sm_opr(T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">],&nbsp;SM0);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[x].rev)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T[T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">]].rev&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">T[T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">]].rev;&nbsp;T[T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">]].rev&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">T[T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">]].rev;&nbsp;T[x].rev&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rev_opr(T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">]);&nbsp;rev_opr(T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;upd(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;c0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">],&nbsp;c1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[c0].sz&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[c1].sz&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[c0].sum&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[c1].sum&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[x].v;<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].lmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;max(T[c0].lmax,&nbsp;T[c0].sum&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[x].v&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;max(T[c1].lmax,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].rmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;max(T[c1].rmax,&nbsp;max(T[c0].rmax,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[x].v&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[c1].sum);<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].midmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;max(T[c0].midmax,&nbsp;T[c1].midmax,&nbsp;max(T[c0].rmax,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[x].v&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;max(T[c1].lmax,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">));<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;rot(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].p;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;d&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].d;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(y&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;root)&nbsp;{root&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;&nbsp;T[root].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;sc(T[y].p,&nbsp;x,&nbsp;T[y].d);<br />&nbsp;&nbsp;&nbsp;&nbsp;sc(y,&nbsp;T[x].c[</span><span style="color: #000000">!</span><span style="color: #000000">d],&nbsp;d);&nbsp;sc(x,&nbsp;y,&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">d);&nbsp;upd(y);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;splay(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;((p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].p)&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;r)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[p].p&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;r)&nbsp;rot(x);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[x].d&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;T[p].d)&nbsp;{rot(p);&nbsp;rot(x);}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{rot(x);&nbsp;rot(x);}&nbsp;upd(x);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Find_Kth(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;K)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;root,&nbsp;S0;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dm(i);&nbsp;S0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[i].c[</span><span style="color: #000000">0</span><span style="color: #000000">]].sz&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(K&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;S0)&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(K&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;S0)&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].c[</span><span style="color: #000000">0</span><span style="color: #000000">];&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{K&nbsp;</span><span style="color: #000000">-=</span><span style="color: #000000">&nbsp;S0;&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].c[</span><span style="color: #000000">1</span><span style="color: #000000">];}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;i;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mkt(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;r)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Q[front],&nbsp;mid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(front&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;MAXN)&nbsp;front&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;front</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;newnode(n0,&nbsp;a[mid]);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l_r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mkt(l,&nbsp;mid&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">),&nbsp;r_r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mkt(mid&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;r);<br />&nbsp;&nbsp;&nbsp;&nbsp;sc(n0,&nbsp;l_r,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;sc(n0,&nbsp;r_r,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;upd(n0);&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;n0;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ins(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;pos)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(pos);&nbsp;splay(P0,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(pos&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P1,&nbsp;root);&nbsp;sc(P1,&nbsp;mkt(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;len&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">),&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;upd(P1);&nbsp;upd(P0);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;era(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">x)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(rear&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;MAXN)&nbsp;rear&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;rear</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;Q[rear]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;era(T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">]);&nbsp;era(T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">]);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;del(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(l&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P0,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(r&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P1,&nbsp;root);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;root0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[P1].c[</span><span style="color: #000000">0</span><span style="color: #000000">];&nbsp;sc(P1,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;upd(P1);&nbsp;upd(P0);&nbsp;era(root0);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;mksame(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(l&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P0,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(r&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P1,&nbsp;root);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[P1].c[</span><span style="color: #000000">0</span><span style="color: #000000">];&nbsp;T[n].sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;&nbsp;sm_opr(n,&nbsp;x);&nbsp;upd(P1);&nbsp;upd(P0);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;reve(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(l&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P0,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(r&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P1,&nbsp;root);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[P1].c[</span><span style="color: #000000">0</span><span style="color: #000000">];&nbsp;T[n].rev&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">T[n].rev;&nbsp;rev_opr(n);&nbsp;upd(P1);&nbsp;upd(P0);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;get_sum(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(l&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P0,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(r&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P1,&nbsp;root);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[P1].c[</span><span style="color: #000000">0</span><span style="color: #000000">];&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;T[n].sum;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max_sum()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;T[root].midmax;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;prepare()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[</span><span style="color: #000000">0</span><span style="color: #000000">].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[</span><span style="color: #000000">0</span><span style="color: #000000">].sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[</span><span style="color: #000000">0</span><span style="color: #000000">].lmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[</span><span style="color: #000000">0</span><span style="color: #000000">].rmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[</span><span style="color: #000000">0</span><span style="color: #000000">].midmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;front&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">;&nbsp;rear&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;MAXN;&nbsp;re1(i,&nbsp;MAXN)&nbsp;Q[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;newnode(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF);&nbsp;newnode(</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF);&nbsp;sc(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;root&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;T[root].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;freopen(</span><span style="color: #000000">"</span><span style="color: #000000">sequence.in</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">r</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;stdin);<br />&nbsp;&nbsp;&nbsp;&nbsp;freopen(</span><span style="color: #000000">"</span><span style="color: #000000">sequence.out</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">w</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;stdout);<br />&nbsp;&nbsp;&nbsp;&nbsp;prepare();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m,&nbsp;l,&nbsp;r,&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">len,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">m);&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;ch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getchar(),&nbsp;str[</span><span style="color: #000000">1000</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;len)&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">a[i]);&nbsp;ins(</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%s</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;str);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">strcmp(str,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">INSERT</span><span style="color: #000000">"</span><span style="color: #000000">))&nbsp;{scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">l,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">len);&nbsp;re(i,&nbsp;len)&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">a[i]);&nbsp;ins(</span><span style="color: #000000">++</span><span style="color: #000000">l);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">strcmp(str,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">DELETE</span><span style="color: #000000">"</span><span style="color: #000000">))&nbsp;{scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">l,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">r);&nbsp;r&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;l</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;del(l,&nbsp;r);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">strcmp(str,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">MAKE-SAME</span><span style="color: #000000">"</span><span style="color: #000000">))&nbsp;{scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">l,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">r,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">x);&nbsp;r&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;l</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;mksame(l,&nbsp;r,&nbsp;x);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">strcmp(str,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">REVERSE</span><span style="color: #000000">"</span><span style="color: #000000">))&nbsp;{scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">l,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">r);&nbsp;r&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;l</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;reve(l,&nbsp;r);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">strcmp(str,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">GET-SUM</span><span style="color: #000000">"</span><span style="color: #000000">))&nbsp;{scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">l,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">r);&nbsp;r&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;l</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;get_sum(l,&nbsp;r));}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">strcmp(str,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">MAX-SUM</span><span style="color: #000000">"</span><span style="color: #000000">))&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;max_sum());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getchar();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;fclose(stdin);&nbsp;fclose(stdout);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span></div><br />最后把我的这个代码与BYVoid神犇的本题代码进行测试比较，结果（BYVoid神犇的代码见<a title="这里" href="http://www.byvoid.com/blog/noi-2005-sequence/">这里</a>）：<br /><br />BYVoid神犇的：<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/matono1/测评结果/BYVoid_Sequence.jpg" width="295" longdesc="" height="166" /><br /><br />本沙茶的：<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/matono1/测评结果/Mato_No1_Sequence.jpg" width="291" longdesc="" height="166" /><br /><br />【相关论文】<br /><a title="运用伸展树解决数列维护问题" href="http://wenku.baidu.com/view/db0f77661ed9ad51f01df23f.html">运用伸展树解决数列维护问题</a>&nbsp;by JZP<br />【感谢】<br />JZP神犇（提供论文）<br />BYVoid神犇（提供标程）<br /></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/149121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-06-21 16:06 <a href="http://www.cppblog.com/MatoNo1/archive/2011/06/21/149121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>