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

            糯米

            TI DaVinci, gstreamer, ffmpeg
            隨筆 - 167, 文章 - 0, 評論 - 47, 引用 - 0
            數據加載中……

            POJ 3171 Cleaning Shifts 線段樹+動態規劃

            這題看似挺有實際用途的,呵呵。
            大意就是用最小的花費覆蓋一段區間。

            思路:

            動態規劃,就是說,將線段的左端點從左到右排序。依次處理:



            1. 假設已經知道,所有的短線拼接起來之后,能組成哪幾條長線(M為左端點)。
            2. 當我們放入一條短線的時候,它能夠和舊長線繼續拼接。這時候,我們需要選取花費最小的那條。
            3. 拼接之后,生成一條新的長線。

            在(2)中,“選取花費最小的那條”可以用線段樹來實現。也就是求區間內的最小值,RMQ問題,由于只插入不刪除,線段樹是可以維護的。

            就這樣一直處理,最終答案就是花費最小的以E為右端點的長線。

            代碼 94MS:
            #include <stdio.h>
            #include 
            <stdlib.h>

            #ifndef INT_MAX
            #define INT_MAX 0x7fffffff
            #endif

            struct tree_node {
                
            int cnt, min;
            }
            ;
            struct seg_node {
                
            int a, b, s;
            }
            ;
            int N, M, E;
            struct tree_node tree[86432 * 4];
            struct seg_node in[10032];

            int cmp(const void *a, const void *b)
            {
                
            return ((struct seg_node *)a)->- ((struct seg_node *)b)->a;
            }


            __inline 
            int max(int a, int b)
            {
                
            return a > b ? a : b;
            }


            __inline 
            int min(int a, int b)
            {
                
            return a < b ? a : b;
            }


            void tree_op(const int ins, 
                         
            int idx,
                         
            int left, int right, 
                         
            int start, int end, 
                         
            int *val
                         )
            {
                
            int mid;

                
            if (ins) {
                    
            if (!tree[idx].cnt || *val < tree[idx].min)
                        tree[idx].min 
            = *val;
                    tree[idx].cnt
            ++;
                }


                
            if (left == start && right == end) {
                    
            if (!ins && tree[idx].cnt && tree[idx].min < *val)
                        
            *val = tree[idx].min;
                    
            return ;
                }


                mid 
            = (left + right) / 2;
                
            if (end <= mid) 
                    tree_op(ins, idx
            *2, left, mid, start, end, val);
                
            else if (start > mid)
                    tree_op(ins, idx
            *2 + 1, mid + 1, right, start, end, val);
                
            else {
                    tree_op(ins, idx
            *2, left, mid, start, mid, val);
                    tree_op(ins, idx
            *2 + 1, mid + 1, right, mid + 1, end, val);
                }

            }


            int main()
            {
                
            int i, val, start, end;

                freopen(
            "e:\\test\\in.txt""r", stdin);

                scanf(
            "%d%d%d"&N, &M, &E);
                
            for (i = 0; i < N; i++)
                    scanf(
            "%d%d%d"&in[i].a, &in[i].b, &in[i].s);
                qsort(
            in, N, sizeof(in[0]), cmp);

                
            for (i = 0; i < N; i++{
                    
            if (in[i].b < M)
                        
            continue;
                    
            if (in[i].a > E)
                        
            break;
                    start 
            = max(M, in[i].a - 1);
                    end 
            = min(E, in[i].b);
                    
            if (in[i].a == M) {
                        tree_op(
            11, M, E, end, end, &in[i].s);
                        
            continue;
                    }

                    val 
            = INT_MAX;
                    tree_op(
            01, M, E, start, end, &val);
                    
            if (val == INT_MAX)
                        
            continue;
                    val 
            += in[i].s;
                    tree_op(
            11, M, E, end, end, &val);
                }


                val 
            = INT_MAX;
                tree_op(
            01, M, E, E, E, &val);
                printf(
            "%d\n", val == INT_MAX ? -1 : val);

                
            return 0;
            }



            posted on 2010-03-30 21:52 糯米 閱讀(775) 評論(0)  編輯 收藏 引用 所屬分類: POJ

            久久99国产综合精品| 精品熟女少妇AV免费久久 | 久久久精品波多野结衣| 99蜜桃臀久久久欧美精品网站 | 99久久精品免费看国产| 97久久天天综合色天天综合色hd| 亚洲欧洲久久久精品| 国産精品久久久久久久| 91秦先生久久久久久久| 伊人久久综合热线大杳蕉下载| 久久永久免费人妻精品下载| 久久亚洲熟女cc98cm| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 久久亚洲熟女cc98cm| 亚洲精品无码久久不卡| 久久一区二区免费播放| 亚洲国产精品综合久久一线| 国产精品永久久久久久久久久| 热re99久久精品国99热| 久久AV无码精品人妻糸列| 久久久这里只有精品加勒比| 欧美成a人片免费看久久| 蜜桃麻豆www久久国产精品| 精品免费久久久久国产一区| 狠狠精品久久久无码中文字幕| 中文字幕亚洲综合久久| 国产亚洲婷婷香蕉久久精品| 国产精品青草久久久久福利99| 久久播电影网| 久久精品国产男包| 久久香综合精品久久伊人| 97香蕉久久夜色精品国产 | 国产精品女同久久久久电影院| 久久天堂AV综合合色蜜桃网| 97久久久久人妻精品专区 | 热RE99久久精品国产66热| 99久久精品免费看国产一区二区三区| 久久久久久久97| 四虎国产精品免费久久久| 亚洲欧洲精品成人久久奇米网| 久久人人妻人人爽人人爽|