﻿<?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++博客-夜幻梦回-文章分类-最近公共祖先||rmq问题</title><link>http://www.cppblog.com/Ylemzy/category/16412.html</link><description>足迹的足迹</description><language>zh-cn</language><lastBuildDate>Wed, 20 Apr 2011 09:47:52 GMT</lastBuildDate><pubDate>Wed, 20 Apr 2011 09:47:52 GMT</pubDate><ttl>60</ttl><item><title>1470  Closest Common Ancestors ——Lca</title><link>http://www.cppblog.com/Ylemzy/articles/125864.html</link><dc:creator>火碳黑</dc:creator><author>火碳黑</author><pubDate>Sat, 04 Sep 2010 03:52:00 GMT</pubDate><guid>http://www.cppblog.com/Ylemzy/articles/125864.html</guid><wfw:comment>http://www.cppblog.com/Ylemzy/comments/125864.html</wfw:comment><comments>http://www.cppblog.com/Ylemzy/articles/125864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Ylemzy/comments/commentRss/125864.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Ylemzy/services/trackbacks/125864.html</trackback:ping><description><![CDATA[<div style="color: #0070ff;" class="ptt" lang="en-US">Closest Common Ancestors</div>
<p style="color: #0070ff;" class="pst">Description</p>
<div style="color: #0070ff;" class="ptx" lang="en-US">Write
a program that takes as input a rooted tree and a list of pairs of
vertices. For each pair (u,v) the program determines the closest common
ancestor of u and v in the tree. The closest common ancestor of two
nodes u and v is the node w that is an ancestor of both u and v and has
the greatest depth in the tree. A node can be its own ancestor (for
example in Figure 1 the ancestors of node 2 are 2 and 5)</div>
<p style="color: #0070ff;" class="pst">Input</p>
<div style="color: #0070ff;" class="ptx" lang="en-US">The data set, which is read from a the std input, starts with the tree description, in the form:
<br><br>nr_of_vertices
<br>	vertex:(nr_of_successors) successor1 successor2 ... successorn
<br>	...
<br>where vertices are represented as integers from 1 to n ( n &lt;= 900
). The tree description is followed by a list of pairs of vertices, in
the form:
<br>	nr_of_pairs
<br>(u v)	(x y)	...
<br><br>The input file contents several data sets (at least one).
<br>Note that white-spaces (tabs, spaces and line breaks) can be used freely in the input.</div>
<p style="color: #0070ff;" class="pst">Output</p>
<div style="color: #0070ff;" class="ptx" lang="en-US">For
each common ancestor the program prints the ancestor and the number of
pair for which it is an ancestor. The results are printed on the
standard output on separate lines, in to the ascending order of the
vertices, in the format: ancestor:times
<br>For example, for the following tree:
<br><center><img src="http://acm.pku.edu.cn/JudgeOnline/images/1470_1.jpg"></center></div>
<p style="color: #0070ff;" class="pst">Sample Input</p>
<pre style="color: #0070ff;" class="sio">5<br>5:(3) 1 4 2<br>1:(0)<br>4:(0)<br>2:(1) 3<br>3:(0)<br>6<br>(1 5) (1 4) (4 2)<br>      (2 3)<br>(1 3) (4 3)</pre>
<p style="color: #0070ff;" class="pst">Sample Output</p>
<pre style="color: #0070ff;" class="sio">2:1<br>5:5<br>题意：给出树的结构，再给出要询问的（u， v),求出询问后公共节点出现的个数。<br>代码：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">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: #000000;">vector</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;maxn&nbsp;1000</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;">int</span><span style="color: #000000;">&nbsp;visit[maxn],&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">[maxn],&nbsp;f[maxn],&nbsp;anc[maxn],&nbsp;num[maxn];<br>vector</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;tree[maxn],&nbsp;que[maxn];<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;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;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;n;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;anc[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree[i].clear();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que[i].clear();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;find(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(f[a]&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;a;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;f[a]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;find(f[a]);<br>}<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;unions(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;b)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;find(a);<br>&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;find(b);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(a&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;b)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(f[a]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;f[b])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[b]&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;f[a];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[a]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;b;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[a]&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;f[b];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[b]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;a;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;lca(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;u)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,&nbsp;size;<br>&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;tree[u].size();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;size;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lca(tree[u][i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unions(u,&nbsp;tree[u][i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;anc[find(u)]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;u;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;visit[u]&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;size&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;que[u].size();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;size;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(visit[que[u][i]]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num[anc[find(que[u][i])]]</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><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;">char</span><span style="color: #000000;">&nbsp;a[</span><span style="color: #000000;">100</span><span style="color: #000000;">],&nbsp;b[</span><span style="color: #000000;">100</span><span style="color: #000000;">];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n,&nbsp;i,&nbsp;j,&nbsp;u,&nbsp;v,&nbsp;m;<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)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">(n);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;n;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;">u,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">m);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;m;&nbsp;j</span><span style="color: #000000;">++</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;&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;">v);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree[u].push_back(v);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">[v]</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(m</span><span style="color: #000000;">--</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;(%d&nbsp;%d)</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">u,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">v);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que[u].push_back(v);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que[v].push_back(u);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(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;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;n;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">in</span><span style="color: #000000;">[i]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lca(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;n;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(num[i])<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;&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;i,&nbsp;num[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000;">"</span><span style="color: #000000;">pause</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></pre><img src ="http://www.cppblog.com/Ylemzy/aggbug/125864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Ylemzy/" target="_blank">火碳黑</a> 2010-09-04 11:52 <a href="http://www.cppblog.com/Ylemzy/articles/125864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pku 1986——LCA转rmq</title><link>http://www.cppblog.com/Ylemzy/articles/123325.html</link><dc:creator>火碳黑</dc:creator><author>火碳黑</author><pubDate>Fri, 13 Aug 2010 07:08:00 GMT</pubDate><guid>http://www.cppblog.com/Ylemzy/articles/123325.html</guid><wfw:comment>http://www.cppblog.com/Ylemzy/comments/123325.html</wfw:comment><comments>http://www.cppblog.com/Ylemzy/articles/123325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Ylemzy/comments/commentRss/123325.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Ylemzy/services/trackbacks/123325.html</trackback:ping><description><![CDATA[<div style="color: #0010ff; text-align: center;" class="ptt" lang="en-US">Distance Queries</div>
<p style="color: #0010ff;" class="pst">Description</p>
<div style="color: #0010ff;" class="ptx" lang="en-US">Farmer
John's cows refused to run in his marathon since he chose a path much
too long for their leisurely lifestyle. He therefore wants to find a
path of a more reasonable length. The input to this problem consists of
the same input as in "Navigation Nightmare",followed by a line
containing a single integer K, followed by K "distance queries". Each
distance query is a line of input containing two integers, giving the
numbers of two farms between which FJ is interested in computing
distance (measured in the length of the roads along the path between
the two farms). Please answer FJ's distance queries as quickly as
possible!
<br></div>
<p style="color: #0010ff;" class="pst">Input</p>
<div style="color: #0010ff;" class="ptx" lang="en-US">* Lines 1..1+M: Same format as "Navigation Nightmare"
<br><br>* Line 2+M: A single integer, K.  1 &lt;= K &lt;= 10,000
<br><br>* Lines 3+M..2+M+K: Each line corresponds to a distance query and  contains the indices of two farms.
<br></div>
<p style="color: #0010ff;" class="pst">Output</p>
<div style="color: #0010ff;" class="ptx" lang="en-US">* Lines 1..K: For each distance query, output on a single line an integer giving  the appropriate distance.
<br></div>
<p style="color: #0010ff;" class="pst">Sample Input</p>
<pre style="color: #0010ff;" class="sio">7 6<br>1 6 13 E<br>6 3 9 E<br>3 5 7 S<br>4 1 3 N<br>2 4 20 W<br>4 7 2 S<br>3<br>1 6<br>1 4<br>2 6<br></pre>
<p style="color: #0010ff;" class="pst">Sample Output</p>
<pre style="color: #0010ff;" class="sio">13<br>3<br>36<br>题意：给出一棵树，其实是个图。求出两点之间的最短距离。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">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: #000000;">math.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;maxn&nbsp;600010</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;son[maxn],&nbsp;loc[maxn],&nbsp;dis[maxn],&nbsp;sw[maxn],&nbsp;indegree[maxn],&nbsp;th;<br></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;T<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;e,&nbsp;d;<br>}rmq[maxn</span><span style="color: #000000;">*</span><span style="color: #000000;">2</span><span style="color: #000000;">][</span><span style="color: #000000;">30</span><span style="color: #000000;">];<br></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;F<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;u,&nbsp;v,&nbsp;w,&nbsp;next;&nbsp;<br>}fn[maxn&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">];<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;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;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;n;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;son[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indegree[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dis[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loc[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;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;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;n;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fn[i].next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;link(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;u,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;v,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;w)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;树的遍历，这个得记住。节省空间。<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;th</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;fn[th].u&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;u,&nbsp;fn[th].v&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;v,&nbsp;fn[th].w&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;w,&nbsp;fn[th].next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;son[u],&nbsp;son[u]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;th;<br>&nbsp;&nbsp;&nbsp;&nbsp;th</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;fn[th].u&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;v,&nbsp;fn[th].v&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;u,&nbsp;fn[th].w&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;w,&nbsp;fn[th].next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;son[v],&nbsp;son[v]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;th;<br>}<br></span><span style="color: #008000;">/*</span><span style="color: #008000;"><br>通过搜索来生成树的遍历节点<br></span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;dfs(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;d,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;u,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;f,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;sd)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;v,&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;th</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(loc[u]&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;">)</span><span style="color: #008000;">//</span><span style="color: #008000;">只还没出现过的节点在遍历中的时间戳（位置）</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loc[u]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;th;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dis[u]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sd;</span><span style="color: #008000;">//</span><span style="color: #008000;">距离是叠加的。</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;rmq[th][</span><span style="color: #000000;">0</span><span style="color: #000000;">].e&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;u;<br>&nbsp;&nbsp;&nbsp;&nbsp;rmq[th][</span><span style="color: #000000;">0</span><span style="color: #000000;">].d&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;d;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;son[u];&nbsp;i;&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;fn[i].next)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(fn[i].v&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;f)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(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;fn[i].v,&nbsp;u,&nbsp;sd&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;fn[i].w);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;th</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rmq[th][</span><span style="color: #000000;">0</span><span style="color: #000000;">].e&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;u;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rmq[th][</span><span style="color: #000000;">0</span><span style="color: #000000;">].d&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;d;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;build&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;c&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;log((</span><span style="color: #0000ff;">double</span><span style="color: #000000;">)n)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;log(</span><span style="color: #000000;">2.0</span><span style="color: #000000;">),&nbsp;i,&nbsp;j,&nbsp;m;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;c;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;n;&nbsp;j</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(m&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;n)<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;&nbsp;&nbsp;&nbsp;&nbsp;rmq[j][i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;rmq[j][i</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(rmq[j][i</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">].d&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;rmq[m][i</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">].d)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rmq[j][i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;rmq[j][i</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rmq[j][i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;rmq[m][i</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;query(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;u,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;v)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(loc[u]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;loc[v])<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u&nbsp;</span><span style="color: #000000;">^=</span><span style="color: #000000;">&nbsp;v;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;</span><span style="color: #000000;">^=</span><span style="color: #000000;">&nbsp;u;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u&nbsp;</span><span style="color: #000000;">^=</span><span style="color: #000000;">&nbsp;v;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<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;loc[u],&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;loc[v];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;len&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;j&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;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;c&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;log((</span><span style="color: #0000ff;">double</span><span style="color: #000000;">)len)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;log(</span><span style="color: #000000;">2.0</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;m&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;c)&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;">int</span><span style="color: #000000;">&nbsp;ancestor;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(rmq[i][c].d&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;rmq[m][c].d)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ancestor&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;rmq[i][c].e;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ancestor&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;rmq[m][c].e;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;dis[u]&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;dis[v]&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;dis[ancestor];<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;">char</span><span style="color: #000000;">&nbsp;c[</span><span style="color: #000000;">2</span><span style="color: #000000;">];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n,&nbsp;m,&nbsp;u,&nbsp;v,&nbsp;w,&nbsp;k,&nbsp;t,&nbsp;i;<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;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">(n);<br>&nbsp;&nbsp;&nbsp;&nbsp;th&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(m</span><span style="color: #000000;">--</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d%d%d%s</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">u,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">v,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">w,&nbsp;c);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link(u,&nbsp;v,&nbsp;w);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;th&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;dfs(</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;build&nbsp;(</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</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;">k);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(k</span><span style="color: #000000;">--</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&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;">u,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">v);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;query(u,&nbsp;v));<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>}</span></div>
<br></pre><img src ="http://www.cppblog.com/Ylemzy/aggbug/123325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Ylemzy/" target="_blank">火碳黑</a> 2010-08-13 15:08 <a href="http://www.cppblog.com/Ylemzy/articles/123325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pku 3368——RMQ</title><link>http://www.cppblog.com/Ylemzy/articles/123100.html</link><dc:creator>火碳黑</dc:creator><author>火碳黑</author><pubDate>Wed, 11 Aug 2010 12:25:00 GMT</pubDate><guid>http://www.cppblog.com/Ylemzy/articles/123100.html</guid><wfw:comment>http://www.cppblog.com/Ylemzy/comments/123100.html</wfw:comment><comments>http://www.cppblog.com/Ylemzy/articles/123100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Ylemzy/comments/commentRss/123100.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Ylemzy/services/trackbacks/123100.html</trackback:ping><description><![CDATA[<div style="text-align: center; color: #0040ff;" class="ptt" lang="en-US">Frequent values</div>
<p style="color: #0040ff;" class="pst">Description</p>
<div style="color: #0040ff;" class="ptx" lang="en-US">
<p>You are given a sequence of <strong>n</strong> integers <strong>a<sub>1</sub> , a<sub>2</sub> , ... , a<sub>n</sub></strong> in non-decreasing order. In addition to that, you are given several queries consisting of indices <strong>i</strong> and <strong>j</strong> (<em>1 &#8804; i &#8804; j &#8804; n</em>). For each query, determine the most frequent value among the integers <strong>a<sub>i</sub> , ... , a<sub>j</sub></strong>.</p>
</div>
<p style="color: #0040ff;" class="pst">Input</p>
<div style="color: #0040ff;" class="ptx" lang="en-US">
<p>The input consists of several test cases. Each test case starts with a line containing two integers <strong>n</strong> and <strong>q</strong> (<em>1 &#8804; n, q &#8804; 100000</em>). The next line contains <strong>n</strong> integers <strong>a<sub>1</sub> , ... , a<sub>n</sub></strong> (<em>-100000 &#8804; a<sub>i</sub> &#8804; 100000</em>, for each <em>i &#8712; {1, ..., n}</em>) separated by spaces. You can assume that for each <em>i &#8712; {1, ..., n-1}: a<sub>i</sub> &#8804; a<sub>i+1</sub></em>. The following <strong>q</strong> lines contain one query each, consisting of two integers <strong>i</strong> and <strong>j</strong> (<em>1 &#8804; i &#8804; j &#8804; n</em>), which indicate the boundary indices for the
<br>query.</p>
<p>The last test case is followed by a line containing a single <em>0</em>.</p>
</div>
<p style="color: #0040ff;" class="pst">Output</p>
<div style="color: #0040ff;" class="ptx" lang="en-US">
<p>For each query, print one line with one integer: The number of occurrences of the most frequent value within the given range.</p>
</div>
<p style="color: #0040ff;" class="pst">Sample Input</p>
<pre style="color: #0040ff;" class="sio">10 3<br>-1 -1 1 1 1 1 3 10 10 10<br>2 3<br>1 10<br>5 10<br>0</pre>
<p style="color: #0040ff;" class="pst">Sample Output</p>
<pre style="color: #0040ff;" class="sio">1<br>4<br>3<br>题意：查找区间内数出现最多的次数<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">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: #000000;">math.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;maxn&nbsp;100010</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;Max(a,&nbsp;b)&nbsp;a&nbsp;&gt;&nbsp;b&nbsp;?&nbsp;a&nbsp;:&nbsp;b</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;num[maxn],&nbsp;v[maxn],&nbsp;rq[maxn][</span><span style="color: #000000;">20</span><span style="color: #000000;">];<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;build(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,&nbsp;j,&nbsp;m,&nbsp;r&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;n,&nbsp;c&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;log((</span><span style="color: #0000ff;">double</span><span style="color: #000000;">)n)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;log(</span><span style="color: #000000;">2.0</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;n;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rq[i][</span><span style="color: #000000;">0</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;v[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;c;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;r;&nbsp;j</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</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;">));a<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;(m&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;r)<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;&nbsp;&nbsp;&nbsp;&nbsp;rq[j][i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Max(rq[j][i</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">],&nbsp;rq[m][i</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</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;&nbsp;&nbsp;&nbsp;&nbsp;rq[j][i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;rq[j][i</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;rmq(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;l,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;r)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;len&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;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;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;k&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;log(</span><span style="color: #0000ff;">double</span><span style="color: #000000;">(len))&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;log(</span><span style="color: #000000;">2.0</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;m&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;">&lt;&lt;</span><span style="color: #000000;">&nbsp;k)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;Max(rq[l][k],&nbsp;rq[m][k]);<br>}<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;query(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;l,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;r)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;left,&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(num[l]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;num[r])<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;r&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;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;l;&nbsp;;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(v[i]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left&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;l;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;Max(left,&nbsp;rmq(i,&nbsp;r));<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;n,&nbsp;m,&nbsp;i,&nbsp;l,&nbsp;r;<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%d</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">n,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">m)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">num[</span><span style="color: #000000;">1</span><span style="color: #000000;">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v[</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;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;n;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">num[i]);<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;(num[i]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;num[i</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;v[i</span><span style="color: #000000;">-</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;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</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;&nbsp;&nbsp;&nbsp;&nbsp;v[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;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;build(n);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(m</span><span style="color: #000000;">--</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;">l,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">r);<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;query(l,&nbsp;r));<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>}</span></div>
<br></pre><img src ="http://www.cppblog.com/Ylemzy/aggbug/123100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Ylemzy/" target="_blank">火碳黑</a> 2010-08-11 20:25 <a href="http://www.cppblog.com/Ylemzy/articles/123100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pku 1330——LCA的离线算法tarjan</title><link>http://www.cppblog.com/Ylemzy/articles/122088.html</link><dc:creator>火碳黑</dc:creator><author>火碳黑</author><pubDate>Tue, 03 Aug 2010 09:41:00 GMT</pubDate><guid>http://www.cppblog.com/Ylemzy/articles/122088.html</guid><wfw:comment>http://www.cppblog.com/Ylemzy/comments/122088.html</wfw:comment><comments>http://www.cppblog.com/Ylemzy/articles/122088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Ylemzy/comments/commentRss/122088.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Ylemzy/services/trackbacks/122088.html</trackback:ping><description><![CDATA[<div style="color: #0040ff; text-align: center;" class="ptt" lang="en-US">Nearest Common Ancestors</div>
<p style="color: #0040ff;" class="pst">Description</p>
<div style="color: #0040ff;" class="ptx" lang="en-US">A rooted tree is a well-known data structure in computer science and engineering. An example is shown below:
<br><br><img src="http://124.205.79.250/JudgeOnline/images/1330_1.jpg"><br>In the figure, each node is labeled with an integer from {1,
2,...,16}. Node 8 is the root of the tree. Node x is an ancestor of
node y if node x is in the path between the root and node y. For
example, node 4 is an ancestor of node 16. Node 10 is also an ancestor
of node 16. As a matter of fact, nodes 8, 4, 10, and 16 are the
ancestors of node 16. Remember that a node is an ancestor of itself.
Nodes 8, 4, 6, and 7 are the ancestors of node 7. A node x is called a
common ancestor of two different nodes y and z if node x is an ancestor
of node y and an ancestor of node z. Thus, nodes 8 and 4 are the common
ancestors of nodes 16 and 7. A node x is called the nearest common
ancestor of nodes y and z if x is a common ancestor of y and z and
nearest to y and z among their common ancestors. Hence, the nearest
common ancestor of nodes 16 and 7 is node 4. Node 4 is nearer to nodes
16 and 7 than node 8 is. <br><br>For other examples, the nearest common ancestor of nodes 2 and 3 is
node 10, the nearest common ancestor of nodes 6 and 13 is node 8, and
the nearest common ancestor of nodes 4 and 12 is node 4. In the last
example, if y is an ancestor of z, then the nearest common ancestor of
y and z is y. <br><br>Write a program that finds the nearest common ancestor of two distinct nodes in a tree.
<br><br></div>
<p style="color: #0040ff;" class="pst">Input</p>
<div style="color: #0040ff;" class="ptx" lang="en-US">The
input consists of T test cases. The number of test cases (T) is given
in the first line of the input file. Each test case starts with a line
containing an integer N , the number of nodes in a tree,
2&lt;=N&lt;=10,000. The nodes are labeled with integers 1, 2,..., N.
Each of the next N -1 lines contains a pair of integers that represent
an edge --the first integer is the parent node of the second integer.
Note that a tree with N nodes has exactly N - 1 edges. The last line of
each test case contains two distinct integers whose nearest common
ancestor is to be computed. </div>
<p style="color: #0040ff;" class="pst">Output</p>
<div style="color: #0040ff;" class="ptx" lang="en-US">Print exactly one line for each test case. The line should contain the integer that is the nearest common ancestor. </div>
<p style="color: #0040ff;" class="pst">Sample Input</p>
<pre style="color: #0040ff;" class="sio">2<br>16<br>1 14<br>8 5<br>10 16<br>5 9<br>4 6<br>8 4<br>4 10<br>1 13<br>6 15<br>10 11<br>6 7<br>10 2<br>16 3<br>8 1<br>16 12<br>16 7<br>5<br>2 3<br>3 4<br>3 1<br>1 5<br>3 5<br></pre>
<p style="color: #0040ff;" class="pst">Sample Output</p>
<pre style="color: #0040ff;" class="sio">4<br>3<br>题意：给出树的结构，问两节点的最近公共父节点。<br>代码：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">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;">vector</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;maxn&nbsp;10001</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;">int</span><span style="color: #000000;">&nbsp;visit[maxn],&nbsp;indegree[maxn],&nbsp;f[maxn],&nbsp;ancestor[maxn];<br>vector</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;tree[maxn],&nbsp;que[maxn];<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;init(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;n;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree[i].clear();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que[i].clear();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indegree[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ancestor[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;find(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(f[a]&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;a;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;f[a]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;find(f[a]);<br>}<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;unions(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;b)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;find(a),&nbsp;b&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;find(b);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(a&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;b)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(f[a]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;f[b])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[b]&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;f[a];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[a]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;b;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[a]&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;f[b];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[b]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;a;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;lca(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;u)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,&nbsp;size;<br>&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;tree[u].size();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;size;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lca(tree[u][i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unions(u,&nbsp;tree[u][i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ancestor[find(u)]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;u;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">对于处理过的孩子，其祖先要改为当前节点，保证这棵数的遍历逻辑，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因为并查集的合并是按权值而非遍历顺序合并的,通过并查集高效获得子树集合的端口，在通过这端口获得<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该子树在这个时间段的真正最近父节点，如图中的4在并查树中会被归并为6的孩子，因为权值的问题</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;visit[u]&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;size&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;que[u].size();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;size;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(visit[que[u][i]]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&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;ancestor[find(que[u][i])]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<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;n,&nbsp;t,&nbsp;i,&nbsp;u,&nbsp;v;<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;">t);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(t</span><span style="color: #000000;">--</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">n);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init(n);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;n;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;">u,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">v);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree[u].push_back(v);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indegree[v]</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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;">u,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">v);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que[u].push_back(v);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que[v].push_back(u);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;n;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(indegree[i]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lca(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<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>}</span></div>
<br></pre><img src ="http://www.cppblog.com/Ylemzy/aggbug/122088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Ylemzy/" target="_blank">火碳黑</a> 2010-08-03 17:41 <a href="http://www.cppblog.com/Ylemzy/articles/122088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pku 3264 ——rmq问题的st算法</title><link>http://www.cppblog.com/Ylemzy/articles/121703.html</link><dc:creator>火碳黑</dc:creator><author>火碳黑</author><pubDate>Fri, 30 Jul 2010 07:35:00 GMT</pubDate><guid>http://www.cppblog.com/Ylemzy/articles/121703.html</guid><wfw:comment>http://www.cppblog.com/Ylemzy/comments/121703.html</wfw:comment><comments>http://www.cppblog.com/Ylemzy/articles/121703.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Ylemzy/comments/commentRss/121703.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Ylemzy/services/trackbacks/121703.html</trackback:ping><description><![CDATA[		<span style="color: #0070ff;">rmq范围最小（大）指问题——处理对于n个数，要求快速求出某区间内的最值。</span>
<br style="color: #0070ff;">
<span style="color: #0070ff;">f[i][j]表示以i为起点长度为2^j的最值。</span>
<br style="color: #0070ff;">
<span style="color: #0070ff;">f[i][j] = rmq(f[i][j-1], f[i + 2 ^ (j-1)][j-1];相当于把线段分成相等的左右两段合并求rmq。但这得让线段长度是2的幂次。</span>
<br style="color: #0070ff;">
<span style="color: #0070ff;">查询时，例如f[1，7] = f[1][2] + f[5][1] + f[7][0];为O(logn),f[1, 7]对应于数组中的区间</span>
<br style="color: #0070ff;">
<span style="color: #0070ff;">为了加快查询，可使f[1，7] = f[1][2] + f[4][2];为O(1)，这里用2=（2^k &lt;= 7）k的最大值7 - 2^2 + 1 为4，即让7向左移动2^2 - 1个位，2^k = 1 &lt;&lt; k;注意：例如给出n=7，则f[4][2]是求对应于[4, 8]的rmq，而f[4, 8] = f[4, 7],所以要对此进行预处理,让右区间的值超过n的为右区间为n时的值，这样才能加快查询，即多增加了一些方便查询的数据。最大左移是k = log2(n),可表示的最大起始点是1 &lt;&lt; k,则f[i][j]表示的右区间的最大值为</span>
<br style="color: #0070ff;">
<span style="color: #0070ff;">(1 &lt;&lt; k) + (1 &lt;&lt; k) = 1 &lt;&lt; (k + 1) = 2 ^ (log2(n) + 1),提供这个数据时能给出何时得空间[n + 1][log2(n) + 1 + 1]。</span>
<br style="color: #0070ff;">
<span style="color: #0070ff;">代码：</span>
<br style="color: #0070ff;">
<br style="color: #0070ff;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;">
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
<span style="color: #000000;">#include&nbsp;</span>
<span style="color: #000000;">&lt;</span>
<span style="color: #000000;">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: #000000;">math.h</span>
<span style="color: #000000;">&gt;</span>
<span style="color: #000000;">
<br>
</span>
<span style="color: #0000ff;">#define</span>
<span style="color: #000000;">&nbsp;maxn&nbsp;50010</span>
<span style="color: #000000;">
<br>
</span>
<span style="color: #0000ff;">#define</span>
<span style="color: #000000;">&nbsp;Min(a,&nbsp;b)&nbsp;a&nbsp;&lt;&nbsp;b&nbsp;?&nbsp;a&nbsp;:&nbsp;b</span>
<span style="color: #000000;">
<br>
</span>
<span style="color: #0000ff;">#define</span>
<span style="color: #000000;">&nbsp;Max(a,&nbsp;b)&nbsp;a&nbsp;&gt;&nbsp;b&nbsp;?&nbsp;a&nbsp;:&nbsp;b</span>
<span style="color: #000000;">
<br>
</span>
<span style="color: #0000ff;">struct</span>
<span style="color: #000000;">&nbsp;t<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #0000ff;">int</span>
<span style="color: #000000;">&nbsp;min,&nbsp;max;<br>}map[maxn][</span>
<span style="color: #000000;">20</span>
<span style="color: #000000;">];<br></span>
<span style="color: #0000ff;">void</span>
<span style="color: #000000;">&nbsp;build&nbsp;(</span>
<span style="color: #0000ff;">int</span>
<span style="color: #000000;">&nbsp;n)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #0000ff;">int</span>
<span style="color: #000000;">&nbsp;i,&nbsp;j,&nbsp;m,&nbsp;r&nbsp;</span>
<span style="color: #000000;">=</span>
<span style="color: #000000;">&nbsp;n,&nbsp;c&nbsp;</span>
<span style="color: #000000;">=</span>
<span style="color: #000000;">&nbsp;log((</span>
<span style="color: #0000ff;">double</span>
<span style="color: #000000;">)n)&nbsp;</span>
<span style="color: #000000;">/</span>
<span style="color: #000000;">&nbsp;log(</span>
<span style="color: #000000;">2.0</span>
<span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #0000ff;">for</span>
<span style="color: #000000;">&nbsp;(i&nbsp;</span>
<span style="color: #000000;">=</span>
<span style="color: #000000;">&nbsp;</span>
<span style="color: #000000;">1</span>
<span style="color: #000000;">;&nbsp;i&nbsp;</span>
<span style="color: #000000;">&lt;=</span>
<span style="color: #000000;">&nbsp;c;&nbsp;i</span>
<span style="color: #000000;">++</span>
<span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #0000ff;">for</span>
<span style="color: #000000;">&nbsp;(j&nbsp;</span>
<span style="color: #000000;">=</span>
<span style="color: #000000;">&nbsp;</span>
<span style="color: #000000;">1</span>
<span style="color: #000000;">;&nbsp;j&nbsp;</span>
<span style="color: #000000;">&lt;=</span>
<span style="color: #000000;">&nbsp;r;&nbsp;j</span>
<span style="color: #000000;">++</span>
<span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;</span>
<span style="color: #000000;">=</span>
<span style="color: #000000;">&nbsp;j&nbsp;</span>
<span style="color: #000000;">+</span>
<span style="color: #000000;">&nbsp;(</span>
<span style="color: #000000;">1</span>
<span style="color: #000000;">&nbsp;</span>
<span style="color: #000000;">&lt;&lt;</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;">));</span>
<span style="color: #008000;">//</span>
<span style="color: #008000;">右半部分的起始值</span>
<span style="color: #008000;">
<br>
</span>
<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #0000ff;">if</span>
<span style="color: #000000;">&nbsp;(m&nbsp;</span>
<span style="color: #000000;">&lt;=</span>
<span style="color: #000000;">&nbsp;r)<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;&nbsp;&nbsp;&nbsp;&nbsp;map[j][i].min&nbsp;</span>
<span style="color: #000000;">=</span>
<span style="color: #000000;">&nbsp;Min(map[j][i</span>
<span style="color: #000000;">-</span>
<span style="color: #000000;">1</span>
<span style="color: #000000;">].min&nbsp;,map[m][i</span>
<span style="color: #000000;">-</span>
<span style="color: #000000;">1</span>
<span style="color: #000000;">].min);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map[j][i].max&nbsp;</span>
<span style="color: #000000;">=</span>
<span style="color: #000000;">&nbsp;Max(map[j][i</span>
<span style="color: #000000;">-</span>
<span style="color: #000000;">1</span>
<span style="color: #000000;">].max,&nbsp;map[m][i</span>
<span style="color: #000000;">-</span>
<span style="color: #000000;">1</span>
<span style="color: #000000;">].max);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #0000ff;">else</span>
<span style="color: #008000;">//</span>
<span style="color: #008000;">长度超出n的，就当是j起点的最后一个终点的rmq。实现这步能使查询为O(1).</span>
<span style="color: #008000;">
<br>
</span>
<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map[j][i].min&nbsp;</span>
<span style="color: #000000;">=</span>
<span style="color: #000000;">&nbsp;map[j][i</span>
<span style="color: #000000;">-</span>
<span style="color: #000000;">1</span>
<span style="color: #000000;">].min;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map[j][i].max&nbsp;</span>
<span style="color: #000000;">=</span>
<span style="color: #000000;">&nbsp;map[j][i</span>
<span style="color: #000000;">-</span>
<span style="color: #000000;">1</span>
<span style="color: #000000;">].max;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span>
<span style="color: #0000ff;">int</span>
<span style="color: #000000;">&nbsp;query(</span>
<span style="color: #0000ff;">int</span>
<span style="color: #000000;">&nbsp;l,&nbsp;</span>
<span style="color: #0000ff;">int</span>
<span style="color: #000000;">&nbsp;r)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #0000ff;">int</span>
<span style="color: #000000;">&nbsp;len&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;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;</span>
<span style="color: #0000ff;">int</span>
<span style="color: #000000;">&nbsp;k&nbsp;</span>
<span style="color: #000000;">=</span>
<span style="color: #000000;">&nbsp;log((</span>
<span style="color: #0000ff;">double</span>
<span style="color: #000000;">)len)&nbsp;</span>
<span style="color: #000000;">/</span>
<span style="color: #000000;">&nbsp;log(</span>
<span style="color: #000000;">2.0</span>
<span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #0000ff;">int</span>
<span style="color: #000000;">&nbsp;m&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;">&lt;&lt;</span>
<span style="color: #000000;">&nbsp;k)&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;">int</span>
<span style="color: #000000;">&nbsp;min&nbsp;</span>
<span style="color: #000000;">=</span>
<span style="color: #000000;">&nbsp;Min(map[l][k].min,&nbsp;map[m][k].min);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #0000ff;">int</span>
<span style="color: #000000;">&nbsp;max&nbsp;</span>
<span style="color: #000000;">=</span>
<span style="color: #000000;">&nbsp;Max(map[l][k].max,&nbsp;map[m][k].max);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #0000ff;">return</span>
<span style="color: #000000;">&nbsp;max&nbsp;</span>
<span style="color: #000000;">-</span>
<span style="color: #000000;">&nbsp;min;<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;n,&nbsp;m,&nbsp;&nbsp;i,&nbsp;l,&nbsp;r;<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;</span>
<span style="color: #0000ff;">for</span>
<span style="color: #000000;">&nbsp;(i&nbsp;</span>
<span style="color: #000000;">=</span>
<span style="color: #000000;">&nbsp;</span>
<span style="color: #000000;">1</span>
<span style="color: #000000;">;&nbsp;i&nbsp;</span>
<span style="color: #000000;">&lt;=</span>
<span style="color: #000000;">&nbsp;n;&nbsp;i</span>
<span style="color: #000000;">++</span>
<span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span>
<span style="color: #000000;">"</span>
<span style="color: #000000;">%d</span>
<span style="color: #000000;">"</span>
<span style="color: #000000;">,&nbsp;</span>
<span style="color: #000000;">&amp;</span>
<span style="color: #000000;">map[i][</span>
<span style="color: #000000;">0</span>
<span style="color: #000000;">].min);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map[i][</span>
<span style="color: #000000;">0</span>
<span style="color: #000000;">].max&nbsp;</span>
<span style="color: #000000;">=</span>
<span style="color: #000000;">&nbsp;map[i][</span>
<span style="color: #000000;">0</span>
<span style="color: #000000;">].min;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;build&nbsp;(n);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span style="color: #0000ff;">while</span>
<span style="color: #000000;">&nbsp;(m</span>
<span style="color: #000000;">--</span>
<span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&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;">l,&nbsp;</span>
<span style="color: #000000;">&amp;</span>
<span style="color: #000000;">r);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span>
<span style="color: #000000;">"</span>
<span style="color: #000000;">%d\n</span>
<span style="color: #000000;">"</span>
<span style="color: #000000;">,&nbsp;query(l,&nbsp;r));<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>}</span>
</div>
<br><img src ="http://www.cppblog.com/Ylemzy/aggbug/121703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Ylemzy/" target="_blank">火碳黑</a> 2010-07-30 15:35 <a href="http://www.cppblog.com/Ylemzy/articles/121703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>