﻿<?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/17199.html</link><description>Mato是一只超级大沙茶……但他一直以来都想成为各项比赛都No.1的神犇……</description><language>zh-cn</language><lastBuildDate>Tue, 09 Oct 2012 12:43:08 GMT</lastBuildDate><pubDate>Tue, 09 Oct 2012 12:43:08 GMT</pubDate><ttl>60</ttl><item><title>【AHOI2013复仇】SCOI2008 斜堆</title><link>http://www.cppblog.com/MatoNo1/archive/2012/10/07/192131.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sun, 07 Oct 2012 03:02:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/10/07/192131.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/192131.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/10/07/192131.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/192131.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/192131.html</trackback:ping><description><![CDATA[一开始想傻了囧&#8230;&#8230;不过很快就发现这其实是个超级大水题&#8230;&#8230;<br />考虑斜堆中<strong><span style="color: red">最后插入的</span></strong>那个结点，容易发现：<br />（1）它一定是一个极左结点（就是从根往它的路上一直都是沿着左链走），因为插入的时候每次都是插入到左子树中；<br />（2）它一定木有右子树，因为插入的时候每次都是把原来的某棵子树作为新结点的左子树；<br /><br />满足（1）（2）的结点可能有多个，但紧接着可以发现，这个<strong style="color: red">斜堆中的每个结点如果木有左子结点，那么也木有右子结点</strong>（或者说，每个非叶结点都有左子树），而在插入一个结点之前，其所有的祖先都被交换了左右子树，所以，若新结点的祖先中有满足（1）（2）的，且新结点不是叶结点，那么在新结点插入之前，这个满足（1）（2）的祖先必然是只有右子树而木有左子树的，这与上面的那个性质矛盾，所以，可以得出：<strong><span style="color: red">最后插入的那个结点一定是满足（1）（2）的结点中，深度最小的那个（设为X），除非X的左子结点是叶结点，此时为了满足字典序最小，应该取X的左子结点为最后插入的。</span></strong>找到这个最后插入的结点以后，只需要把它删掉，并把它的所有祖先交换左右子树，就是插入该结点以前的状态了。这样可以找到字典序最小的插入顺序。<br />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />但是，这个题的意义还不止于此，必须要搞清楚斜堆到底是什么，有什么应用囧&#8230;&#8230;<br /><br />斜堆是可合并堆的一种实现形式，其更稳定的实现是左偏树（斜堆只能做到均摊logN，而左偏树则可以严格做到每次操作O(logN)）。<br />斜堆最典型的特点，上面已经说过了，如果一个结点没有左子树，那么它也一定没有右子树。这样，大多数斜堆看上去是往左倾斜的（这也就是它的名字的由来&#8230;&#8230;）。如果给每个结点加上一个<span style="color: #339966"><strong>距离值dist[]，为该结点到它最近的没有右子树的子结点的距离，并且满足任意结点的左子结点的距离值都不小于右子结点的距离值</strong></span>的话，就成了左偏树囧&#8230;&#8230;<br /><br />可合并堆，顾名思义，它必须满足两个性质：（1）是堆，也就是每个结点的关键字都不大于（小顶堆）/不小于（大顶堆）其两个子结点的关键字；（2）它必须在O(logN)时间内完成合并操作，即将两个堆合并为一个，且合并成的堆仍满足原来的性质。<br />斜堆的合并操作有点像某些函数式数据结构，但它并不会动用额外的空间。该合并操作使用递归实现，设两个斜堆（小顶堆）的根结点为A、B，若A和B中的某一个为空，则返回另一个；若A和B均非空，则先将它们中关键字小的那个的右子树与关键字大的那个的整棵树合并，作为关键字小的那个的新的右子树，然后，如果是左偏树的话要更新dist，若dist不满足&#8220;左不小于右&#8221;，还要交换左右子树。<br /><br />斜堆可以支持的操作有（指能在O(logN)时间内完成的操作）：<br />（1）插入结点：（用合并实现）；<br />（2）删除任意结点：（将待删除结点的两棵子树合并，取代原来的位置，若是左偏树的话还要往上更新dist直到dist不变为止，某论文里有证明，每次删除更新dist次数不会超过2logN）；<br />（3）合并两个斜堆；<br />（4）找最小/大值；<br />（5）求以某个结点为根的子树大小（维护sz即可）；<br /><br />斜堆不能支持的操作有（指不能在O(logN)时间内完成的操作）：<br />（1）查找任意结点。因此，若要删除某个指定结点，则必须先用下标等索引到它；<br />（2）找第K小（如果这个都能实现的话，斜堆就可以替代平衡树了囧&#8230;&#8230;还是可合并平衡树&#8230;&#8230;）；<br />（3）找某个结点所在树的根结点（但是配合并查集+索引可以实现，详见HDU1512）；<br /><br />至于编程复杂度方面&#8230;&#8230;非常非常好写！基本上一个合并操作就够了，&lt;10行（斜堆的好写程度仅次于并查集和普通堆）；<br />写的之后有三个主要的易疵点：<br />（1）合并的时候别忘了更新一些东东，尤其别忘了返回根结点；<br />（2）（极易疵的！！）如果要删除某个结点，必须把它的所有信息恢复到孤立结点的状态，即断开与原树的一切联系（pr、L、R全部置0），dist（如果是左偏树）置0、sz置1；（3）下标从1开始，0号结点作特殊用途（dist值为-1，sz值为0），如果某个结点的pr、L、R不存在则为0；<br /><br />例题（由于想稳定，本沙茶全都是用左偏树写的囧）：<br />【1】<a title="HDU1512" href="http://acm.hdu.edu.cn/showproblem.php?pid=1512">HDU1512</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">#define</span><span style="color: #000000">&nbsp;ll&nbsp;long&nbsp;long</span><span style="color: #000000"><br /></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MAXN&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">100010</span><span style="color: #000000">,&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,&nbsp;u[MAXN],&nbsp;rt[MAXN],&nbsp;V[MAXN],&nbsp;dist[MAXN],&nbsp;pr[MAXN],&nbsp;L[MAXN],&nbsp;R[MAXN],&nbsp;res;<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;tmp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x,&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;&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;(x&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;r)&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;s1,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;s2,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;rt0)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(u[s1]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;u[s2])&nbsp;{u[s1]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s2;&nbsp;u[s2]</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;rt[s2]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rt0;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{u[s2]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s1;&nbsp;u[s1]</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;rt[s1]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rt0;}<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;heap_union(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;s1,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;s2)<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">s1)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;s2;&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;(</span><span style="color: #000000">!</span><span style="color: #000000">s2)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;s1;&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;(V[s1]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;V[s2])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap_union(R[s1],&nbsp;s2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R[s1]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;z;&nbsp;pr[z]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s1;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dist[L[s1]]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;dist[z])&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;L[s1];&nbsp;L[s1]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;R[s1];&nbsp;R[s1]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist[s1]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;dist[R[s1]]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;s1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap_union(s1,&nbsp;R[s2]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R[s2]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;z;&nbsp;pr[z]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s2;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dist[L[s2]]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;dist[z])&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;L[s2];&nbsp;L[s2]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;R[s2];&nbsp;R[s2]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist[s2]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;dist[R[s2]]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;s2;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;prepare()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;dist[</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">;&nbsp;re1(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">;&nbsp;rt[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;&nbsp;dist[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pr[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;L[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;R[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;solve(</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;y)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;s1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;UFS_find(x),&nbsp;s2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;UFS_find(y);&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(s1&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;s2)&nbsp;{res&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;rt1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rt[s1],&nbsp;rt2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rt[s2];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;z1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap_union(L[rt1],&nbsp;R[rt1]);&nbsp;L[rt1]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;R[rt1]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pr[z1]&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;V[rt1]&nbsp;</span><span style="color: #000000">/=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;&nbsp;z1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap_union(rt1,&nbsp;z1);&nbsp;pr[z1]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;z2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap_union(L[rt2],&nbsp;R[rt2]);&nbsp;L[rt2]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;R[rt2]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pr[z2]&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;V[rt2]&nbsp;</span><span style="color: #000000">/=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;&nbsp;z2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap_union(rt2,&nbsp;z2);&nbsp;pr[z2]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap_union(z1,&nbsp;z2);&nbsp;pr[z]&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;UFS_union(s1,&nbsp;s2,&nbsp;z);<br />&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;V[z];<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;x0,&nbsp;y0;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">n)&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;EOF)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re1(i,&nbsp;n)&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">V[i]);&nbsp;prepare();<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">m);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m)&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">x0,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">y0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve(x0,&nbsp;y0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;res);<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 /><br /></span></div><br />【2】<a title="HDU3031" href="http://acm.hdu.edu.cn/showproblem.php?pid=3031">HDU3031</a><br />综合操作题，需要sz，同时也可以考察数据结构的综合应用能力。
<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 />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">algorithm</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=1;&nbsp;i&lt;=n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re2(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re3(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;=r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n-1;&nbsp;i&gt;=0;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n;&nbsp;i&gt;0;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre2(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r-1;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre3(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;ll&nbsp;long&nbsp;long</span><span style="color: #000000"><br /></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MAXN&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1000010</span><span style="color: #000000">,&nbsp;MAXM&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">101</span><span style="color: #000000">,&nbsp;MAXLEN_M&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10010</span><span style="color: #000000">,&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,&nbsp;m,&nbsp;len[MAXM],&nbsp;V0[MAXM][MAXLEN_M],&nbsp;root[</span><span style="color: #000000">2</span><span style="color: #000000">];<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;V[MAXN],&nbsp;dist[MAXN],&nbsp;pr[MAXN],&nbsp;L[MAXN],&nbsp;R[MAXN],&nbsp;sz[MAXN];<br /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;FS;<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;sz[x]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sz[L[x]]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;sz[R[x]]&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">int</span><span style="color: #000000">&nbsp;heap_union(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;s1,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;s2)<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">s1)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;s2;&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;(</span><span style="color: #000000">!</span><span style="color: #000000">s2)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;s1;&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;(V[s1]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;V[s2])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;s0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap_union(R[s1],&nbsp;s2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pr[s0]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s1;&nbsp;R[s1]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s0;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dist[L[s1]]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;dist[s0])&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;L[s1];&nbsp;L[s1]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;R[s1];&nbsp;R[s1]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp;}&nbsp;dist[s1]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;dist[R[s1]]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;upd(s1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;s1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;s0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap_union(s1,&nbsp;R[s2]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pr[s0]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s2;&nbsp;R[s2]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s0;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dist[L[s2]]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;dist[s0])&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;L[s2];&nbsp;L[s2]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;R[s2];&nbsp;R[s2]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp;}&nbsp;dist[s2]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;dist[R[s2]]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;upd(s2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;s2;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;opr_T(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;sort(V0[x],&nbsp;V0[x]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;len[x]);&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;n&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;rre(i,&nbsp;len[x])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n</span><span style="color: #000000">++</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;len[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;pr[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;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;pr[n]&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">if</span><span style="color: #000000">&nbsp;(i)&nbsp;L[n]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;L[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;R[n]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;dist[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;V[n]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;V0[x][i];&nbsp;sz[n]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;root[FS]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap_union(root[FS],&nbsp;root0);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;opr_A(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;V[root[FS]]&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;x;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;opr_E(</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;root0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;root[FS],&nbsp;z0;&nbsp;pr[z0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap_union(L[root0],&nbsp;R[root0])]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;L[root0]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;R[root0]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;dist[root0]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;sz[root0]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;V[root0]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;root[FS]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap_union(z0,&nbsp;root0);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;opr_L()<br />{<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;root[FS],&nbsp;z0;&nbsp;pr[z0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap_union(L[root0],&nbsp;R[root0])]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;L[root0]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;R[root0]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;dist[root0]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;sz[root0]&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;opr_C()<br />{<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;root[</span><span style="color: #000000">0</span><span style="color: #000000">],&nbsp;root1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;root[</span><span style="color: #000000">1</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(V[root0]&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;V[root1])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap_union(root0,&nbsp;root1);&nbsp;root[</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&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;(V[root0]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;V[root1])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root[</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap_union(root0,&nbsp;root1);&nbsp;root[</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;}<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;tests,&nbsp;sc0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;sc1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;P,&nbsp;tmp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;ssss[</span><span style="color: #000000">10</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">tests);<br />&nbsp;&nbsp;&nbsp;&nbsp;re(testno,&nbsp;tests)&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">P,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">m);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m)&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">len[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m)&nbsp;re(j,&nbsp;len[i])&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">V0[i][j]);&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;root[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;root[</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;dist[</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">;&nbsp;sz[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;FS&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;re(i,&nbsp;P)&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">%s</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;ssss);<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;(ssss[</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">T</span><span style="color: #000000">'</span><span style="color: #000000">)&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">tmp);&nbsp;opr_T(</span><span style="color: #000000">--</span><span style="color: #000000">tmp);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ssss[</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">A</span><span style="color: #000000">'</span><span style="color: #000000">)&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">tmp);&nbsp;opr_A(tmp);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ssss[</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">E</span><span style="color: #000000">'</span><span style="color: #000000">)&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">tmp);&nbsp;opr_E(tmp);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ssss[</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">L</span><span style="color: #000000">'</span><span style="color: #000000">)&nbsp;opr_L();&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;opr_C();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FS&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">FS;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d:%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;sz[root[</span><span style="color: #000000">0</span><span style="color: #000000">]],&nbsp;sz[root[</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;(sz[root[</span><span style="color: #000000">0</span><span style="color: #000000">]]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;sz[root[</span><span style="color: #000000">1</span><span style="color: #000000">]])&nbsp;sc0</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;sc1</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">if</span><span style="color: #000000">&nbsp;(sc0&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;sc1)&nbsp;puts(</span><span style="color: #000000">"</span><span style="color: #000000">Hahaha<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />I&nbsp;win!!</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;puts(</span><span style="color: #000000">"</span><span style="color: #000000">I&nbsp;will&nbsp;be&nbsp;back!!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span></div><br /><img src ="http://www.cppblog.com/MatoNo1/aggbug/192131.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-10-07 11:02 <a href="http://www.cppblog.com/MatoNo1/archive/2012/10/07/192131.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>块状数组</title><link>http://www.cppblog.com/MatoNo1/archive/2012/01/17/164315.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Tue, 17 Jan 2012 12:31:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/01/17/164315.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/164315.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/01/17/164315.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/164315.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/164315.html</trackback:ping><description><![CDATA[<p><a title="例题" href="http://www.zybbs.org/JudgeOnline/problem.php?id=1901">例题</a><br />本沙茶觉得块状数组又好写又有用（其实就是另一种朴素）&#8230;&#8230;只是那个O(sqrt(n))的复杂度比较大而已（其实如果加上常数的话它并不比Segplaytree慢多少）<br />编程技巧：<br />（1）每块长度设为m=floor(sqrt(n))，最后不足长度的不补值，设n0为总块数（显然n0=(n-1)/m+1）；<br />（2）设立LEN[i]=第i块的实际长度（显然除了最后一块都是m），可以在建立块状数组（真正搞成块状，也就是二维）的时候得到；<br />（3）对于区间[l, r]，要注意：&lt;1&gt;l、r位于同一块（l/m==r/m）的情况；&lt;2&gt;r位于最后一块的情况；<br />（4）别忘了同时更新原数组与块状数组；<br /><br />另外，本例题需要二分+找多少个比它小的这样的操作，总时间复杂度是O(N*sqrt(N)*log<sub>2</sub>N*log<sub>2</sub>N)（幸亏N只有10000&#8230;&#8230;）。<br /><br />如果有插入删除元素，就需要用动态的块状链表了&#8230;&#8230;极其难搞，本沙茶不敢试了&#8230;&#8230;遇到这种题还是写Segplaytree吧囧&#8230;&#8230;</p>
<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 />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">math.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">100002</span><span style="color: #000000">,&nbsp;MAXM&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">320</span><span style="color: #000000">,&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,&nbsp;m,&nbsp;n0,&nbsp;A[MAXN],&nbsp;T[MAXM][MAXM],&nbsp;LEN[MAXM],&nbsp;res;<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;</span><span style="color: #000000">*</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)s1&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)s2;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;prepare()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">)&nbsp;floor(sqrt(n)&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;1e</span><span style="color: #000000">-</span><span style="color: #000000">7</span><span style="color: #000000">);&nbsp;n0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(n&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;m&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;re(i,&nbsp;n0)&nbsp;LEN[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;T[i&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;m][LEN[i&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;m]</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;A[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n0)&nbsp;qsort(T[i],&nbsp;LEN[i],&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">),&nbsp;cmp);<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;No,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;A[No]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;S&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;No&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;m;&nbsp;re(i,&nbsp;LEN[S])&nbsp;T[S][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;A[S&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;i];&nbsp;qsort(T[S],&nbsp;LEN[S],&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">),&nbsp;cmp);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;opr1(</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;S0&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;m,&nbsp;l0&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;m,&nbsp;S1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;m,&nbsp;r0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">&nbsp;m,&nbsp;l1,&nbsp;r1,&nbsp;mid,&nbsp;res0&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">if</span><span style="color: #000000">&nbsp;(S0&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;S1)&nbsp;re3(i,&nbsp;l0,&nbsp;r0)&nbsp;{</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(A[S0&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;i]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;x)&nbsp;res0</span><span style="color: #000000">++</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;re2(i,&nbsp;l0,&nbsp;LEN[S0])&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(A[S0&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;i]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;x)&nbsp;res0</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re3(i,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;r0)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(A[S1&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;i]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;x)&nbsp;res0</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re2(i,&nbsp;S0</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;S1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;r1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;LEN[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(l1&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;r1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l1&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;r1&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[i][mid]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;x)&nbsp;r1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;l1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res0&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;l1;<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;res0;<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;a0,&nbsp;b0,&nbsp;x0,&nbsp;l,&nbsp;r,&nbsp;mid;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;ss[</span><span style="color: #000000">20</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">n,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">M);<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;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;prepare();<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;ss);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ss[</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">C</span><span style="color: #000000">'</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">a0,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">x0);&nbsp;opr0(</span><span style="color: #000000">--</span><span style="color: #000000">a0,&nbsp;x0);<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%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">x0);&nbsp;a0</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;b0</span><span style="color: #000000">--</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1000000000</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(l&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;r)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(opr1(a0,&nbsp;b0,&nbsp;mid)&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;x0)&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;l);<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>
<p><br /><br />&nbsp;</p><img src ="http://www.cppblog.com/MatoNo1/aggbug/164315.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-17 20:31 <a href="http://www.cppblog.com/MatoNo1/archive/2012/01/17/164315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>划分树</title><link>http://www.cppblog.com/MatoNo1/archive/2011/06/27/149604.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Mon, 27 Jun 2011 12:54:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/06/27/149604.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/149604.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/06/27/149604.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/149604.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/149604.html</trackback:ping><description><![CDATA[首先，Orz一下AHdoc神犇，本沙茶是看他的总结才搞懂划分树的。<br /><a title="原文地址" href="http://blog.renren.com/blog/367737224/728617495">原文地址</a><br /><br />划分树，就是每个结点代表一个序列，设这个序列的长度为len，若len&gt;1，则序列中前len/2（上取整，这里数学公式不好打，真囧）个元素被分到左子结点，左子结点代表的序列就是这些元素<span style="color: red"><strong>按照根结点中的顺序</strong></span>组成的序列，而剩下的元素被分到右子结点，右子结点代表的序列也就是剩下的元素按照根结点中的顺序组成的序列；若len=1，则该结点为叶结点。划分树最重要的应用就是找区间第K小（只是查找，不包括修改）。<br /><br />写划分树时主要有两个函数：建树和找区间第K小。由于后者AHdoc神犇已经总结了，所以这里只总结建树的函数。<br /><br />设目前结点为[l..r]（l&lt;r，就是目前的结点是原序列不断划分后得到[l..r]这一段，其实也就是a0[l..r]打乱顺序后得到的，a0为原序列递增排序后的序列）首先找到中值，就是a0[mid]，mid=l+r&gt;&gt;1。然后可以得到，[l..r]中小于中值的的元素一定被划分到左子结点，[l..r]中大于中值的元素一定被划分到右子结点，而[l..r]中等于中值的元素则不确定，有的被划分到左子结点，有的被划分到右子结点，这就需要先找到应被划分到左子结点的等于中值的元素个数sm（从mid开始不断往左，直到找到边界处或者找到一个小于中值的元素为止，或者说，sm就是a0[l..mid]中等于中值的元素个数），然后开始划分，小于中值分到左子结点，大于中值分到右子结点，等于中值的，若目前还没满sm则分到左子结点否则分到右子结点。另外中间有两个值需要记录（找区间第K小时必须要用到）：sl和sr。sl[i]表示[l..i]中被分到左子结点的元素个数，sr[i]表示[l..i]中被分到右子结点的元素个数（这里l&lt;=i&lt;=r。显然sl[i]+sr[i]=i-l+1，其实sr[i]可以不用记录的，这里只是为了在找第K小操作中减少计算次数，起到空间换时间的作用）。<br />建树代码：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mkt(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;d)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[</span><span style="color: #000000">++</span><span style="color: #000000">No].l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l;&nbsp;T[No].r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;r;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;T[No].mid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;r)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;No;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;midv&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a0[mid],&nbsp;sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;rre2(i,&nbsp;mid,&nbsp;l)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(a0[i]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;midv)&nbsp;{sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;i;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l,&nbsp;y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(a[d][l]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;midv)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[d&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][x</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[d][l];&nbsp;sl[d][l]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;sr[d][l]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(a[d][l]&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;midv&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;sm)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[d&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][x</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[d][l];&nbsp;sl[d][l]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;sr[d][l]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;sm</span><span style="color: #000000">--</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[d&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][y</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[d][l];&nbsp;sl[d][l]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;sr[d][l]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;re3(i,&nbsp;l</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;r)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(a[d][i]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;midv)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[d&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][x</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[d][i];&nbsp;sl[d][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sl[d][i&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;sr[d][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sr[d][i&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(a[d][i]&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;midv&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;sm)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[d&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][x</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[d][i];&nbsp;sl[d][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sl[d][i&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;sr[d][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sr[d][i&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];&nbsp;sm</span><span style="color: #000000">--</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[d&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][y</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a[d][i];&nbsp;sl[d][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sl[d][i&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];&nbsp;sr[d][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sr[d][i&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;No0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;No;&nbsp;T[No0].lch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mkt(l,&nbsp;mid,&nbsp;d&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;T[No0].rch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mkt(mid&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;r,&nbsp;d&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;No0;<br />}<br /></span></div>这里a是每层划分后的序列。<br />查找区间第K小的代码：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Find_Kth(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;K)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;root,&nbsp;d&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;l0,&nbsp;r0,&nbsp;mid0,&nbsp;s0,&nbsp;s1;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].l,&nbsp;r0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].r;&nbsp;mid0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].mid;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l0&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;r0)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;a[d][l];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;l0)&nbsp;s0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;s0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;sl[d][l&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];&nbsp;s1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;sl[d][r]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(K&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;s1&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;s0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].lch;&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s0;&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s1;&nbsp;d</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;K&nbsp;</span><span style="color: #000000">-=</span><span style="color: #000000">&nbsp;(s1&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;s0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;l0)&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;sr[d][l&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mid0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;sr[d][r];&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].rch;&nbsp;d</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span></div><br />【具体题目】<a title="PKU2104" href="http://poj.org/problem?id=2104">PKU2104</a>、<a title="PKU2761" href="http://poj.org/problem?id=2761">PKU2761</a>（两道任选一道）<br /><br /> <img src ="http://www.cppblog.com/MatoNo1/aggbug/149604.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-06-27 20:54 <a href="http://www.cppblog.com/MatoNo1/archive/2011/06/27/149604.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>