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

            常用鏈接

            統計

            積分與排名

            百事通

            最新評論

            hdu 1025 Constructing Roads In JGShining's Kingdom

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

            下面考慮如何把它優化到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值不同。
            對于后續決策來說,(5, 4)是合法時(5, 3)一定合法,而且(5, 4)和(5, 3)一樣好。

            因此我們規定:只保留(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 此最相思 閱讀(495) 評論(0)  編輯 收藏 引用

            久久综合欧美成人| 色欲久久久天天天综合网 | 美女久久久久久| 久久久久人妻一区二区三区| 精品无码久久久久久尤物| 精品国产婷婷久久久| 亚洲精品蜜桃久久久久久| 国产精品热久久无码av| 久久久久亚洲精品无码蜜桃| 久久久久人妻精品一区三寸蜜桃| 久久精品桃花综合| 久久无码人妻精品一区二区三区| 国内精品久久久久久久97牛牛| 香蕉久久永久视频| 久久国产成人午夜AV影院| 国产亚洲美女精品久久久久狼| 久久精品国产亚洲av麻豆图片 | 久久国产午夜精品一区二区三区| 久久久久久久久久久| 久久精品无码一区二区app| 国产成人综合久久综合| 亚洲AV日韩AV永久无码久久| 久久久久久免费视频| 久久精品无码av| 手机看片久久高清国产日韩| 精品久久久久久无码中文野结衣 | 一本色道久久88—综合亚洲精品| 国产巨作麻豆欧美亚洲综合久久| 国产精品毛片久久久久久久| 青草国产精品久久久久久| 亚洲中文字幕无码久久综合网 | 丁香五月网久久综合| 无码人妻久久一区二区三区免费丨| 大香伊人久久精品一区二区| 伊人久久精品影院| 国内高清久久久久久| 99久久国产综合精品女同图片| 久久妇女高潮几次MBA| 亚洲国产精品无码久久| 久久精品国产亚洲av日韩| 99久久成人国产精品免费|