青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

ACM___________________________

______________白白の屋
posts - 182, comments - 102, trackbacks - 0, articles - 0
<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

常用鏈接

留言簿(24)

隨筆分類(332)

隨筆檔案(182)

FRIENDS

搜索

積分與排名

最新隨筆

最新評論

閱讀排行榜

評論排行榜


 轉載自 http://www.cnitblog.com/cockerel/archive/2006/09/13/16806.html

相信對算法設計或者數據結構有一定了解的人對線段樹都不會太陌生。它是能夠在log(MaxLen)時間內完成線段的添加、刪除、查詢等操作。但一般的實現都有點復雜(我自寫的是要遞歸的,比較多行)。而線段樹應用中有一種是專門針對點的。(點樹?)它的實現卻非常簡單。
  這種數據結構有什么用?我們先來考慮一下下面的需求(全部要求在LogN時間內完成):如何知道一個點在一個點集里的大小“排名”?很簡單,開一個點數組,排個序,再二分查找就行了;如何在一個點集內動態增刪點?也很簡單,弄個平衡樹就行了(本來平衡樹比線段樹復雜得多,但自從世界上有了STL set這么個好東東,就……^_^)那如果我既要動態增刪點,也要隨時查詢到一個點的排名呢?那對不起,可能就要出動到我們的“點樹”了。
  其實現原理很簡單:每當增加(或刪除)一個大小為X的點時,就在樹上添加(或刪除)一條(X,MaxLen)的線段(不含端點),當要查詢一個點的排名時,只要看看其上有多少條線段就可以了。針對這一需求,這里有個非常簡單的實現(見以下代碼,十多行,夠短了吧?)其中clear()用于清空點集;add()用于添加一個點;cntLs()返回小于n的點的個數,也就是n的升序排名,類似地cntGt是降序排名。
  這個點樹有什么用呢?其中一個應用時在O(NlogN)時間內求出一個排列的逆序數(http://acm.zju.edu.cn/show_problem.php?pid=1484,你有更好的算法嗎?歡迎交流)方法是每讀到一個數x,就讓逆序數+=cntGt(x);然后再add(x)。
  這個實現還可以進行一些擴展。比如刪除del(int n),只要把add(int n)中的++size換成--size,把a[i/2]++改成a[i/2]--即可。另外還可以通過二分查找功能在O(logN)時間內查到排名第n的點的大小。應該也可以三四行內搞定。

 template < int  N > // 表示可用區間為[0,N),其中N必須是2的冪數;  
 
class  PointTree {
    
 int  a[ 2 * N];
    
 int  size; 
    
 void  clear() { memset( this , 0 , sizeof ( * this ));}  
    
 void  add( int  n) {
        
 int  i = N + n;  ++ size; 
        
 for ( ++ a[i]; i > 1 ; i /= 2 )
            
 if ( ~ i & 1 ) a[i / 2 ] ++ ;
    }
 
 
    
 int  cntLs( int  n) { // 統計小于  
 
         int  i = N + n,c = 0  // 若統計小于等于則c=a[i];  
 
         for (; i > 1 ; i /= 2 
            
 if (i & 1 ) c += a[i / 2 ];
         
 return  c;
    }
 

     
 int  cntGt( int  n)  return  size - a[N + n] - cntLs(n); }  
}
 

  嗯~~~為了解http://acm.zju.edu.cn/show_problem.php?pid=2425這一題,還是把上述兩個擴展給實現了啦,果然不難:
(接上)
    
void del(int n){
        
if(!a[n+=N])return;
        
--size;
        
for(--a[n]; n>1; n/=2)
            
if(~n&1)--a[n/2];
    }

    
/*  解決:求點集中第i小的數(由0數起)
     *    注意:如果i>=size 返回N-1 
     
*/
 
    
int operator[](int n){
        
int i=1;
        
while(i<N){
            
if(n<a[i]) i*=2;
            
else n-=a[i], i=i*2+1;
        }

        
return i-N;    
    }
    
};  
//附一個測試程序
#include<iostream.h>
T
<8192> t;  
int main(){
    
char c; int n;
    
while(cin>>c){
           
if(c=='c') t.clear();
           
else{
               cin
>>n;
               
if(c=='a') t.add(n);
               
if(c=='d') t.del(n);
               
if(c=='q') cout<<t[n]<<endl;
           }
    
    }
    
               
    
return 0;
}
  
求點集里n的個數了!
int cntEQ(int n){
    
return a[N+n];
}

P.S.:
  在寫完這篇文章一段時間后,我認識了另一種功能上比較類似的數據結構,叫做“樹狀數組”。它們有不少相似之處:
  • 針對點集的處理(添加、刪除、查找);
  • 相似的時空復雜度(logN時間,2N空間);
  • 相似的編程復雜度(都比線段樹簡短得多);

因此,所有可以用樹狀數組解決的問題都可以用這個“點樹”來解決,另外它還有以下好處:

  • 更直觀的轉移(個人感受,不一定要同意);
  • 同時支持自下而上和自上而下兩種方向的查找和更新,而后者樹狀數組不支持,所以樹狀數組不提供某些功能,比如說O(logN)求點集中第k小數。

posted on 2006-09-13 19:54 踏雪赤兔 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜精品免费视频| 国产精品日韩二区| 99av国产精品欲麻豆| 欧美成人精品在线播放| 麻豆av福利av久久av| 久久免费高清视频| 免费看av成人| 亚洲国产婷婷| 欧美激情久久久久| 亚洲日本欧美日韩高观看| 亚洲国产高清自拍| 这里只有精品在线播放| 欧美中文在线视频| 免费久久99精品国产自| 欧美日韩在线视频一区| 国产日韩精品视频一区二区三区| 国产一区二区三区四区| 亚洲国产综合91精品麻豆| 一本色道久久88综合日韩精品 | 亚洲精品免费一区二区三区| 亚洲精品一区二区在线| 亚洲一区久久久| 久久夜精品va视频免费观看| 亚洲精品孕妇| 欧美一区二区精美| 欧美精品色网| 国内成人在线| 国产精品久久久久aaaa樱花| 亚洲午夜久久久久久久久电影网| 欧美一区二区成人6969| 欧美高清在线一区| 国产日韩在线看| 一区二区三区高清在线观看| 久久久久久久高潮| 亚洲理论在线观看| 欧美亚洲一区二区在线观看| 欧美激情在线观看| 精品88久久久久88久久久| 亚洲欧美激情四射在线日| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲网站在线播放| 欧美日韩国产精品自在自线| 亚洲电影中文字幕| 久色婷婷小香蕉久久| 欧美亚洲自偷自偷| 国产精品综合久久久| 亚洲欧美精品在线| 一区二区三区|亚洲午夜| 欧美高清视频| 亚洲国产午夜| 蜜桃久久av| 久久成人免费网| 国产婷婷成人久久av免费高清| 亚洲图片自拍偷拍| 日韩视频在线观看国产| 欧美黄色影院| 亚洲精品国产精品国产自| 欧美电影免费观看网站| 久久久最新网址| 在线观看日韩av| 老司机精品福利视频| 久久国产视频网站| 好看的亚洲午夜视频在线| 久久深夜福利免费观看| 久久精品夜色噜噜亚洲a∨| 激情婷婷亚洲| 欧美国产日韩免费| 欧美福利在线观看| 亚洲午夜精品久久久久久app| 亚洲精品综合在线| 国产精品国产自产拍高清av王其| 亚洲综合国产精品| 亚洲欧美一区二区三区极速播放 | 国内精品久久久久国产盗摄免费观看完整版| 99天天综合性| 亚洲美女黄色| 国产精品久久久免费| 香蕉久久夜色精品国产使用方法 | 亚洲桃色在线一区| 国产精品爽爽ⅴa在线观看| 欧美亚洲综合另类| 久久成人在线| 亚洲精品国精品久久99热一| 日韩亚洲欧美高清| 国产农村妇女毛片精品久久莱园子 | 久久米奇亚洲| 久久一区视频| 日韩一级大片在线| 亚洲一区二区毛片| 伊人久久大香线| 日韩视频一区二区三区在线播放免费观看 | 在线中文字幕一区| 亚洲永久免费观看| 亚洲第一区在线| 夜夜狂射影院欧美极品| 国产香蕉97碰碰久久人人| 亚洲福利视频网站| 国产麻豆精品视频| 亚洲高清自拍| 国产一区二区三区高清| 亚洲精品中文字幕在线| 影视先锋久久| 亚洲一区二区三区四区中文| 亚洲国产国产亚洲一二三| 亚洲欧美日韩精品一区二区 | 欧美顶级大胆免费视频| 欧美亚洲一区三区| 欧美日韩国产成人| 久久影视精品| 国产伦精品一区二区| 亚洲国产精品福利| 国产日韩亚洲欧美综合| 亚洲美女av在线播放| 亚洲国产高清一区二区三区| 羞羞答答国产精品www一本| 一区二区三区四区国产| 玖玖在线精品| 欧美自拍偷拍午夜视频| 国产精品v欧美精品v日韩| 亚洲福利视频网站| 伊人久久成人| 欧美一区二区三区四区在线观看 | 国产视频一区在线| 欧美在线看片| 久久深夜福利免费观看| 欧美日韩一区国产| 美女主播精品视频一二三四| 国产精品实拍| 999亚洲国产精| 亚洲乱码一区二区| 免费亚洲电影| 美女主播一区| 久久全球大尺度高清视频| 欧美一级电影久久| 欧美午夜电影完整版| 亚洲美女福利视频网站| 一卡二卡3卡四卡高清精品视频 | 久久综合导航| 国产综合久久久久久鬼色| 欧美亚洲午夜视频在线观看| 午夜精品福利一区二区三区av | 美女视频网站黄色亚洲| 国产精品日韩一区二区| 99国产成+人+综合+亚洲欧美| 亚洲巨乳在线| 欧美理论电影网| 亚洲裸体在线观看| 亚洲视频在线一区| 国产精品久久久久aaaa樱花| 亚洲一区免费网站| 久久国产日本精品| 韩国精品久久久999| 久久精品夜色噜噜亚洲aⅴ| 欧美护士18xxxxhd| 一区二区三区久久久| 欧美日韩精品一本二本三本| 中日韩视频在线观看| 久久av资源网站| 伊人春色精品| 欧美日本精品在线| 亚洲免费婷婷| 久久婷婷国产综合精品青草| 久久精品女人| 欧美成人伊人久久综合网| 亚洲欧洲日产国产网站| 欧美激情综合色| 亚洲一区日韩在线| 久久免费99精品久久久久久| 亚洲第一视频| 欧美性大战久久久久久久蜜臀| 欧美一区二区三区电影在线观看| 欧美成人国产va精品日本一级| 夜夜嗨av一区二区三区| 国产欧美日韩不卡免费| 卡通动漫国产精品| 中文国产成人精品| 欧美jizz19hd性欧美| 亚洲天堂成人在线视频| 国内精品久久久| 欧美日韩妖精视频| 久久久另类综合| 一本色道久久综合狠狠躁篇的优点| 久久青草欧美一区二区三区| 美女精品自拍一二三四| 免费在线观看日韩欧美| 日韩西西人体444www| 久久久精品日韩| 欧美中文字幕在线| 欧美激情亚洲另类| 久久国产66| 99精品久久久| 在线观看亚洲视频啊啊啊啊| 欧美午夜三级| 欧美激情麻豆| 亚洲欧美日韩精品久久久久| 性欧美暴力猛交另类hd| 欧美精品aa| 欧美一区二区三区久久精品 | 在线日韩av片| 国产午夜精品麻豆|