• <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)計(jì)

            積分與排名

            百事通

            最新評論

            hdu 1025 Constructing Roads In JGShining's Kingdom

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

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

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

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

            因此我們規(guī)定:只保留(5, 3)!換句話說:d值相同的a只保留一個(gè)。
            用g[i]表示d值為i的最小a,那么一定有g(shù)[1] < g[2] < …… < g[n]
            (想一想,為什么?)。不存在的d值對應(yīng)的g設(shè)為正無窮。
            d[i]的計(jì)算可以使用二分查找得到大于等于a[i]的第一個(gè)數(shù)j,
            則d[i] = j(本來是找不大于a[i]的最后一個(gè)數(shù)j,則d[i] = j + 1,
            但這樣轉(zhuǎn)化后更方便)。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 此最相思 閱讀(489) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            99久久www免费人成精品| 日本欧美久久久久免费播放网| 久久精品国产亚洲αv忘忧草 | 久久99亚洲综合精品首页| 久久精品卫校国产小美女| 久久夜色精品国产噜噜亚洲a| 99久久精品费精品国产| 一本伊大人香蕉久久网手机| 久久电影网一区| 国产巨作麻豆欧美亚洲综合久久| 99久久综合狠狠综合久久| 国产成人无码精品久久久久免费| 久久高潮一级毛片免费| 欧美精品福利视频一区二区三区久久久精品 | 人妻无码精品久久亚瑟影视| 久久久精品国产| 久久久久久久97| 精品久久久噜噜噜久久久| 久久99国产精一区二区三区| 26uuu久久五月天| 久久青青草原精品国产不卡| 久久成人小视频| 91精品国产综合久久婷婷| 国产精品99久久久久久猫咪| 亚洲欧洲中文日韩久久AV乱码| 亚洲精品无码久久久久| 精品999久久久久久中文字幕| 精品久久久久久无码人妻蜜桃| 一级女性全黄久久生活片免费 | 亚洲AV日韩精品久久久久久 | 精品国产91久久久久久久a| 久久99九九国产免费看小说| 久久久无码人妻精品无码| 99热热久久这里只有精品68| 色妞色综合久久夜夜| 美女写真久久影院| 久久亚洲中文字幕精品一区| 亚洲国产精品人久久| 亚洲AV无码久久精品成人| 久久精品国产欧美日韩| 久久国产精品无码一区二区三区|