﻿<?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++博客-&amp;豪-文章分类-数据结构与算法</title><link>http://www.cppblog.com/qywyh/category/547.html</link><description>豪-&gt;blog</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 14:36:11 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 14:36:11 GMT</pubDate><ttl>60</ttl><item><title>红黑树（数据结构大作业扩展版）</title><link>http://www.cppblog.com/qywyh/articles/32740.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Sun, 23 Sep 2007 13:32:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/32740.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/32740.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/32740.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/32740.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/32740.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: RBTree.h&nbsp;#ifndef&nbsp;RBTREE_H#define&nbsp;RBTREE_Hconst&nbsp;int&nbsp;RED&nbsp;=&nbsp;0;const&nbsp;int&nbsp;BLACK&nbsp;=&nbsp;1;template&nbsp;&lt;class&nbsp;KT,&nbsp;class&nbsp;RT&gt;class&n...&nbsp;&nbsp;<a href='http://www.cppblog.com/qywyh/articles/32740.html'>阅读全文</a><img src ="http://www.cppblog.com/qywyh/aggbug/32740.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2007-09-23 21:32 <a href="http://www.cppblog.com/qywyh/articles/32740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pku3268 dij+heap</title><link>http://www.cppblog.com/qywyh/articles/28653.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Mon, 23 Jul 2007 12:51:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/28653.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/28653.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/28653.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/28653.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/28653.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 写了个比较通用的堆，可直接用作优先队列Silver Cow Party Time Limit:2000MS&nbsp; Memory Limit:65536KTotal Submit:1112 Accepted:326 DescriptionOne cow from each of N farms (1 &#8804; N &#8804; 1000) conveniently numb...&nbsp;&nbsp;<a href='http://www.cppblog.com/qywyh/articles/28653.html'>阅读全文</a><img src ="http://www.cppblog.com/qywyh/aggbug/28653.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2007-07-23 20:51 <a href="http://www.cppblog.com/qywyh/articles/28653.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线段树类</title><link>http://www.cppblog.com/qywyh/articles/21446.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Sat, 07 Apr 2007 04:16:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/21446.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/21446.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/21446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/21446.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/21446.html</trackback:ping><description><![CDATA[<pre>const int MAXN = 50000;
 
class SegmentTree {
public:
      int LSON[MAXN]; //LSON[i]为节点i的左儿子的序号
      int RSON[MAXN]; //RSON[i]为节点i的右儿子的序号
      int B[MAXN]; //B[i]为区间i左端点
      int E[MAXN]; //E[i]为区间i右端点
      int cnt[MAXN]; //cnt[i]为区间i的计数器
      int M[MAXN]; //M[i]为区间i的测度
      int lbd[MAXN]; //lbd[i]为区间i的左端点是否被覆盖
      int rbd[MAXN]; //rbd[i]为区间i的右端点是否被覆盖
      int lines[MAXN]; //lines[i]为区间i的连续线段数
      int root; //树根 初始化时候设为1
      int n; //树的节点数
      SegmentTree(int, int);
      void build(int, int);
      void insert(int, int, int);
      void del(int, int, int);
      void updateM(int); //更新测度
      void updateLines(int); //更新连续线段数
};
SegmentTree::SegmentTree(int a, int b) {
      root = 1;
      n = 0;
      memset(LSON, 0, sizeof(LSON));
      memset(RSON, 0, sizeof(RSON));
      memset(cnt, 0, sizeof(cnt));
      memset(M, 0, sizeof(M));
      memset(lines, 0, sizeof(lines));
      memset(lbd, 0, sizeof(lbd));
      memset(rbd, 0, sizeof(rbd));
      build(a, b);
}
void SegmentTree::build(int a, int b) {
      n += 1;
      int v = n;
      B[v] = a; E[v] = b; 
      if (b - a > 1) {
            LSON[v] = n + 1;
            build(a, (a+b)/2);
            RSON[v] = n + 1;
            build((a+b)/2, b);
      }
}
void SegmentTree::insert(int a, int b, int v) {
      if (!v) return ;
      if (a <= B[v] && E[v] <= b) {
            cnt[v]++;
            lbd[v] = rbd[v] = 1;
      } else if (E[v]-B[v] > 1) {
            if (a <(b[v]+e[v])/2) insert(a, b, LSON[v]);
            if (b > (B[v]+E[v])/2) insert(a, b, RSON[v]);
      }
      updateM(v);
      updateLines(v);
}
void SegmentTree::del(int a, int b, int v) {
      if (!v) return ;
      if (a <= B[v] && E[v] <= b) {
            cnt[v]--;
            if (a == B[v]) lbd[v] = 0;
            if (b == E[v]) rbd[v] = 0;
      } else if (E[v]-B[v] > 1) {
            if (a <(b[v]+e[v])/2) del(a, b, LSON[v]);
            if (b > (B[v]+E[v])/2) del(a, b, RSON[v]);
      }
      updateM(v);
      updateLines(v);
}
void SegmentTree::updateM(int v) {
      if (cnt[v] > 0) M[v] = E[v] - B[v];
      else {
            if (E[v]-B[v] == 1) M[v] = 0;
            else M[v] = M[LSON[v]] + M[RSON[v]];
      }
}
void SegmentTree::updateLines(int v) {
      if (cnt[v] > 0) lbd[v] = rbd[v] = lines[v] = 1;
      else {
            if (E[v]-B[v] == 1) lbd[v] = rbd[v] = lines[v] = 0;
            else {
                  lbd[v] = lbd[LSON[v]]; rbd[v] = rbd[RSON[v]];
                  lines[v] = lines[LSON[v]] + lines[RSON[v]] - rbd[LSON[v]] * lbd[RSON[v]];
            }
      }
}
</pre><img src ="http://www.cppblog.com/qywyh/aggbug/21446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2007-04-07 12:16 <a href="http://www.cppblog.com/qywyh/articles/21446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LIS O(nlogn)</title><link>http://www.cppblog.com/qywyh/articles/21273.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Wed, 04 Apr 2007 15:38:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/21273.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/21273.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/21273.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/21273.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/21273.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee" twffan="done"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done"><span style="COLOR: #0000ff" twffan="done">const</span><span style="COLOR: #000000" twffan="done">&nbsp;</span><span style="COLOR: #0000ff" twffan="done">int</span><span style="COLOR: #000000" twffan="done">&nbsp;MAXN&nbsp;</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">&nbsp;</span><span style="COLOR: #000000" twffan="done">100</span><span style="COLOR: #000000" twffan="done">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top twffan="done"></span><span style="COLOR: #0000ff" twffan="done">int</span><span style="COLOR: #000000" twffan="done">&nbsp;d[MAXN];<br><img id=Codehighlighter1_59_515_Open_Image onclick="this.style.display='none'; Codehighlighter1_59_515_Open_Text.style.display='none'; Codehighlighter1_59_515_Closed_Image.style.display='inline'; Codehighlighter1_59_515_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top twffan="done"><img id=Codehighlighter1_59_515_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_59_515_Closed_Text.style.display='none'; Codehighlighter1_59_515_Open_Image.style.display='inline'; Codehighlighter1_59_515_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top twffan="done"></span><span style="COLOR: #0000ff" twffan="done">int</span><span style="COLOR: #000000" twffan="done">&nbsp;LIS(</span><span style="COLOR: #0000ff" twffan="done">int</span><span style="COLOR: #000000" twffan="done">&nbsp;</span><span style="COLOR: #000000" twffan="done">*</span><span style="COLOR: #000000" twffan="done">a,&nbsp;</span><span style="COLOR: #0000ff" twffan="done">int</span><span style="COLOR: #000000" twffan="done">&nbsp;n)&nbsp;</span><span id=Codehighlighter1_59_515_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff" twffan="done"><img src="http://www.cppblog.com/Images/dot.gif" twffan="done"></span><span id=Codehighlighter1_59_515_Open_Text twffan="done"><span style="COLOR: #000000" twffan="done">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff" twffan="done">int</span><span style="COLOR: #000000" twffan="done">&nbsp;i,&nbsp;l,&nbsp;r,&nbsp;m,&nbsp;len;<br><img id=Codehighlighter1_105_500_Open_Image onclick="this.style.display='none'; Codehighlighter1_105_500_Open_Text.style.display='none'; Codehighlighter1_105_500_Closed_Image.style.display='inline'; Codehighlighter1_105_500_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top twffan="done"><img id=Codehighlighter1_105_500_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_105_500_Closed_Text.style.display='none'; Codehighlighter1_105_500_Open_Image.style.display='inline'; Codehighlighter1_105_500_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff" twffan="done">for</span><span style="COLOR: #000000" twffan="done">&nbsp;(i</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">1</span><span style="COLOR: #000000" twffan="done">;&nbsp;i</span><span style="COLOR: #000000" twffan="done">&lt;=</span><span style="COLOR: #000000" twffan="done">n;&nbsp;i</span><span style="COLOR: #000000" twffan="done">++</span><span style="COLOR: #000000" twffan="done">)&nbsp;</span><span id=Codehighlighter1_105_500_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff" twffan="done"><img src="http://www.cppblog.com/Images/dot.gif" twffan="done"></span><span id=Codehighlighter1_105_500_Open_Text twffan="done"><span style="COLOR: #000000" twffan="done">{<br><img id=Codehighlighter1_129_206_Open_Image onclick="this.style.display='none'; Codehighlighter1_129_206_Open_Text.style.display='none'; Codehighlighter1_129_206_Closed_Image.style.display='inline'; Codehighlighter1_129_206_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top twffan="done"><img id=Codehighlighter1_129_206_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_129_206_Closed_Text.style.display='none'; Codehighlighter1_129_206_Open_Image.style.display='inline'; Codehighlighter1_129_206_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff" twffan="done">if</span><span style="COLOR: #000000" twffan="done">&nbsp;(a[i]&nbsp;</span><span style="COLOR: #000000" twffan="done">&gt;=</span><span style="COLOR: #000000" twffan="done">&nbsp;d[len])&nbsp;</span><span id=Codehighlighter1_129_206_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff" twffan="done"><img src="http://www.cppblog.com/Images/dot.gif" twffan="done"></span><span id=Codehighlighter1_129_206_Open_Text twffan="done"><span style="COLOR: #000000" twffan="done">{&nbsp;</span><span style="COLOR: #008000" twffan="done">//</span><span style="COLOR: #008000" twffan="done">单调上升&nbsp;a[i]&nbsp;&gt;&nbsp;d[len]</span><span style="COLOR: #008000" twffan="done"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done"></span><span style="COLOR: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;</span><span style="COLOR: #000000" twffan="done">+=</span><span style="COLOR: #000000" twffan="done">&nbsp;</span><span style="COLOR: #000000" twffan="done">1</span><span style="COLOR: #000000" twffan="done">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[len]&nbsp;</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">&nbsp;a[i];<br><img id=Codehighlighter1_213_493_Open_Image onclick="this.style.display='none'; Codehighlighter1_213_493_Open_Text.style.display='none'; Codehighlighter1_213_493_Closed_Image.style.display='inline'; Codehighlighter1_213_493_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top twffan="done"><img id=Codehighlighter1_213_493_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_213_493_Closed_Text.style.display='none'; Codehighlighter1_213_493_Open_Image.style.display='inline'; Codehighlighter1_213_493_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000" twffan="done">&nbsp;</span><span style="COLOR: #0000ff" twffan="done">else</span><span style="COLOR: #000000" twffan="done">&nbsp;</span><span id=Codehighlighter1_213_493_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff" twffan="done"><img src="http://www.cppblog.com/Images/dot.gif" twffan="done"></span><span id=Codehighlighter1_213_493_Open_Text twffan="done"><span style="COLOR: #000000" twffan="done">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">&nbsp;</span><span style="COLOR: #000000" twffan="done">1</span><span style="COLOR: #000000" twffan="done">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">&nbsp;len;<br><img id=Codehighlighter1_286_410_Open_Image onclick="this.style.display='none'; Codehighlighter1_286_410_Open_Text.style.display='none'; Codehighlighter1_286_410_Closed_Image.style.display='inline'; Codehighlighter1_286_410_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top twffan="done"><img id=Codehighlighter1_286_410_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_286_410_Closed_Text.style.display='none'; Codehighlighter1_286_410_Open_Image.style.display='inline'; Codehighlighter1_286_410_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff" twffan="done">while</span><span style="COLOR: #000000" twffan="done">&nbsp;&nbsp;(l&nbsp;</span><span style="COLOR: #000000" twffan="done">&lt;</span><span style="COLOR: #000000" twffan="done">&nbsp;r&nbsp;</span><span style="COLOR: #000000" twffan="done">-</span><span style="COLOR: #000000" twffan="done">&nbsp;</span><span style="COLOR: #000000" twffan="done">1</span><span style="COLOR: #000000" twffan="done">)&nbsp;</span><span id=Codehighlighter1_286_410_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff" twffan="done"><img src="http://www.cppblog.com/Images/dot.gif" twffan="done"></span><span id=Codehighlighter1_286_410_Open_Text twffan="done"><span style="COLOR: #000000" twffan="done">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">&nbsp;(l&nbsp;</span><span style="COLOR: #000000" twffan="done">+</span><span style="COLOR: #000000" twffan="done">&nbsp;r)&nbsp;</span><span style="COLOR: #000000" twffan="done">/</span><span style="COLOR: #000000" twffan="done">&nbsp;</span><span style="COLOR: #000000" twffan="done">2</span><span style="COLOR: #000000" twffan="done">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff" twffan="done">if</span><span style="COLOR: #000000" twffan="done">&nbsp;&nbsp;(d[m]&nbsp;</span><span style="COLOR: #000000" twffan="done">&lt;=</span><span style="COLOR: #000000" twffan="done">&nbsp;a[i])&nbsp;l&nbsp;</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">&nbsp;m;&nbsp;</span><span style="COLOR: #008000" twffan="done">//</span><span style="COLOR: #008000" twffan="done">单调上升&nbsp;d[m]&nbsp;&lt;&nbsp;a[i]</span><span style="COLOR: #008000" twffan="done"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done"></span><span style="COLOR: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff" twffan="done">else</span><span style="COLOR: #000000" twffan="done">&nbsp;r&nbsp;</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">&nbsp;m;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000" twffan="done">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff" twffan="done">if</span><span style="COLOR: #000000" twffan="done">&nbsp;(d[l]&nbsp;</span><span style="COLOR: #000000" twffan="done">&gt;</span><span style="COLOR: #000000" twffan="done">&nbsp;a[i])&nbsp;d[l]&nbsp;</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">&nbsp;a[i];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff" twffan="done">else</span><span style="COLOR: #000000" twffan="done">&nbsp;d[r]&nbsp;</span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done">&nbsp;a[i];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000" twffan="done">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000" twffan="done"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff" twffan="done">return</span><span style="COLOR: #000000" twffan="done">&nbsp;len;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top twffan="done">}</span></span></div>
<img src ="http://www.cppblog.com/qywyh/aggbug/21273.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2007-04-04 23:38 <a href="http://www.cppblog.com/qywyh/articles/21273.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>凸包...</title><link>http://www.cppblog.com/qywyh/articles/20550.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Sat, 24 Mar 2007 18:43:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/20550.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/20550.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/20550.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/20550.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/20550.html</trackback:ping><description><![CDATA[
		<p>用差积做极角排序，减少浮点误差<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<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 />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">algorithm</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">using</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">namespace</span>
				<span style="COLOR: #000000"> std;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />typedef </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> XYType;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_97_113_Open_Image" onclick="this.style.display='none'; Codehighlighter1_97_113_Open_Text.style.display='none'; Codehighlighter1_97_113_Closed_Image.style.display='inline'; Codehighlighter1_97_113_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_97_113_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_97_113_Closed_Text.style.display='none'; Codehighlighter1_97_113_Open_Image.style.display='inline'; Codehighlighter1_97_113_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span style="COLOR: #0000ff">struct</span>
				<span style="COLOR: #000000"> POINT </span>
				<span id="Codehighlighter1_97_113_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_97_113_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    XYType x, y;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000"> ps;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_163_262_Open_Image" onclick="this.style.display='none'; Codehighlighter1_163_262_Open_Text.style.display='none'; Codehighlighter1_163_262_Closed_Image.style.display='inline'; Codehighlighter1_163_262_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_163_262_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_163_262_Closed_Text.style.display='none'; Codehighlighter1_163_262_Open_Image.style.display='inline'; Codehighlighter1_163_262_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />XYType cross(POINT p1, POINT p2, POINT p0) </span>
				<span id="Codehighlighter1_163_262_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_163_262_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">求矢量[p0,p1],[p0,p2]的差积;</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> (p1.x </span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000"> p0.x) </span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> (p2.y </span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000"> p0.y) </span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000"> (p2.x </span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000"> p0.x) </span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> (p1.y </span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000"> p0.y);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img id="Codehighlighter1_293_591_Open_Image" onclick="this.style.display='none'; Codehighlighter1_293_591_Open_Text.style.display='none'; Codehighlighter1_293_591_Closed_Image.style.display='inline'; Codehighlighter1_293_591_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_293_591_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_293_591_Closed_Text.style.display='none'; Codehighlighter1_293_591_Open_Image.style.display='inline'; Codehighlighter1_293_591_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> cmp(POINT p1, POINT p2) </span>
				<span id="Codehighlighter1_293_591_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_293_591_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">以ps为中心的极角排序</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">    XYType ax, ay, bx, by;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    ax </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> p1.x </span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000"> ps.x; ay </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> p1.y </span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000"> ps.y;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    bx </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> p2.x </span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000"> ps.x; by </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> p2.y </span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000"> ps.y;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> (ay </span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> by </span>
						<span style="COLOR: #000000">&lt;=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> by </span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000"> ay </span>
						<span style="COLOR: #000000">||</span>
						<span style="COLOR: #000000"> (by </span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000"> ay </span>
						<span style="COLOR: #000000">&amp;&amp;</span>
						<span style="COLOR: #000000"> bx </span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000"> ax);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    XYType ret </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> cross(p1, p2, ps);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> (ret </span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> (ret </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">return</span>
						<span style="COLOR: #000000"> bx </span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000"> ax;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> (ret </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_606_1454_Open_Image" onclick="this.style.display='none'; Codehighlighter1_606_1454_Open_Text.style.display='none'; Codehighlighter1_606_1454_Closed_Image.style.display='inline'; Codehighlighter1_606_1454_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_606_1454_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_606_1454_Closed_Text.style.display='none'; Codehighlighter1_606_1454_Open_Image.style.display='inline'; Codehighlighter1_606_1454_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> main() </span>
				<span id="Codehighlighter1_606_1454_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_606_1454_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    freopen(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">test.txt</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 /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    POINT arrP[</span>
						<span style="COLOR: #000000">100</span>
						<span style="COLOR: #000000">];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> n </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">, i, beg;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> stack[</span>
						<span style="COLOR: #000000">100</span>
						<span style="COLOR: #000000">], top;    <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">while</span>
						<span style="COLOR: #000000"> (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">arrP[n].x, </span>
						<span style="COLOR: #000000">&amp;</span>
						<span style="COLOR: #000000">arrP[n].y) </span>
						<span style="COLOR: #000000">!=</span>
						<span style="COLOR: #000000"> EOF) n</span>
						<span style="COLOR: #000000">++</span>
						<span style="COLOR: #000000">;<br /><img id="Codehighlighter1_783_896_Open_Image" onclick="this.style.display='none'; Codehighlighter1_783_896_Open_Text.style.display='none'; Codehighlighter1_783_896_Closed_Image.style.display='inline'; Codehighlighter1_783_896_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_783_896_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_783_896_Closed_Text.style.display='none'; Codehighlighter1_783_896_Open_Image.style.display='inline'; Codehighlighter1_783_896_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">for</span>
						<span style="COLOR: #000000"> (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">) </span>
						<span id="Codehighlighter1_783_896_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_783_896_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (arrP[i].y </span>
								<span style="COLOR: #000000">&lt;</span>
								<span style="COLOR: #000000"> arrP[</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">].y </span>
								<span style="COLOR: #000000">||</span>
								<span style="COLOR: #000000"> (arrP[i].y </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> arrP[</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">].y </span>
								<span style="COLOR: #000000">&amp;&amp;</span>
								<span style="COLOR: #000000"> arrP[i].x </span>
								<span style="COLOR: #000000">&lt;</span>
								<span style="COLOR: #000000"> arrP[</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">].x)) <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            swap(arrP[</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">], arrP[i]);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    ps.x </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> arrP[</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">].x; ps.y </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> arrP[</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">].y;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    sort(arrP</span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">, arrP</span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000">n, cmp);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">for</span>
						<span style="COLOR: #000000"> (i</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">; i</span>
						<span style="COLOR: #000000">&lt;=</span>
						<span style="COLOR: #000000">2</span>
						<span style="COLOR: #000000">; i</span>
						<span style="COLOR: #000000">++</span>
						<span style="COLOR: #000000">) stack[i] </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> i;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    top </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">2</span>
						<span style="COLOR: #000000">;<br /><img id="Codehighlighter1_1030_1136_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1030_1136_Open_Text.style.display='none'; Codehighlighter1_1030_1136_Closed_Image.style.display='inline'; Codehighlighter1_1030_1136_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1030_1136_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1030_1136_Closed_Text.style.display='none'; Codehighlighter1_1030_1136_Open_Image.style.display='inline'; Codehighlighter1_1030_1136_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">for</span>
						<span style="COLOR: #000000"> (i</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">3</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">) </span>
						<span id="Codehighlighter1_1030_1136_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_1030_1136_Open_Text">
								<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_1099_1113_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1099_1113_Open_Text.style.display='none'; Codehighlighter1_1099_1113_Closed_Image.style.display='inline'; Codehighlighter1_1099_1113_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1099_1113_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1099_1113_Closed_Text.style.display='none'; Codehighlighter1_1099_1113_Open_Image.style.display='inline'; Codehighlighter1_1099_1113_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">while</span>
								<span style="COLOR: #000000"> (cross(arrP[stack[top]], arrP[i], arrP[stack[top</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">]]) </span>
								<span style="COLOR: #000000">&lt;</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">) </span>
								<span id="Codehighlighter1_1099_1113_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.cppblog.com/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_1099_1113_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            top</span>
										<span style="COLOR: #000000">--</span>
										<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        stack[</span>
								<span style="COLOR: #000000">++</span>
								<span style="COLOR: #000000">top] </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> i;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img id="Codehighlighter1_1162_1309_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1162_1309_Open_Text.style.display='none'; Codehighlighter1_1162_1309_Closed_Image.style.display='inline'; Codehighlighter1_1162_1309_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_1162_1309_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1162_1309_Closed_Text.style.display='none'; Codehighlighter1_1162_1309_Open_Image.style.display='inline'; Codehighlighter1_1162_1309_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">for</span>
						<span style="COLOR: #000000"> (i</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">; i</span>
						<span style="COLOR: #000000">&lt;=</span>
						<span style="COLOR: #000000">top; i</span>
						<span style="COLOR: #000000">++</span>
						<span style="COLOR: #000000">) </span>
						<span id="Codehighlighter1_1162_1309_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_1162_1309_Open_Text">
								<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_1218_1244_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1218_1244_Open_Text.style.display='none'; Codehighlighter1_1218_1244_Closed_Image.style.display='inline'; Codehighlighter1_1218_1244_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1218_1244_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1218_1244_Closed_Text.style.display='none'; Codehighlighter1_1218_1244_Open_Image.style.display='inline'; Codehighlighter1_1218_1244_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (arrP[stack[i]].x </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: #000000">&amp;&amp;</span>
								<span style="COLOR: #000000"> arrP[stack[i]].y </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">) </span>
								<span id="Codehighlighter1_1218_1244_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.cppblog.com/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_1218_1244_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            beg </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> i;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
										<span style="COLOR: #0000ff">break</span>
										<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">printf("(%d,%d)\n", arrP[stack[i]].x, arrP[stack[i]].y);</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />
								</span>
								<span style="COLOR: #000000">    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img id="Codehighlighter1_1341_1441_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1341_1441_Open_Text.style.display='none'; Codehighlighter1_1341_1441_Closed_Image.style.display='inline'; Codehighlighter1_1341_1441_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_1341_1441_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1341_1441_Closed_Text.style.display='none'; Codehighlighter1_1341_1441_Open_Image.style.display='inline'; Codehighlighter1_1341_1441_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">for</span>
						<span style="COLOR: #000000"> (i</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">beg; i</span>
						<span style="COLOR: #000000">&lt;=</span>
						<span style="COLOR: #000000">top</span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000">beg; i</span>
						<span style="COLOR: #000000">++</span>
						<span style="COLOR: #000000">) </span>
						<span id="Codehighlighter1_1341_1441_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_1341_1441_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000"> k </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> i </span>
								<span style="COLOR: #000000">&gt;</span>
								<span style="COLOR: #000000"> top </span>
								<span style="COLOR: #000000">?</span>
								<span style="COLOR: #000000"> i </span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000"> top </span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000"> : i;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        printf(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">(%d,%d)\n</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">, arrP[stack[k]].x, arrP[stack[k]].y);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
<img src ="http://www.cppblog.com/qywyh/aggbug/20550.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2007-03-25 02:43 <a href="http://www.cppblog.com/qywyh/articles/20550.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MinHeap</title><link>http://www.cppblog.com/qywyh/articles/19936.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Thu, 15 Mar 2007 16:44:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/19936.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/19936.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/19936.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/19936.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/19936.html</trackback:ping><description><![CDATA[
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<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 />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">algorithm</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />using namespace std;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">const</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> MAXN </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">10000</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />class MinHeap {<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    MinHeap();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    MinHeap(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    void swim(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    void sink(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    void insert(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    void build();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    void decreaseKey(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> , </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> delMin();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> getMin();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    void heapSort(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000">:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> a[MAXN];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> hSize;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">arr;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />};<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />MinHeap::MinHeap() {<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    hSize </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />MinHeap::MinHeap(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">b, </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> bLen) {<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    hSize </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> bLen;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    arr </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> b;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">for</span>
				<span style="COLOR: #000000"> (</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> i</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">; i</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">bLen; i</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">] </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> b[i];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    build();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />void MinHeap::swim(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> p) {<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> q </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> p </span>
				<span style="COLOR: #000000">&gt;&gt;</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">, t </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> a[p];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">while</span>
				<span style="COLOR: #000000"> (q !</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">) {<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> (t </span>
				<span style="COLOR: #000000">&gt;=</span>
				<span style="COLOR: #000000"> a[q]) break;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        a[p] </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> a[p];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        p </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> q;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        q </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> p </span>
				<span style="COLOR: #000000">&gt;&gt;</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    }<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    a[p] </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> t;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />void MinHeap::sink(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> p) {<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> q </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> p </span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">, t </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> a[p];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">while</span>
				<span style="COLOR: #000000"> (q </span>
				<span style="COLOR: #000000">&lt;=</span>
				<span style="COLOR: #000000"> hSize) {<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> (q </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000"> hSize </span>
				<span style="COLOR: #000000">&amp;&amp;</span>
				<span style="COLOR: #000000"> a[q] </span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> a[q</span>
				<span style="COLOR: #000000">+</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">]) q</span>
				<span style="COLOR: #000000">++</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> (a[q] </span>
				<span style="COLOR: #000000">&gt;=</span>
				<span style="COLOR: #000000"> t) break;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        a[p] </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> a[q];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        p </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> q;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        q </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> p </span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    }<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    a[p] </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> t;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> MinHeap::delMin() {<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> ret </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> a[</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    a[</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">] </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> a[hSize</span>
				<span style="COLOR: #000000">--</span>
				<span style="COLOR: #000000">];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    sink(</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    return ret;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />void MinHeap::insert(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> key) {<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    a[hSize</span>
				<span style="COLOR: #000000">++</span>
				<span style="COLOR: #000000">] </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> key;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    swim(hSize);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />void MinHeap::decreaseKey(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> p, </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> t) {<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    a[p] </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> t;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    swim(p);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />void MinHeap::build() {<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">for</span>
				<span style="COLOR: #000000"> (</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> i</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">hSize</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000">; i</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">; i</span>
				<span style="COLOR: #000000">--</span>
				<span style="COLOR: #000000">) sink(i);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> MinHeap::getMin() {<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    return a[</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />void MinHeap::heapSort(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">b, </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> bLen) {<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    hSize </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> bLen;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">for</span>
				<span style="COLOR: #000000"> (</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> i</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">; i</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">bLen; i</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">] </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> b[i];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    build();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> i, k </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">while</span>
				<span style="COLOR: #000000"> (hSize </span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">) {<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        b[k</span>
				<span style="COLOR: #000000">++</span>
				<span style="COLOR: #000000">] </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> a[</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        a[</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">] </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> a[hSize</span>
				<span style="COLOR: #000000">--</span>
				<span style="COLOR: #000000">];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        sink(</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    }<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">for</span>
				<span style="COLOR: #000000"> (i</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">; i</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">bLen; i</span>
				<span style="COLOR: #000000">++</span>
				<span style="COLOR: #000000">) cout </span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000"> b[i] </span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #008000">'</span>
				<span style="COLOR: #008000"> ';</span>
				<span style="COLOR: #008000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">}<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> main() {<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> b[] </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> {</span>
				<span style="COLOR: #000000">5</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">4</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">3</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">9</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">8</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">7</span>
				<span style="COLOR: #000000">};<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    MinHeap h;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    h.heapSort(b, sizeof(b)</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">sizeof(b[</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">]));<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    system(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">pause</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    return </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}</span>
		</div>
<img src ="http://www.cppblog.com/qywyh/aggbug/19936.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2007-03-16 00:44 <a href="http://www.cppblog.com/qywyh/articles/19936.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>树状数组</title><link>http://www.cppblog.com/qywyh/articles/19095.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Thu, 01 Mar 2007 14:02:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/19095.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/19095.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/19095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/19095.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/19095.html</trackback:ping><description><![CDATA[那么,何为树形数组呢?? <br />下图中的C数组就是树状数组,a数组是原数组; <br /><img src="" align="left" border="0" twffan="done" /><br />可以发现这些规律: <br />C1=a1 <br />C2=a1+a2 <br />C3=a3 <br />C4=a1+a2+a3+a4 <br />C5=a5 <br />…… <br />C8=a1+a2+a3+a4+a5+a6+a7+a8 <br />…… <br />C2^n=a1+a2+….+a2^n <br /><br />对于序列a，我们设一个数组C定义C[t] = a[t – 2^k + 1] + … + a[t]，k为t在二进制下末尾0的个数。 <br />K的计算可以这样: <br />2^k=t and (t xor (t-1)) <br />以6为例 <br />               (6)10=(0110)2 <br />xor    6-1=(5)10=(0101)2 <br />                        (0011)2 <br />and          (6)10=(0110)2 <br />                        (0010)2 <br /><br />所以问题变的很简单,重要写几个函数就可以了; <br />求2^k的函数代码如下: <br /><table style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellspacing="0" cellpadding="10" width="90%"><tbody><tr><td bgcolor="#eeeeee"><font face="Courier New"><br />int Lowbit(int t) <br />{ <br />    return t &amp; ( t ^ ( t - 1 ) ); <br />} <br /></font></td></tr></tbody></table><br /><br />求1 -- end和的函数代码如下: <br /><table style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellspacing="0" cellpadding="10" width="90%"><tbody><tr><td bgcolor="#eeeeee"><font face="Courier New"><br />int Sum(int end) <br />{ <br />    int sum = 0; <br />    while(end &gt; 0) <br />    { <br />        sum += in[end]; <br />        end -= Lowbit(end); <br />    } <br />    return sum; <br />} <br /></font></td></tr></tbody></table><br /><br />对某位进行操作函数如下(以加法为例) <br /><table style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 10px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" cellspacing="0" cellpadding="10" width="90%"><tbody><tr><td bgcolor="#eeeeee"><font face="Courier New"><br />void plus(int pos , int num) <br />{ <br />    while(pos &lt;= n) <br />    { <br />          in[pos] += num; <br />          pos += Lowbit(pos); <br />    } <br />} <br /></font></td></tr></tbody></table><br /><br />有了这三个函数整个树形数组也就基本构建成功啦!! <br />对于刚才的一题,每次修改与询问都是对C数组做处理.空间复杂度有3N降为N,时间效率也有所提高.编程复杂度更是降了不少. <br /><br /><br />下面是用树状数组做的 pku star<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><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 /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> std;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> N </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">32100</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c[N];</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">树状数组</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_99_128_Open_Image" onclick="this.style.display='none'; Codehighlighter1_99_128_Open_Text.style.display='none'; Codehighlighter1_99_128_Closed_Image.style.display='inline'; Codehighlighter1_99_128_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_99_128_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_99_128_Closed_Text.style.display='none'; Codehighlighter1_99_128_Open_Image.style.display='inline'; Codehighlighter1_99_128_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> lowBit(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x) </span><span id="Codehighlighter1_99_128_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_99_128_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</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"> (x </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">));<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_154_222_Open_Image" onclick="this.style.display='none'; Codehighlighter1_154_222_Open_Text.style.display='none'; Codehighlighter1_154_222_Closed_Image.style.display='inline'; Codehighlighter1_154_222_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_154_222_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_154_222_Closed_Text.style.display='none'; Codehighlighter1_154_222_Open_Image.style.display='inline'; Codehighlighter1_154_222_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> add(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> k) </span><span id="Codehighlighter1_154_222_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_154_222_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">a[x] += k</span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_186_220_Open_Image" onclick="this.style.display='none'; Codehighlighter1_186_220_Open_Text.style.display='none'; Codehighlighter1_186_220_Closed_Image.style.display='inline'; Codehighlighter1_186_220_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_186_220_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_186_220_Closed_Text.style.display='none'; Codehighlighter1_186_220_Open_Image.style.display='inline'; Codehighlighter1_186_220_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (x </span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000"> N) </span><span id="Codehighlighter1_186_220_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_186_220_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        c[x] </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> k;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        x </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> lowBit(x);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_248_315_Open_Image" onclick="this.style.display='none'; Codehighlighter1_248_315_Open_Text.style.display='none'; Codehighlighter1_248_315_Closed_Image.style.display='inline'; Codehighlighter1_248_315_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_248_315_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_248_315_Closed_Text.style.display='none'; Codehighlighter1_248_315_Open_Image.style.display='inline'; Codehighlighter1_248_315_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> sub(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> k) </span><span id="Codehighlighter1_248_315_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_248_315_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">a[x] -= k</span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_279_313_Open_Image" onclick="this.style.display='none'; Codehighlighter1_279_313_Open_Text.style.display='none'; Codehighlighter1_279_313_Closed_Image.style.display='inline'; Codehighlighter1_279_313_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_279_313_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_279_313_Closed_Text.style.display='none'; Codehighlighter1_279_313_Open_Image.style.display='inline'; Codehighlighter1_279_313_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (x </span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000"> N) </span><span id="Codehighlighter1_279_313_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_279_313_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        c[x] </span><span style="COLOR: #000000">-=</span><span style="COLOR: #000000"> k;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        x </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> lowBit(x);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_333_436_Open_Image" onclick="this.style.display='none'; Codehighlighter1_333_436_Open_Text.style.display='none'; Codehighlighter1_333_436_Closed_Image.style.display='inline'; Codehighlighter1_333_436_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_333_436_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_333_436_Closed_Text.style.display='none'; Codehighlighter1_333_436_Open_Image.style.display='inline'; Codehighlighter1_333_436_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> sum(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x) </span><span id="Codehighlighter1_333_436_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_333_436_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">return sum(1..x);</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> ret </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img id="Codehighlighter1_385_421_Open_Image" onclick="this.style.display='none'; Codehighlighter1_385_421_Open_Text.style.display='none'; Codehighlighter1_385_421_Closed_Image.style.display='inline'; Codehighlighter1_385_421_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_385_421_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_385_421_Closed_Text.style.display='none'; Codehighlighter1_385_421_Open_Image.style.display='inline'; Codehighlighter1_385_421_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (x </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_385_421_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_385_421_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        ret </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> c[x];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        x </span><span style="COLOR: #000000">-=</span><span style="COLOR: #000000"> lowBit(x);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> ret;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">[N];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> f[N];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_473_726_Open_Image" onclick="this.style.display='none'; Codehighlighter1_473_726_Open_Text.style.display='none'; Codehighlighter1_473_726_Closed_Image.style.display='inline'; Codehighlighter1_473_726_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_473_726_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_473_726_Closed_Text.style.display='none'; Codehighlighter1_473_726_Open_Image.style.display='inline'; Codehighlighter1_473_726_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main() </span><span id="Codehighlighter1_473_726_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_473_726_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">pku2352</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i, j, k, x, y;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> n;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    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 /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_556_639_Open_Image" onclick="this.style.display='none'; Codehighlighter1_556_639_Open_Text.style.display='none'; Codehighlighter1_556_639_Closed_Image.style.display='inline'; Codehighlighter1_556_639_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_556_639_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_556_639_Closed_Text.style.display='none'; Codehighlighter1_556_639_Open_Image.style.display='inline'; Codehighlighter1_556_639_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</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">) </span><span id="Codehighlighter1_556_639_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_556_639_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        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">x, </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">y);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        x</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        add(x,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">[sum(x</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> f[x]]</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        f[x]</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_663_693_Open_Image" onclick="this.style.display='none'; Codehighlighter1_663_693_Open_Text.style.display='none'; Codehighlighter1_663_693_Closed_Image.style.display='inline'; Codehighlighter1_663_693_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_663_693_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_663_693_Closed_Text.style.display='none'; Codehighlighter1_663_693_Open_Image.style.display='inline'; Codehighlighter1_663_693_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</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">) </span><span id="Codehighlighter1_663_693_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_663_693_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">[i]);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    system(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">pause</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br /><img src ="http://www.cppblog.com/qywyh/aggbug/19095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2007-03-01 22:02 <a href="http://www.cppblog.com/qywyh/articles/19095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转贴] 快速计算某个日期是星期几的经验公式</title><link>http://www.cppblog.com/qywyh/articles/14021.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Sun, 22 Oct 2006 15:30:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/14021.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/14021.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/14021.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/14021.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/14021.html</trackback:ping><description><![CDATA[
		<p>
				<br />巧算星期几</p>
		<p>基姆。拉尔森</p>
		<p>基姆拥有计算机学科的博士学位。他对数据库，算法和数据结构有着浓厚的兴趣。他的联系地址是            （原文为丹麦文－－译者注） 31，DK－5270，Odense N,Denmark,或发 E-mail 至 :kslarsen@imada.ou.dk。</p>
		<p>简介</p>
		<p>布鲁斯 施耐尔</p>
		<p> </p>
		<p>“四，六，九，十一，三十天就齐……”儿歌是这么唱的；或许你也曾经掰着手指头翻来覆去地数，让赶上单数的指头代表只有30天的短月吧？这样的口诀对我们是很管用的（我就是念叨着这首傻乎乎的儿歌长大的），可是电脑就没有这份“灵感”了。当然，我们可以用一大堆IF－THEN－ELSES的语句或几个CASE来编写计算程序，让它计算某个指定日期是星期几。</p>
		<p> </p>
		<p>不过我更喜欢基姆拉尔森在本月的“算法小径”中为我们带来的新技巧，因为他的方法另辟蹊径，从一个全新的方向着手解决日期计算的问题。其实，并没有什么数学公式能算出某个指定日期是星期几，不过我们可以试着拼凑一个，如果我们的尝试成功了，你就能拥有一个易于编程的数学公式，并能用它自动计算哪天是星期几了。</p>
		<p> </p>
		<p>顺便说一句，如果你已经设计出更巧妙的算法，或是在已有的方法上有了新突破的话，不妨告诉我，我一定洗耳恭听。我的联系方法是<a href="mailto:schneier@chinet.com">schneier@chinet.com</a>，或者在DJJ编辑部给我留张便条就行。</p>
		<p> </p>
		<p>你有没有疑惑过你的电脑怎么就知道今天是星期三呢？就算你的电脑关机了，你重启后设定了新日期，它也能立即知道这天是星期几。</p>
		<p> </p>
		<p>在你还是个孩子的时候，你可能见过一种纪录记录着年，月，日的表格，只要加上几个数字，和它相连的另一张表格就会告诉你这个日期是星期几。当然，计算机硬盘的操作系统里也可以加入这样的计算表。不过有一种简单的方法可以轻松地算出某天是星期几；而且这个方法只占用很少的内存空间，而那些只能推算几百年的表格可就太占地方了。</p>
		<p> </p>
		<p>如果目前你的电脑还不具备推算与日期对应的星期数的功能，现在就不妨在自己的程序中试试下面的公式。</p>
		<p> </p>
		<p> </p>
		<p>创建公式</p>
		<p> </p>
		<p>首先，我们要用变量D，M和Y来表示日期。比如，1994年3月1日就用“D＝1，M＝3，Y＝4”记录。我们的目标是让计算结果在0到6之间。0代表星期一，1代表星期二，2代表星期三，依此类推。</p>
		<p> </p>
		<p>1994年3月1日是个星期二，那么“D mod 7(日期变量除以7的余数）)))”这个公式对于整个三月份都有效。比如3月18日是星期五，18 mod 7＝4；而4正代表星期五。别忘了，整数的除法和求模有着密切的关系。比方说，26除以7商3余5，这就是说，26除以7商数取整等于3，而26除以7求模（简写为26 mod 7）等于5。以上这些意味着19 mod 7=12 mod 7= 5 mod 7=5。在运算规则中，负数求模运算法相似，所以依此类推，-2 mod 7=5, -9 mod 7=5。</p>
		<p> </p>
		<p>在更正式的表达法中，统一用任意整数n和k表达上述关系，那么这个过程可以表达为n=qk+r，这里的q和r的取值范围同样是整数和0。表1中列出了所有月份的变换数据（shift information此处试译为“档级数据”，还请进一步校对－－译者注）。为了尽可能地得出规律，二月被排在最后，同理，一月也是如此。</p>
		<p> </p>
		<p>例1（a）中的公式是仿照表1中的变换数据栏所描述的模式而创建的。这个公式中的除法一律是商数取整。所以得数是最接近真正商数的整数。表2得出了此功能得出的有趣的数值。凭直觉，我们不难发现，当M(代表月份的变量)的值以1为单位递增时，2M就成倍增长，而3(M+1)/5就以3/5为增长倍数。</p>
		<p> </p>
		<p>这正是我们仿制3,2,3,2,3这个重复格式所需要的（表中右边的弯括号表明了这一点）。请注意，我们在以7为除数求模，那么从6到2的求模结果就会逐个增加3（顺序是6,0,1,2）。</p>
		<p> </p>
		<p>现在，我们发现了适用于逐月向下推算的校正方法，并希望把它加入刚才的尝试中，就是那个mod7公式。还以1994年3月1日为例，这个日期的M＝3。请注意，在例1（b）中，8 mod 7＝1，所以当整个公式合并时，必须减去1。在做以7为除数求模的运算时，减1和加6是一样的，因为-1 mod 7=6 mod 7=6。</p>
		<p> </p>
		<p>这样，例1（c）中的公式就可以计算这一年中剩下的月份了。其实，既然我们把一月和二月排在表1的最后，那么只要我们把它们看成是十三月和十四月，就能接着推算1995年的前两个月了。这是因为，虽然它们并不是一个完整的3,2,3,2,3结构，但恰好可以是这个结构的开始，为了使这个公式更完善，我们还是最好把一月和二月看成是上一年的十三月和十四月。</p>
		<p> </p>
		<p> </p>
		<p>加入年份</p>
		<p> </p>
		<p>顺着年份向下找，我们观察到1995年3月1日是星期三。这说明，每增加一年，我们公式的计算结果就会增加1。这太简单了，我们只要简单地把年份加上去就行了。再提醒你一次，我们必须确保出发点是正确的。由于1994 mod 7=6，我们在把Y加入已有的公式时就必须减去6。由此改进的例2(a)就更完善了。</p>
		<p> </p>
		<p>1996年是个闰年，这带来了我们的下一个问题。这一年的3月1日是星期五，而不是刚才的公式推算出的星期四。所以每当我们碰上闰年时还得多加上1。判断闰年的规则是，能被4整除，并能被100和400同时整除的年份就是闰年。就这样，我们在原有的基础上添加Y/4--Y/100+Y/400。再强调一下，我们必须从一开始就确保正确。既然(1994/4--1994/100+1994/400) mod 7=(498--19+4) mod 7=483 mod 7=0,所以就不用再做任何调整了。这样，例2(b)就是我们最终的成果了。这个公式能一直工作下去，除非改变现行的日历系统。作为示例，让我们试着推算一下2000年7月4日：(4+2*3+(7+1)/5+2000+2000/4--2000/100+2000/400) mod 7= (4+14+2000+500--20+5) mod 7=2507 mod 7=1，所以那一天是星期二。</p>
		<p> </p>
		<p>这个公式还能推算过去的日期；然而计算范围有限，让我们看看1752年9月14号这个星期四吧，我们的公式最远只能推算到这里了。不过像“1963年11月22日你在哪里”这样的日常问题中提到的日期还是可以轻松应对的：(22+2*11+3(11+1)/5+1963+1963/4--1963/100+1963/400) mod 7=(22+22+7+1963+490--19+4) mod 7=2489 mod 7=4。那天就是星期五。</p>
		<p> </p>
		<p>例3例子3是一个C语言程序，按照把这个公式自动推算给定日期是星期几。</p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p>表1：每月变换数据</p>
		<p>月份         天数         变换</p>
		<p>三月          31            3</p>
		<p>四月          30            2</p>
		<p>五月          31            3</p>
		<p>六月          30            2</p>
		<p>七月          31            3</p>
		<p>八月          31            3</p>
		<p>九月          30            2</p>
		<p>十月          31            3</p>
		<p>十一月        30            2</p>
		<p>十二月        31            3</p>
		<p>一月          31            3</p>
		<p>二月          28            3</p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p>表2：仿制变换数据形式的功能。例1中建立的公式可以适用于1994年。例2把这个公式的功能扩展到可以应用在不同的年份进行推算。</p>
		<p> </p>
		<p>例3：用C语言程序表达上述公式</p>
		<p>/*计算指定日期是星期几。默认输入的*/</p>
		<p>/*数字代表正确的日期*/</p>
		<p>/* 推算给定日期是星期几，假定输入是正确的数据 */<br />#include <br />char *name[] = { "Monday",<br />                 "Tuesday",<br />                 "Wednesday",<br />                "Thursday",<br />                "Friday",<br />                "Saturday",<br />                "Sunday"<br />               };<br />void main(){<br />  int D,M,Y,A;<br />  printf("Day: "); fflush(stdout);<br />  scanf("%d",&amp;D);<br />  printf("Month: "); fflush(stdout);<br />  scanf("%d",&amp;M);<br />  printf("Year: "); fflush(stdout);<br />  scanf("%d",&amp;Y);<br />/* January and February are treated as month 13 and 14, */<br />/* respectively, from the year before.                  */<br />  if ((M == 1) || (M == 2)){<br />    M += 12;<br />    Y--;<br />  }<br />  A = (D + 2*M + 3*(M+1)/5 + Y + Y/4 - Y/100 + Y/400) % 7;<br />  printf("It's a %s.\n",name[A]);<br />}</p>
		<p> </p>
		<p> </p>
		<p>/*一月和二月被当作前一年的*/</p>
		<p>/*十三月和十四月分别处理*/</p>
		<p> </p>
		<p> <br /> <br /> <br /></p>
<img src ="http://www.cppblog.com/qywyh/aggbug/14021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2006-10-22 23:30 <a href="http://www.cppblog.com/qywyh/articles/14021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>拓扑排序</title><link>http://www.cppblog.com/qywyh/articles/13566.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Wed, 11 Oct 2006 05:05:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/13566.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/13566.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/13566.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/13566.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/13566.html</trackback:ping><description><![CDATA[
		<p> </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<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 />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">using</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">namespace</span>
				<span style="COLOR: #000000"> std;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">const</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> MAXN </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">100</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> list[MAXN][MAXN];</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">邻接表 </span>
				<span style="COLOR: #008000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> next[MAXN];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> vInDegree[MAXN]; </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">定点入度 </span>
				<span style="COLOR: #008000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> tpV[MAXN]; </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">拓扑序列</span>
				<span style="COLOR: #008000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> n; </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000"> 定点数 </span>
				<span style="COLOR: #008000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> TopoSort()<br /><img id="Codehighlighter1_191_756_Open_Image" onclick="this.style.display='none'; Codehighlighter1_191_756_Open_Text.style.display='none'; Codehighlighter1_191_756_Closed_Image.style.display='inline'; Codehighlighter1_191_756_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_191_756_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_191_756_Closed_Text.style.display='none'; Codehighlighter1_191_756_Open_Image.style.display='inline'; Codehighlighter1_191_756_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_191_756_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_191_756_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">不能求最大并行组 <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">使用静态链盏</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">    </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> i, t;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> cnt </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> top </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">; <br /><img id="Codehighlighter1_296_404_Open_Image" onclick="this.style.display='none'; Codehighlighter1_296_404_Open_Text.style.display='none'; Codehighlighter1_296_404_Closed_Image.style.display='inline'; Codehighlighter1_296_404_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_296_404_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_296_404_Closed_Text.style.display='none'; Codehighlighter1_296_404_Open_Image.style.display='inline'; Codehighlighter1_296_404_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">for</span>
						<span style="COLOR: #000000"> (i</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">0</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">) </span>
						<span id="Codehighlighter1_296_404_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_296_404_Open_Text">
								<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_329_398_Open_Image" onclick="this.style.display='none'; Codehighlighter1_329_398_Open_Text.style.display='none'; Codehighlighter1_329_398_Closed_Image.style.display='inline'; Codehighlighter1_329_398_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_329_398_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_329_398_Closed_Text.style.display='none'; Codehighlighter1_329_398_Open_Image.style.display='inline'; Codehighlighter1_329_398_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (vInDegree[i] </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </spa