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

            misschuer

            常用鏈接

            統(tǒng)計

            積分與排名

            百事通

            最新評論

            hdu 1025 Constructing Roads In JGShining's Kingdom

            /*
            設d[i]為以i結尾的最長上升子序列的長度,那么它的前一個元素是什么呢?
            設它為j,則d[i] = max{d[j]} + 1,其中枚舉條件是j < i且a[j] < a[i]。
            狀態(tài)有O(n)個,決策O(n)個,時間復雜度為O(n^2)。

            下面考慮如何把它優(yōu)化到O(nlogn)。
            把同一個i對應的d[i]和a[i]看成一個二元組(d, a)。
            在計算d[i]時,考慮所有滿足j < i的二元組(d, a)。
            顯然它們的i是無關緊要的,只需要找出其中a[j] < a[i]的最大d[j]即可。

            換句話說,程序看起來應該是這樣的:
            其中getmax(S,a[i])表示在集合S中所有a值小于a[i]的二元組中尋找d的最大值。
            update(S,a[i],d[i])表示用二元組a[i]; d[i]更新集合S。

            現在問題的關鍵是實現集合S。考慮二元組(5, 4)和(5, 3)。它們d值相同但a值不同。
            對于后續(xù)決策來說,(5, 4)是合法時(5, 3)一定合法,而且(5, 4)和(5, 3)一樣好。

            因此我們規(guī)定:只保留(5, 3)!換句話說:d值相同的a只保留一個。
            用g[i]表示d值為i的最小a,那么一定有g[1] < g[2] < …… < g[n]
            (想一想,為什么?)。不存在的d值對應的g設為正無窮。
            d[i]的計算可以使用二分查找得到大于等于a[i]的第一個數j,
            則d[i] = j(本來是找不大于a[i]的最后一個數j,則d[i] = j + 1,
            但這樣轉化后更方便)。g的更新由于g[j] > a[i],且i的d值為j,
            因此需要更新g[j] = a[i]。
            程序如下:

            fill (g , g + n , infinity );

            for(int i = 0; i < n; i ++){

              int j = lower_bound (g , g + n , a[ i ]) - g;
              d[ i ] = j + 1;
              g[ j ] = a[ i ];
            }
            6
            1 6 2 4 3 7
            */

            #include 
            <iostream>
            #define MAXN 500001
            using namespace std;


            int n, dp[MAXN], len, g[MAXN];

            int binarySearch(int *M, int a) {

                
            int left = 1, right = len, cnt = 0;

                
            while(left <= right) {
                
                    
            int mid = (left + right) >> 1;
                    
            //= 適用于不降遞增子序列
                    if(a >= M[ mid ]) {
                    
                        
            if(cnt < mid) cnt = mid;
                        left 
            = mid + 1;
                    }
                    
            else right = mid - 1;
                }
                
            return cnt;
            }

            void res() {
              
                
            int cc, tmp;
                len 
            = 1; g[ 1 ] = dp[ 1 ];
                
                
            //g[i] 表示 d值為i 的最小dp

                
            for(int i = 2; i <= n; ++ i) {

                    tmp 
            = binarySearch(g, dp[ i ]);
                    cc 
            = tmp + 1;
                    
            if(cc > len) {
                    
                        g[ cc ] 
            = dp[ i ];
                        len 
            ++;
                    }
                    
            else if(g[ cc ] > dp[ i ]) {
                    
                        g[ cc ] 
            = dp[ i ];
                    }
                }

                
            if(len > 1)
                    printf(
            "My king, at most %d roads can be built.\n\n", len);
                
            else
                    printf(
            "My king, at most %d road can be built.\n\n", len);
            }


            int main() {

                
            int z = 1in;
                
            while(~scanf("%d"&n)) {
                
                    
            for(int i = 1; i <= n; ++ i) {
                    
                        scanf(
            "%d"&in);
                        scanf(
            "%d"&dp[ in ]);
                    }

                    printf(
            "Case %d:\n", z ++);

                    res();
                }
                
            return 0;
            }

            posted on 2011-03-15 14:25 此最相思 閱讀(486) 評論(0)  編輯 收藏 引用

            999久久久无码国产精品| 伊人久久大香线蕉成人| 国产成人久久精品激情| 久久777国产线看观看精品| 99久久亚洲综合精品成人| 久久精品国产国产精品四凭| 亚洲中文字幕久久精品无码喷水| 99久久精品国内| 国内精品久久久久影院薰衣草| 久久久久无码精品国产| 久久精品无码一区二区app| 97久久精品人妻人人搡人人玩| 色综合合久久天天给综看| 东京热TOKYO综合久久精品| 欧美成人免费观看久久| 久久国产精品久久精品国产| 囯产精品久久久久久久久蜜桃| 99久久精品免费看国产| 91精品国产高清久久久久久io | 国产成人久久精品区一区二区| 亚洲午夜福利精品久久| 曰曰摸天天摸人人看久久久| 久久夜色精品国产噜噜亚洲AV| 欧美一区二区久久精品| 久久免费大片| 久久五月精品中文字幕| 久久AAAA片一区二区| 粉嫩小泬无遮挡久久久久久| 新狼窝色AV性久久久久久| 日韩十八禁一区二区久久| 亚洲国产成人久久综合一| 久久免费精品一区二区| 久久亚洲国产精品一区二区| 国产91色综合久久免费分享| 久久99国产精品二区不卡| 99久久精品国产高清一区二区| 亚洲级αV无码毛片久久精品| 国产香蕉久久精品综合网| 国产精品中文久久久久久久| 亚洲欧美日韩中文久久| 中文字幕日本人妻久久久免费 |