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

            精品久久久久久无码中文字幕 | 婷婷久久综合| 久久精品国产半推半就| 婷婷伊人久久大香线蕉AV| 久久天天躁夜夜躁狠狠| 久久久噜噜噜久久中文字幕色伊伊| 久久影视综合亚洲| 思思久久99热免费精品6| 久久久久无码国产精品不卡| 久久国产精品免费一区二区三区| 色综合合久久天天综合绕视看| 99久久精品费精品国产一区二区| 国产99久久精品一区二区| 久久噜噜电影你懂的| yellow中文字幕久久网| 国产高清美女一级a毛片久久w| 国产成人AV综合久久| 亚洲午夜无码AV毛片久久| 精品久久久久久国产| 老色鬼久久亚洲AV综合| 久久精品国产亚洲网站| 久久播电影网| 久久无码高潮喷水| 精品久久久久久久久午夜福利| 天天久久狠狠色综合| 亚洲Av无码国产情品久久| 亚洲av日韩精品久久久久久a | 久久天天躁狠狠躁夜夜不卡| 久久天天躁狠狠躁夜夜avapp| 久久夜色tv网站| 亚洲欧美国产日韩综合久久| 久久久久亚洲av无码专区喷水 | 美女久久久久久| 三上悠亚久久精品| 国产真实乱对白精彩久久| 国产欧美久久久精品影院| 狠色狠色狠狠色综合久久| 亚洲精品国产综合久久一线| 欧美va久久久噜噜噜久久| 精品久久久久久99人妻| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 |