• <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 糯米 閱讀(779) 評論(0)  編輯 收藏 引用 所屬分類: POJ

            久久青青草原精品国产不卡| 日韩欧美亚洲国产精品字幕久久久| 久久激情五月丁香伊人| 亚洲精品乱码久久久久久不卡| 久久精品无码一区二区三区日韩 | 久久精品www人人爽人人| 亚洲综合日韩久久成人AV| 久久婷婷五月综合97色一本一本| 97精品伊人久久大香线蕉app| 香蕉久久夜色精品国产尤物| 国产精品久久久久影院色| 99久久久久| 久久婷婷五月综合色奶水99啪| 久久精品国产半推半就| 国产V综合V亚洲欧美久久| A级毛片无码久久精品免费| 91精品国产91久久久久福利| 亚洲精品国精品久久99热| 久久福利青草精品资源站| 99久久免费国产精品特黄| 久久精品国产福利国产琪琪| 亚洲综合熟女久久久30p| 久久久中文字幕日本| 99久久精品国内| 亚洲国产精品久久电影欧美| 精品久久久久成人码免费动漫| 99国产精品久久久久久久成人热| 日韩电影久久久被窝网| AAA级久久久精品无码区| 国产精品久久久久…| 久久国产高潮流白浆免费观看| 亚洲精品国产自在久久| 国产精品gz久久久| 久久中文字幕一区二区| 办公室久久精品| 久久免费小视频| 欧美亚洲国产精品久久蜜芽| 国产精品禁18久久久夂久| 无码超乳爆乳中文字幕久久 | 久久久久久久波多野结衣高潮| 色婷婷久久久SWAG精品|