• <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>

            coreBugZJ

            此 blog 已棄。

            歸并樹


            記錄歸并排序的中間結果。

            我的代碼:

             1 // MergeTree begin
             2 
             3 // T(),  T < T, T = T
             4 // ensure 2^NL >  ri
             5 // [ le, ri ]
             6 
             7 template<class T, int NL>
             8 class MergeTree
             9 {
            10 public : 
            11         void init( const T d[], int le, int ri, int dep = 0int v = 1 ) {
            12                 left[ v ]  = le;
            13                 right[ v ] = ri;
            14                 if ( le == ri ) {
            15                         data[ dep ][ le ] = d[ le ];
            16                         return;
            17                 }
            18                 int mid = ( le + ri ) / 2;
            19                 init( d, le, mid, dep + 1, v + v );
            20                 init( d, mid + 1, ri, dep + 1, v + v + 1 );
            21                 int i = le, j = mid + 1, k = le;
            22                 while ( ( i <= mid ) && ( j <= ri ) ) {
            23                         if ( data[ dep + 1 ][ i ] < data[ dep + 1 ][ j ] ) {
            24                                 data[ dep ][ k++ ] = data[ dep + 1 ][ i++ ];
            25                         }
            26                         else {
            27                                 data[ dep ][ k++ ] = data[ dep + 1 ][ j++ ];
            28                         }
            29                 }
            30                 while ( i <= mid ) {
            31                         data[ dep ][ k++ ] = data[ dep + 1 ][ i++ ];
            32                 }
            33                 while ( j <= ri ) {
            34                         data[ dep ][ k++ ] = data[ dep + 1 ][ j++ ];
            35                 }
            36         }
            37         int getCountBelow( int le, int ri, const T & da, int dep = 0int v = 1 ) {
            38                 if ( ( ri < left[ v ] ) || ( right[ v ] < le ) ) {
            39                         return 0;
            40                 }
            41                 if ( ( le <= left[ v ] ) && ( right[ v ] <= ri ) ) {
            42                         int low = left[ v ], high = right[ v ], mid, ans = left[ v ] - 1;
            43                         while ( low <= high ) {
            44                                 mid = ( low + high ) >> 1;
            45                                 if ( data[ dep ][ mid ] < da ) {
            46                                         low = mid + 1;
            47                                         if ( ans < mid ) {
            48                                                 ans = mid;
            49                                         }
            50                                 }
            51                                 else {
            52                                         high = mid - 1;
            53                                 }
            54                         }
            55                         return ans - left[ v ] + 1;
            56                 }
            57                 return getCountBelow( le, ri, da, dep + 1, v + v ) + 
            58                        getCountBelow( le, ri, da, dep + 1, v + v + 1 );
            59         }
            60         // k = 1, 2,  , ri - le + 1, le <= ri
            61         T getKth( int le, int ri, int k ) {
            62                 int low = left[ 1 ], high = right[ 1 ], mid, rk, ans = left[ 1 ];
            63                 while ( low <= high ) {
            64                         mid = ( low + high ) >> 1;
            65                         rk = getCountBelow( le, ri, data[ 0 ][ mid ] ) + 1;
            66                         if ( rk <= k ) {
            67                                 low = mid + 1;
            68                                 if ( mid > ans ) {
            69                                         ans = mid;
            70                                 }
            71                         }
            72                         else {
            73                                 high = mid - 1;
            74                         }
            75                 }
            76                 return data[ 0 ][ ans ];
            77         }
            78 private : 
            79         T  data[ NL ][ 1 << NL ];
            80         int left[ 4 << NL ], right[ 4 << NL ];
            81 };
            82 
            83 // MergeTree end
            84 


            posted on 2011-03-20 19:44 coreBugZJ 閱讀(1797) 評論(0)  編輯 收藏 引用 所屬分類: DataStructure

            欧美午夜A∨大片久久| 久久av免费天堂小草播放| 国产精品成人99久久久久91gav| 久久国产成人精品麻豆| 免费观看成人久久网免费观看| 久久996热精品xxxx| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 中文精品久久久久人妻| 久久天天婷婷五月俺也去| 久久久亚洲精品蜜桃臀| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 久久久久香蕉视频| 久久久久久久精品妇女99| 久久精品国产91久久综合麻豆自制| 亚洲国产成人久久综合一区77| 久久性生大片免费观看性| 中文字幕精品久久| 久久久久国产精品熟女影院| 久久久久亚洲精品中文字幕| 久久亚洲国产成人影院| 99久久99久久精品国产片果冻 | 中文字幕久久波多野结衣av| 亚洲伊人久久大香线蕉综合图片| 中文字幕无码免费久久| 精品国产福利久久久| 热RE99久久精品国产66热| 亚洲精品乱码久久久久久| 久久精品人妻一区二区三区| 一日本道伊人久久综合影| 久久妇女高潮几次MBA| 日韩一区二区久久久久久| 久久综合色老色| 久久99中文字幕久久| 热RE99久久精品国产66热| 2020久久精品国产免费| 成人综合伊人五月婷久久| 色妞色综合久久夜夜 | 国产亚洲美女精品久久久| 一本色道久久88—综合亚洲精品| 嫩草影院久久国产精品| 亚洲人成网亚洲欧洲无码久久|