﻿<?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++博客-【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】-文章分类-数据结构</title><link>http://www.cppblog.com/xiongnanbin/category/9994.html</link><description>竞赛决不是捷径，它只是另一种艰辛的生活方式。得到与失去，只有时间会去评判；成功与失败，只有历史能去仲裁。我不会永远成功，正如我不会永远失败一样</description><language>zh-cn</language><lastBuildDate>Wed, 16 Sep 2009 08:48:59 GMT</lastBuildDate><pubDate>Wed, 16 Sep 2009 08:48:59 GMT</pubDate><ttl>60</ttl><item><title>【树状数组 校门外的树】</title><link>http://www.cppblog.com/xiongnanbin/articles/94004.html</link><dc:creator>开拓者</dc:creator><author>开拓者</author><pubDate>Fri, 21 Aug 2009 02:59:00 GMT</pubDate><guid>http://www.cppblog.com/xiongnanbin/articles/94004.html</guid><wfw:comment>http://www.cppblog.com/xiongnanbin/comments/94004.html</wfw:comment><comments>http://www.cppblog.com/xiongnanbin/articles/94004.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiongnanbin/comments/commentRss/94004.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiongnanbin/services/trackbacks/94004.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">描述 Description<br>校门外有很多树，有苹果树，香蕉树，有会扔石头的，有可以吃掉补充体力的&#8230;&#8230;<br>如今学校决定在某个时刻在某一段种上一种树，保证任一时刻不会出现两段相同种类的树，现有两个操作：<br>&nbsp; K=1，读入l,r表示在l~r之间种上的一种树<br>&nbsp; K=2，读入l,r表示询问l~r之间能见到多少种树(l,r&gt;0)</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">输入格式 Input Format<br>第一行n,m表示道路总长为n，共有m个操作<br>接下来m行为m个操作</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">输出格式 Output Format<br>对于每个k=2输出一个答案</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">样例输入 Sample Input<br>5 4 1 1 3 2 2 5 1 2 4 2 3 5</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">样例输出 Sample Output &nbsp;<br>1 2</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">注释 Hint<br>范围：<br>20%的数据保证，n,m&lt;=100<br>60%的数据保证，n &lt;=1000,m&lt;=50000<br>100%的数据保证，n,m&lt;=50000</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"><strong style="FONT-SIZE: 12pt">【参考程序】：//树状数组</strong></p>
<div style="BORDER-RIGHT: #00ffff 2px solid; PADDING-RIGHT: 5px; BORDER-TOP: #00ffff 2px solid; PADDING-LEFT: 4px; FONT-SIZE: 12pt; PADDING-BOTTOM: 4px; BORDER-LEFT: #00ffff 2px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #00ffff 2px solid; FONT-FAMILY: 宋体; BACKGROUND-COLOR: #eeeeee"><strong><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstring</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br><strong>#include</strong></span><strong><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstdio</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br><strong>#include</strong></span><strong><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br></span><strong><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span></strong><strong><span style="COLOR: #000000">&nbsp;std;<br><br>typedef&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;array[</span><span style="COLOR: #000000">50010</span></strong><strong><span style="COLOR: #000000">];<br>array&nbsp;a,b;<br></span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;n,m;<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;lowbit(</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;x)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;x</span><span style="COLOR: #000000">^</span><span style="COLOR: #000000">(x</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">(x</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">));<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;add(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x,array&nbsp;</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">c)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(x</span><span style="COLOR: #000000">&lt;=</span></strong><strong><span style="COLOR: #000000">n)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c[x]</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x</span><span style="COLOR: #000000">+=</span></strong><strong><span style="COLOR: #000000">lowbit(x);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;getsum(</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;x,array&nbsp;c)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sum</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span></strong><strong><span style="COLOR: #000000">&nbsp;(x)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum</span><span style="COLOR: #000000">+=</span></strong><strong><span style="COLOR: #000000">c[x];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x</span><span style="COLOR: #000000">-=</span></strong><strong><span style="COLOR: #000000">lowbit(x);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span></strong><strong><span style="COLOR: #000000">&nbsp;sum;<br>}<br></span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;main()<br>{<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">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">n,</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">m);<br>&nbsp;&nbsp;&nbsp;&nbsp;memset(a,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span></strong><strong><span style="COLOR: #000000">(a));<br>&nbsp;&nbsp;&nbsp;&nbsp;memset(b,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span></strong><strong><span style="COLOR: #000000">(b));<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;t,l,r;<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</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">m;i</span><span style="COLOR: #000000">++</span></strong><strong><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</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">t,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">l,</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">r);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(t</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">1</span></strong><strong><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;add(l,a);&nbsp;add(r,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></strong><span style="COLOR: #000000"><br><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong></span><strong><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;s</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">getsum(r,a)</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">getsum(l</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">,b);<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></strong><strong><span style="COLOR: #000000">,s);<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></strong><span style="COLOR: #000000"><strong>;<br>}</strong></span></div>
<img src ="http://www.cppblog.com/xiongnanbin/aggbug/94004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiongnanbin/" target="_blank">开拓者</a> 2009-08-21 10:59 <a href="http://www.cppblog.com/xiongnanbin/articles/94004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【树状数组 笨笨的西瓜种植（赛）】</title><link>http://www.cppblog.com/xiongnanbin/articles/92938.html</link><dc:creator>开拓者</dc:creator><author>开拓者</author><pubDate>Tue, 11 Aug 2009 11:58:00 GMT</pubDate><guid>http://www.cppblog.com/xiongnanbin/articles/92938.html</guid><wfw:comment>http://www.cppblog.com/xiongnanbin/comments/92938.html</wfw:comment><comments>http://www.cppblog.com/xiongnanbin/articles/92938.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiongnanbin/comments/commentRss/92938.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiongnanbin/services/trackbacks/92938.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">背景 Background</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">笨笨：小西瓜，小西瓜~<br>路人甲：不会呀，这西瓜明明就大着啊&#8230;&#8230;<br>笨笨：那&#8230;&#8230;大西瓜，大西瓜~<br>路人甲：这么快就改口了&#8230;&#8230;<br>笨笨：西瓜西瓜~可爱的西瓜~ </p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">描述 Description</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">笨笨种了一块西瓜地，但这块西瓜地的种植范围是一条直线的&#8230;&#8230;<br>笨笨在一番研究过后，得出了m个结论，这m个结论可以使他收获的西瓜最多。<br>笨笨的结论是这样的：<br>从西瓜地B处到E处至少要种植T个西瓜，这个范围的收获就可以最大化。<br>笨笨不想那么辛苦，所以他想种植的西瓜尽量少，而又满足每一个所得的结论。</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">输入格式 Input Format<br>第一行两个数n,m（0&lt;n&lt;=5000,0&lt;=m&lt;=3000），表示笨笨的西瓜地长n，笨笨得出m个结论。<br>接下来m行表示笨笨的m个结论，每行三个数b,e,t（1&lt;=b&lt;=e&lt;=n,0&lt;=t&lt;=e-b+1）。</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">输出格式 Output Format<br>输出笨笨最少需种植多少西瓜。<br></p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"><span style="COLOR: red"><strong>分析：</strong><br>&nbsp;&nbsp;&nbsp; qsort+树状数组。</span></p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"><strong>【参考程序】：</strong></p>
<div style="BORDER-RIGHT: #00ffff 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #00ffff 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 12pt; PADDING-BOTTOM: 4px; BORDER-LEFT: #00ffff 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #00ffff 1px solid; FONT-FAMILY: 宋体; BACKGROUND-COLOR: #eeeeee"><strong><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstring</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br><strong>#include</strong></span><strong><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstdio</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br><strong>#include</strong></span><strong><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br></span><strong><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span></strong><strong><span style="COLOR: #000000">&nbsp;std;<br><br></span><span style="COLOR: #0000ff">struct</span></strong><strong><span style="COLOR: #000000">&nbsp;node<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;b,e,t;<br>}&nbsp;a[</span><span style="COLOR: #000000">3010</span></strong><strong><span style="COLOR: #000000">];<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;f[</span><span style="COLOR: #000000">5010</span><span style="COLOR: #000000">],c[</span><span style="COLOR: #000000">5010</span></strong><strong><span style="COLOR: #000000">];<br></span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;n,m;<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;cmp(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s,</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span></strong><strong><span style="COLOR: #000000">t)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;i</span><span style="COLOR: #000000">=*</span><span style="COLOR: #000000">(node&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)s,j</span><span style="COLOR: #000000">=*</span><span style="COLOR: #000000">(node&nbsp;</span><span style="COLOR: #000000">*</span></strong><strong><span style="COLOR: #000000">)t;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;i.e</span><span style="COLOR: #000000">-</span></strong><strong><span style="COLOR: #000000">j.e;<br>}<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;lowbit(</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;x)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;x</span><span style="COLOR: #000000">^</span><span style="COLOR: #000000">(x</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">(x</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">));<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;modify(</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;x)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(x</span><span style="COLOR: #000000">&lt;=</span></strong><strong><span style="COLOR: #000000">n)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c[x]</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x</span><span style="COLOR: #000000">+=</span></strong><strong><span style="COLOR: #000000">lowbit(x);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;getsum(</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;x)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sum</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span></strong><strong><span style="COLOR: #000000">&nbsp;(x)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum</span><span style="COLOR: #000000">+=</span></strong><strong><span style="COLOR: #000000">c[x];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x</span><span style="COLOR: #000000">-=</span></strong><strong><span style="COLOR: #000000">lowbit(x);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span></strong><strong><span style="COLOR: #000000">&nbsp;sum;<br>}<br></span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;main()<br>{<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">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">n,</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">m);<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</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">m;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d%d%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a[i].b,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a[i].e,</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">a[i].t);<br>&nbsp;&nbsp;&nbsp;&nbsp;qsort(a</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,m,</span><span style="COLOR: #0000ff">sizeof</span></strong><strong><span style="COLOR: #000000">(node),cmp);<br>&nbsp;&nbsp;&nbsp;&nbsp;memset(c,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span></strong><strong><span style="COLOR: #000000">(c));<br>&nbsp;&nbsp;&nbsp;&nbsp;memset(f,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span></strong><strong><span style="COLOR: #000000">(f));<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;need,ans</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">m;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;need</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">a[i].t</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">(getsum(a[i].e)</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">getsum(a[i].b</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">a[i].e;j</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">a[i].b;j</span><span style="COLOR: #000000">--</span></strong><strong><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;(need</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #0000ff">break</span></strong><strong><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;(</span><span style="COLOR: #000000">!</span></strong><strong><span style="COLOR: #000000">f[j])<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;f[j]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;need</span><span style="COLOR: #000000">--</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modify(j);&nbsp;ans</span><span style="COLOR: #000000">++</span></strong><strong><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;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span></strong><strong><span style="COLOR: #000000">,ans);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span></strong><span style="COLOR: #000000"><strong>;<br>}</strong></span></div>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"><br>&nbsp;</p>
<img src ="http://www.cppblog.com/xiongnanbin/aggbug/92938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiongnanbin/" target="_blank">开拓者</a> 2009-08-11 19:58 <a href="http://www.cppblog.com/xiongnanbin/articles/92938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【Pascal 山脉】</title><link>http://www.cppblog.com/xiongnanbin/articles/92182.html</link><dc:creator>开拓者</dc:creator><author>开拓者</author><pubDate>Tue, 04 Aug 2009 08:31:00 GMT</pubDate><guid>http://www.cppblog.com/xiongnanbin/articles/92182.html</guid><wfw:comment>http://www.cppblog.com/xiongnanbin/comments/92182.html</wfw:comment><comments>http://www.cppblog.com/xiongnanbin/articles/92182.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiongnanbin/comments/commentRss/92182.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiongnanbin/services/trackbacks/92182.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 12pt">描述<br>小卡卡顺着老者所指的方向，来到了Pascal神峰的顶峰。老者告诉小卡卡，Pascal山脉有很多座山，都排在一条直线上，每座山都有不同的高度。 <br>Pascal山的山顶有一个神奇的洞穴，进入这个洞穴后，你将会到达这座山前方的另一座山,更加神奇的是，你到达的山一定比他所在的山高度要小。而Pascal圣地最大的宝藏就藏在某一座Pascal山上的洞穴中，这个洞穴的特点是它有一道石门封闭着。 <br>小卡卡很想知道进入每座山的洞穴后，他所到达的不同的山会有多少种可能。 </p>
<p style="FONT-SIZE: 12pt">输入<br>该题含有多组测试数据。 <br>第一行一个整数n,表示山的个数.(1&lt;=n&lt;=200000) <br>第二行以后n行从前到后给出每座山的高度。另外两座山可以有相同的高度.(1&lt;=每座山的高度&lt;=maxlongint) </p>
<p style="FONT-SIZE: 12pt">输出<br>共n行,每行一个整数.第I行的整数表示他进入第I号山的洞穴后能够到达的不同的山的个数. </p>
<p style="FONT-SIZE: 12pt">样例输入<br>5<br>1<br>2<br>3<br>4<br>5</p>
<p style="FONT-SIZE: 12pt">样例输出<br>0<br>1<br>2<br>3<br>4<br><br><strong style="FONT-SIZE: 12pt; COLOR: red">分析：离散化+树状数组<br><br><span style="FONT-SIZE: 12pt; COLOR: #ff00ff">【参考程序】：<br></span></strong></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 12pt; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: 宋体; BACKGROUND-COLOR: #eeeeee"><strong><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br><strong>#include</strong></span><strong><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.h</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br><strong>#include</strong></span><strong><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdlib.h</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff"><strong>struct</strong></span><strong><span style="COLOR: #000000">&nbsp;node<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;x,y;<br>}&nbsp;a[</span><span style="COLOR: #000000">200001</span></strong><strong><span style="COLOR: #000000">];<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b[</span><span style="COLOR: #000000">200001</span><span style="COLOR: #000000">],c[</span><span style="COLOR: #000000">200001</span></strong><strong><span style="COLOR: #000000">];<br></span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;n,len;<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;cmp(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s,</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span></strong><strong><span style="COLOR: #000000">t)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;i</span><span style="COLOR: #000000">=*</span><span style="COLOR: #000000">(node&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)s,j</span><span style="COLOR: #000000">=*</span><span style="COLOR: #000000">(node&nbsp;</span><span style="COLOR: #000000">*</span></strong><strong><span style="COLOR: #000000">)t;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;i.x</span><span style="COLOR: #000000">-</span></strong><strong><span style="COLOR: #000000">j.x;<br>}<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;lowbit(</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;x)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;x</span><span style="COLOR: #000000">^</span><span style="COLOR: #000000">(x</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">(x</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">));<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;modify(</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;x)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(x</span><span style="COLOR: #000000">&lt;=</span></strong><strong><span style="COLOR: #000000">len)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c[x]</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x</span><span style="COLOR: #000000">+=</span></strong><strong><span style="COLOR: #000000">lowbit(x);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;getsum(</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;x)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;s</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span></strong><strong><span style="COLOR: #000000">&nbsp;(x)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s</span><span style="COLOR: #000000">+=</span></strong><strong><span style="COLOR: #000000">c[x];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x</span><span style="COLOR: #000000">-=</span></strong><strong><span style="COLOR: #000000">lowbit(x);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span></strong><strong><span style="COLOR: #000000">&nbsp;s;<br>}<br></span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span></strong><strong><span style="COLOR: #008000">freopen("a1.in","r",stdin);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">freopen("a1.out","w",stdout);</span></strong><span style="COLOR: #008000"><br></span><strong><span style="COLOR: #000000">&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">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">n)</span><span style="COLOR: #000000">!=</span></strong><strong><span style="COLOR: #000000">EOF)<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;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">n;i</span><span style="COLOR: #000000">++</span></strong><strong><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">,</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">a[i].x);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[i].y</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qsort(a</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,n,</span><span style="COLOR: #0000ff">sizeof</span></strong><strong><span style="COLOR: #000000">(node),cmp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].x</span><span style="COLOR: #000000">=-</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">n;i</span><span style="COLOR: #000000">++</span></strong><strong><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;(a[i].x</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">a[i</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].x)&nbsp;len</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b[a[i].y]</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">len;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(c,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span></strong><strong><span style="COLOR: #000000">(c));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">n;i</span><span style="COLOR: #000000">++</span></strong><strong><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">int</span><span style="COLOR: #000000">&nbsp;sum</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">getsum(b[i]</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">);<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></strong><strong><span style="COLOR: #000000">,sum);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modify(b[i]);<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></strong><span style="COLOR: #000000"><strong>;<br>}</strong></span></div>
<img src ="http://www.cppblog.com/xiongnanbin/aggbug/92182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiongnanbin/" target="_blank">开拓者</a> 2009-08-04 16:31 <a href="http://www.cppblog.com/xiongnanbin/articles/92182.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【线段树之数列操作】</title><link>http://www.cppblog.com/xiongnanbin/articles/81249.html</link><dc:creator>开拓者</dc:creator><author>开拓者</author><pubDate>Mon, 27 Apr 2009 11:25:00 GMT</pubDate><guid>http://www.cppblog.com/xiongnanbin/articles/81249.html</guid><wfw:comment>http://www.cppblog.com/xiongnanbin/comments/81249.html</wfw:comment><comments>http://www.cppblog.com/xiongnanbin/articles/81249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiongnanbin/comments/commentRss/81249.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiongnanbin/services/trackbacks/81249.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 12pt"><strong>【问题描述】</strong></p>
<p style="FONT-SIZE: 12pt">&nbsp;假设有一列数 {A<sub>i</sub> }(1 &#8804; i &#8804; n) ，支持如下两种操作：</p>
<p style="FONT-SIZE: 12pt">(1)将 A<sub> k </sub>的值加 D 。（ k, D 是输入的数）</p>
<p style="FONT-SIZE: 12pt">(2) 输出 A<sub> s</sub> +A<sub> s+1</sub> +&#8230;+A<sub> t</sub> 。（ s, t 都是输入的数， S &#8804; T ）</p>
<p style="FONT-SIZE: 12pt">根据操作要求进行正确操作并输出结果。</p>
<p style="FONT-SIZE: 12pt">【输入格式】</p>
<p style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp; 输入文件第一行一个整数 <strong>n(0&lt;=n&lt;=100000) </strong>， 第二行为 n 个整数，表示 {A<sub> i</sub> } 的初始值。</p>
<p style="FONT-SIZE: 12pt" align=left>第三行为一个整数 <strong>m(0&lt;=m&lt;=150000) </strong>，表示操作数 v 下接 m 行，每行描述一个操作，有如下两种情况：</p>
<p style="FONT-SIZE: 12pt" align=left>ADD k d ( 表示将 A<sub> k </sub>加 d ， 1&lt;=k&lt;=n ， d 为整数 )</p>
<p style="FONT-SIZE: 12pt" align=left>SUM s t （表示输出 A<sub> s</sub> +&#8230;+A<sub> t</sub> ）</p>
<p style="FONT-SIZE: 12pt">【输出格式】</p>
<p style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; 对于每一个 SUM 提问，输出结果</p>
<p style="FONT-SIZE: 12pt">【输入输出样例】<br>&nbsp;<strong><br></strong>输入:</p>
<p style="FONT-SIZE: 12pt">4<br>1 4 2 3<br>3<br>SUM 1 3<br>ADD 2 50<br>SUM 2 3</p>
<p style="FONT-SIZE: 12pt">输出:</p>
<p style="FONT-SIZE: 12pt">7<br>56<br><br>分析：不用多说什么，就是线段树或者树状数组，我选定的是线段树，思路和我发表的上一篇【I HATE IT】是一样的。<br><br><span style="FONT-SIZE: 12pt; COLOR: #ff00ff">【参考程序】：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 12pt; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;maxn</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">100010</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;node<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a,b,sum;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;lc,rc;<br>}&nbsp;tree[maxn</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a[maxn];<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;tail,n,m,Sum;<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;modify(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;now,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;left,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;right,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;st)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a1</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[now].a,b1</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[now].b;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(left</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">a1&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;b1</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">right)<br>&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;tree[now].sum</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[now].sum</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">st;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;lcl</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[now].lc,rcl</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[now].rc;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;mid</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(a1</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">b1)</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(right</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">mid)<br>&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;modify(lcl,left,right,st);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree[now].sum</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[tree[now].lc].sum</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">tree[tree[now].rc].sum;<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">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(left</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">mid)<br>&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;modify(rcl,left,right,st);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree[now].sum</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[tree[now].lc].sum</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">tree[tree[now].rc].sum;<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">&nbsp;<br>&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;modify(lcl,left,mid,st);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modify(rcl,mid,right,st);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree[now].sum</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[tree[now].lc].sum</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">tree[tree[now].rc].sum;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;getsum(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;now,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;left,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;right)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a1</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[now].a,b1</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[now].b;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(left</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">a1&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;b1</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">right)<br>&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;Sum</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">tree[now].sum;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;lcl</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[now].lc,rcl</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[now].rc;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;mid</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(a1</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">b1)</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(right</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">mid)&nbsp;getsum(lcl,left,right);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(left</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">mid)&nbsp;getsum(rcl,left,right);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getsum(lcl,left,mid);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getsum(rcl,mid,right);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;make_tree(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a1,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b1)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tail</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;now</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tail;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree[now].a</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">a1;tree[now].b</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">b1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree[now].sum</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree[now].lc</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[now].rc</span><span style="COLOR: #000000">=-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(a1</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">b1)<br>&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">int</span><span style="COLOR: #000000">&nbsp;mid</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(a1</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">b1)</span><span style="COLOR: #000000">&gt;&gt;</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;tree[now].lc</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tail</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;&nbsp;make_tree(a1,mid);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree[now].rc</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tail</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;&nbsp;make_tree(mid,b1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree[now].sum</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[tree[now].lc].sum</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">tree[tree[now].rc].sum;<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">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(a1</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">b1)&nbsp;tree[now].sum</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">a[b1];<br>}<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freopen(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">shulie.in</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">r</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,stdin);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freopen(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">shulie.out</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">w</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,stdout);<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">,</span><span style="COLOR: #000000">&amp;</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;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">n;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a[i]);<br>&nbsp;&nbsp;tail</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;make_tree(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,n);<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">,</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">char</span><span style="COLOR: #000000">&nbsp;ss[</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">{</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">};</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;s,t;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">m;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;&nbsp;&nbsp;&nbsp;&nbsp;getchar();<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">%s&nbsp;%d%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,ss,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">s,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">t);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">strcmp(ss,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">SUM</span><span style="COLOR: #000000">"</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;&nbsp;&nbsp;&nbsp;&nbsp;Sum</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getsum(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,s</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,t);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,Sum);<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">&nbsp;modify(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,s</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,s,t);<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;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
<p style="FONT-SIZE: 12pt"></span><br>&nbsp;</p>
<img src ="http://www.cppblog.com/xiongnanbin/aggbug/81249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiongnanbin/" target="_blank">开拓者</a> 2009-04-27 19:25 <a href="http://www.cppblog.com/xiongnanbin/articles/81249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【HDU I Hate It】</title><link>http://www.cppblog.com/xiongnanbin/articles/81195.html</link><dc:creator>开拓者</dc:creator><author>开拓者</author><pubDate>Mon, 27 Apr 2009 03:19:00 GMT</pubDate><guid>http://www.cppblog.com/xiongnanbin/articles/81195.html</guid><wfw:comment>http://www.cppblog.com/xiongnanbin/comments/81195.html</wfw:comment><comments>http://www.cppblog.com/xiongnanbin/articles/81195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiongnanbin/comments/commentRss/81195.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiongnanbin/services/trackbacks/81195.html</trackback:ping><description><![CDATA[<p><span style="FONT-SIZE: 12pt">很多学校流行一种比较的习惯。老师们很喜欢询问，从某某到某某当中，分数最高的是多少。<br>这让很多学生很反感。<br><br>不管你喜不喜欢，现在需要你做的是，就是按照老师的要求，写一个程序，模拟老师的询问。当然，老师有时候需要更新某位同学的成绩<br></span><br><span style="FONT-SIZE: 12pt">input:<br>本题目包含多组测试，请处理到文件结束。<br>在每个测试的第一行，有两个正整数 N 和 M ( 0&lt;N&lt;=200000,0&lt;M&lt;5000 )，分别代表学生的数目和操作的数目。<br>学生ID编号分别从1编到N。<br>第二行包含N个整数，代表这N个学生的初始成绩，其中第i个数代表ID为i的学生的成绩。<br>接下来有M行。每一行有一个字符 C (只取'Q'或'U') ，和两个正整数A，B。<br>当C为'Q'的时候，表示这是一条询问操作，它询问ID从A到B(包括A,B)的学生当中，成绩最高的是多少。<br>当C为'U'的时候，表示这是一条更新操作，要求把ID为A的学生的成绩更改为B<br><br>output:<br>对于每一次询问操作，在一行里面输出最高成绩<br><br>input:<br>5 6<br>1 2 3 4 5<br>Q 1 5<br>U 3 6<br>Q 3 4<br>Q 4 5<br>U 2 9<br>Q 1 5<br><br>output：<br>5<br>6<br>5<br>9<br><br><span style="COLOR: #ff00ff">【参考程序】：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 12pt; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;maxn</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">200010</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;node<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a,b,score;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;lc,rc;<br>}&nbsp;tree[maxn</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a[maxn];<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;tail,n,m,MAX;<br>inline&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;max(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;a</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">b</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">a:b;<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;modify(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;now,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;left,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;right,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;s)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a1</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[now].a,b1</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[now].b;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(left</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">a1&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;b1</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">right)<br>&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;tree[now].score</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">s;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;lcl</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[now].lc,rcl</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[now].rc;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;mid</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(a1</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">b1)</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(right</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">mid)<br>&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;modify(lcl,left,right,s);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree[now].score</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">max(tree[now].score,tree[lcl].score);<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">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(left</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">mid)<br>&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;modify(rcl,left,right,s);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree[now].score</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">max(tree[now].score,tree[rcl].score);<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">&nbsp;<br>&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;modify(lcl,left,mid,s);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modify(rcl,mid,right,s);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree[now].score</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">max(tree[lcl].score,tree[rcl].score);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;getmax(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;now,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;left,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;right)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a1</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[now].a,b1</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[now].b;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(left</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">a1&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;b1</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">right)<br>&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;MAX</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">max(MAX,tree[now].score);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;lcl</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[now].lc,rcl</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tree[now].rc;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;mid</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(a1</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">b1)</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(right</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">mid)&nbsp;getmax(lcl,left,right);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(left</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">mid)&nbsp;getmax(rcl,left,right);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getmax(lcl,left,mid);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getmax(rcl,mid,right);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;make_tree(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a1,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b1)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tail</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;now</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tail;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree[now].a</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">a1;tree[now].b</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">b1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree[now].score</span><span style="COLOR: #000000">=-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(a1</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">b1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;mid</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(a1</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">b1)</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;tree[now].lc</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tail</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;&nbsp;make_tree(a1,mid);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree[now].rc</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">tail</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;&nbsp;make_tree(mid,b1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree[now].score</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">max(tree[tree[now].lc].score,tree[tree[now].rc].score);<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">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(a1</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">b1)&nbsp;tree[now].score</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">a[b1];<br>}<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&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">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">n,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">m)</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">EOF)<br>&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">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">n;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tail</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;make_tree(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,n);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;A,B;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;c;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">m;i</span><span style="COLOR: #000000">++</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;&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%c&nbsp;%d%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">c,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">A,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">B);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(c</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">Q</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAX</span><span style="COLOR: #000000">=-</span><span style="COLOR: #000000">0xFFFFFFF</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getmax(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,A</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,B);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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">,MAX);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;modify(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,A</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,A,B);<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;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&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>
</span></span>
<img src ="http://www.cppblog.com/xiongnanbin/aggbug/81195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiongnanbin/" target="_blank">开拓者</a> 2009-04-27 11:19 <a href="http://www.cppblog.com/xiongnanbin/articles/81195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图的基本知识 (本文由我转载高人)</title><link>http://www.cppblog.com/xiongnanbin/articles/78173.html</link><dc:creator>开拓者</dc:creator><author>开拓者</author><pubDate>Sat, 28 Mar 2009 12:55:00 GMT</pubDate><guid>http://www.cppblog.com/xiongnanbin/articles/78173.html</guid><wfw:comment>http://www.cppblog.com/xiongnanbin/comments/78173.html</wfw:comment><comments>http://www.cppblog.com/xiongnanbin/articles/78173.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xiongnanbin/comments/commentRss/78173.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xiongnanbin/services/trackbacks/78173.html</trackback:ping><description><![CDATA[顶点:图中的数据元素称为顶点.<br>有向图:有方向的图叫有向图.<br>无向图:没有方向的图叫无线图.<br>完全图:有n(n-1)/2条边的无向图称为完全图.<br>有向完全图:具有n(n-1)条弧的有向图称为有向完全图.<br>稀疏图:有很少条边或弧的图称为稀疏图,反之称为稠密图.<br>权:与图的边或弧相关的数叫做权(weight).
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"><br>1. Relaxation(松弛操作)： <br>procedure relax(u,v,w:integer);//多数情况下不需要单独写成procedure。 <br>begin <br>&nbsp;&nbsp; if dis[u]+w&lt;dis[v] then <br>&nbsp;&nbsp;&nbsp;&nbsp; begin <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dis[v]:=dis[u]+w; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pre[v]:=u; <br>&nbsp;&nbsp;&nbsp;&nbsp; end <br>end; <br><br><br><br>2. Dijkstra <br>1) 适用条件&amp;范围： <br>a) 单源最短路径(从源点s到其它所有顶点v); <br>b) 有向图&amp;无向图(无向图可以看作(u,v),(v,u)同属于边集E的有向图) <br>c) 所有边权非负(任取(i,j)&#8712;E都有Wij&#8805;0); <br>2) 算法描述： <br>a) 初始化：dis[v]=maxint(v&#8712;V,v&#8800;s); dis[s]=0; pre[s]=s; S={s}; <br>b) For i:=1 to n <br>1.取V-S中的一顶点u使得dis[u]=min{dis[v]|v&#8712;V-S} <br>2.S=S+{u} <br>3.For V-S中每个顶点v do Relax(u,v,Wu,v) <br>c) 算法结束：dis[i]为s到i的最短距离；pre[i]为i的前驱节点 <br>3) 算法优化： <br>使用二叉堆(Binary Heap)来实现每步的DeleteMin(ExtractMin，即算法步骤b中第1步)操作，算法复杂度从O(V^2)降到O((V+E)㏒V)。推荐对稀疏图使用。 <br>使用Fibonacci Heap(或其他Decrease操作O(1),DeleteMin操作O(logn)的数据结构)可以将复杂度降到O(E+V㏒V)；如果边权值均为不大于C的正整数，则使用Radix Heap可以达到O(E+V㏒C)。但因为它们编程复杂度太高，不推荐在信息学竞赛中使用。 <br><br><br>3. Bellman-Ford <br>1) 适用条件&amp;范围： <br>a) 单源最短路径(从源点s到其它所有顶点v); <br>b) 有向图&amp;无向图(无向图可以看作(u,v),(v,u)同属于边集E的有向图); <br>c) 边权可正可负(如有负权回路输出错误提示); <br>d) 差分约束系统; <br>2) 算法描述： <br>对每条边进行|V|次Relax操作; <br>完成后，如果存在(u,v)&#8712;E使得dis[u]+w&lt;dis[v],则存在负权回路;否则dis[v]即为s到v的最短距离,pre[v]为前驱。 <br>3) 算法实现： <br>For i:=1 to |V| do <br>For 每条边(u,v)&#8712;E do <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Relax(u,v,w); <br>For每条边(u,v)&#8712;E do <br>If dis[u]+w&lt;dis[v] Then Exit(False) <br><br>算法时间复杂度O(VE)。因为算法简单，适用范围又广，虽然复杂度稍高，但因为它实践中的效果不错，仍不失为一个很实用的算法。 <br><br><br><br>4. Topological Sort(拓扑排序) <br>1) 适用条件&amp;范围： <br>a) AOV网(Activity On Vertex Network); <br>b) 有向图; <br>c) 作为某些算法的预处理过程(如DP) <br>2) 算法描述： <br>很简单的算法：每次挑选入度为0的顶点输出(不计次序)。 <br>如果最后发现输出的顶点数小于|V|，则表明有回路存在 <br>3) 算法实现： <br>a) 数据结构： adj:邻接表;有4个域{u,v,w,next} <br>indgr[i]:顶点i的入度; <br>stack[]:栈 <br>b) 初始化:top=0 (栈顶指针) <br>c) 将初始状态所有入度为0的顶点压栈 <br>d) I=0 (计数器) <br>e) While 栈非空(top&gt;0) do <br>i. 顶点v出栈；输出v；计数器增1； <br>ii. For 与v邻接的顶点u do <br>1. dec(indgr[u]); <br>2. If indgr[u]=0 then 顶点u入栈 <br>f) EXIT(I=|V|) <br><br>简单&amp;高效&amp;实用的算法。上述实现方法复杂度O(V+E) <br><br><br>5. SSSP On DAG <br>1) 适用条件&amp;范围： <br>a) DAG(Directed Acyclic Graph,有向无环图); <br>b) 边权可正可负 <br>2) 算法描述： <br>a) Toposort; <br>b) If Toposort=False Then HALT(Not a DAG) <br>c) For 拓扑序的每个顶点u do <br>For u的每个邻接点v do <br>Relax(u,v,w); <br><br>算法结束后：如有环则输出错误信息；否则dis[i]为s到i的最短距离，pre[i]为前驱顶点。 <br>3) 算法实现： <br>基本从略。此算法时间复杂度O(V+E)，时间&amp;编程 复杂度低，如遇到符合条件的题目(DAG)，推荐使用。 <br>还有，此算法的步骤c可以在toposort中实现，这样即减小了此算法复杂度的一个系数。 <br><br>6. Floyd-Warshall <br>1) 适用范围： <br>a) APSP(All Pairs Shortest Paths) <br>b) 稠密图效果最佳 <br>c) 边权可正可负 <br>2) 算法描述： <br>a) 初始化：dis[u,v]=w[u,v] <br>b) For k:=1 to n <br>For i:=1 to n <br>For j:=1 to n <br>If dis[i,j]&gt;dis[i,k]+dis[k,j] Then</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">Dis[I,j]:=dis[I,k]+dis[k,j]; <br>c) 算法结束：dis即为所有点对的最短路径矩阵 <br>3) 算法小结： <br>此算法简单有效，由于三重循环结构紧凑，对于稠密图，效率要高于执行|V|次Dijkstra算法。时间复杂度O(n^3)。 <br>考虑下列变形：如(I,j)&#8712;E则dis[I,j]初始为1,else初始为0，这样的Floyd算法最后的最短路径矩阵即成为一个判断I,j是否有通路的矩阵。更简单的，我们可以把dis设成boolean类型，则每次可以用&#8220;dis[I,j]:=dis[I,j]or(dis[I,k]and dis[k,j])&#8221;来代替算法描述中的蓝色部分，可以更直观地得到I,j的连通情况。 <br>与Dijkstra算法类似地，算法中蓝色的部分可以加上对Pre数组的更新，不再赘述。 <br><br>7. Prim （Dijksta的推广）<br>1) 适用范围： <br>a) MST(Minimum Spanning Tree,最小生成树) <br>b) 无向图(有向图的是最小树形图) <br>c) 多用于稠密图 <br>2) 算法描述： <br>a) 初始化：dis[v]=maxint(v&#8712;V,v&#8800;s); dis[s]=0; pre[s]=s; S={s};tot=0 <br>b) For i:=1 to n <br>1.取顶点v&#8712;V-S使得W(u,v)=min{W(u,v)|u&#8712;S,v&#8712;V-S,(u,v)&#8712;E} <br>2.S=S+{v};tot=tot+W(u,v);输出边(u,v) <br>3.For V-S中每个顶点v do Relax(u,v,Wu,v) <br>c) 算法结束：tot为MST的总权值 <br><br>注意：这里的Relax不同于求最短路径时的松弛操作。它的代码如下： <br>procedure relax(u,v,w:integer);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //松弛操作 <br>begin <br>&nbsp;&nbsp; if w&lt;dis[v] then <br>&nbsp;&nbsp;&nbsp;&nbsp; begin <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pre[v]:=u; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dis[v]:=w; <br>&nbsp;&nbsp;&nbsp;&nbsp; end; <br>end; <br>可以看到，虽然不同，却也十分相似。 <br>3) 算法优化： <br>使用二叉堆(Binary Heap)来实现每步的DeleteMin(ExtractMin)操作 <br>算法复杂度从O(V^2)降到O((V+E)㏒V)。推荐对稀疏图使用。 <br>使用Fibonacci Heap可以将复杂度降到O(E+V㏒V)，但因为编程复杂度太高，不推荐在信息学竞赛中使用。 <br>（不要问我为什么和Dijkstra一样&#8230;&#8230;观察我的prim和dijkstra程序，会发现基本上只有relax和输出不一样&#8230;&#8230;） <br><br>8 Kruskal <br>1) 适用范围： <br>a) MST(Minimum Spanning Tree,最小生成树) <br>b) 无向图(有向图的是最小树形图) <br>c) 多用于稀疏图 <br>d) 边已经按权值排好序给出 <br>2) 算法描述： <br>基本思想：每次选不属于同一连通分量(保证无圈)且边权值最小的2个顶点，将边加入MST，并将所在的2个连通分量合并，直到只剩一个连通分量 <br>3) 算法实现： <br>a) 将边按非降序排列(Quicksort,O(E㏒E)) <br>b) While 合并次数少于|V|-1 <br>i. 取一条边(u,v)(因为已经排序，所以必为最小) <br>ii. If u,v不属于同一连通分量 then <br>1) 合并u,v所在的连通分量 <br>2) 输出边(u,v) <br>3) 合并次数增1；tot=tot+W(u,v) <br>c) 算法结束：tot为MST的总权值 <br>4) 分析总结： <br>检查2个顶点是否在同一连通分量可以使用并查集实现(连通分量看作等价类)。 <br>我们可以看到，算法主要耗时在将边排序上。如果边已经按照权值顺序给出，那太棒了&#8230;&#8230; <br>另外一种可以想到的实现方法为：O(n)时间关于边权建二叉小根堆；每次挑选符合条件的边时使用堆的DelMin操作。这种方法比用Qsort预排序的方法稍微快一些，编程复杂度基本一样。附程序。 <br>另外，如果边权有一定限制，即&lt;=某常数c，则可以使用线性时间排序以获得更好的时间效率。</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"><br><br>SPFA算法 <br>求单源最短路的SPFA算法的全称是：Shortest Path Faster Algorithm。 <br>从名字我们就可以看出，这种算法在效率上一定有过人之处。 <br>很多时候，给定的图存在负权边，这时类似Dijkstra等算法便没有了用武之地，而Bellman-Ford算法的复杂度又过高，SPFA算法便派上用场了。 <br>简洁起见，我们约定有向加权图G不存在负权回路，即最短路径一定存在。当然，我们可以在执行该算法前做一次拓扑排序，以判断是否存在负权回路，但这不是我们讨论的重点。 <br>我们用数组d记录每个结点的最短路径估计值，而且用邻接表来存储图G。我们采取的方法是动态逼近法：设立一个先进先出的队列用来保存待优化的结点，优化时每次取出队首结点u，并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作，如果v点的最短路径估计值有所调整，且v点不在当前的队列中，就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作，直至队列空为止。 <br><br>定理: 只要最短路径存在，上述SPFA算法必定能求出最小值。 <br>证明：每次将点放入队尾，都是经过松弛操作达到的。换言之，每次的优化将会有某个点v的最短路径估计值d[v]变小。所以算法的执行会使d越来越小。由于我们假定图中不存在负权回路，所以每个结点都有最短路径值。因此，算法不会无限执行下去，随着d值的逐渐变小，直到到达最短路径值时，算法结束，这时的最短路径估计值就是对应结点的最短路径值。（证毕） <br><br>SPFA(G,w,s) <br>1. INITIALIZE-SINGLE-SOURCE(G,s) <br>2. INITIALIZE-QUEUE(Q) <br>3. ENQUEUE(Q,s) <br>4. While Not EMPTY(Q) <br>5. Do u&lt;-DLQUEUE(Q) <br>6. For 每条边(u,v) in E[G] <br>7. Do tmp&lt;-d[v] <br>8. Relax(u,v,w) <br>9. If (d[v] &lt; tmp) and (v不在Q中) <br>10. ENQUEUE(Q,v)</p>
<img src ="http://www.cppblog.com/xiongnanbin/aggbug/78173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xiongnanbin/" target="_blank">开拓者</a> 2009-03-28 20:55 <a href="http://www.cppblog.com/xiongnanbin/articles/78173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>