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

            国产精品日韩欧美久久综合| 久久精品亚洲一区二区三区浴池| 99久久人妻无码精品系列蜜桃| 国产精品久久网| 亚洲欧美日韩久久精品| 亚洲精品国产字幕久久不卡| 国产精品99精品久久免费| 中文字幕亚洲综合久久2| 免费精品久久天干天干| 久久精品黄AA片一区二区三区| 97久久超碰国产精品2021| 青青热久久国产久精品| 免费国产99久久久香蕉| 久久婷婷五月综合色高清 | 久久91精品国产91久久麻豆| 国产精品激情综合久久| 中文字幕无码免费久久| 日产久久强奸免费的看| 久久这里只有精品18| 人妻丰满?V无码久久不卡| 人人狠狠综合久久亚洲婷婷| 亚洲熟妇无码另类久久久| 理论片午午伦夜理片久久| 91精品观看91久久久久久| 亚洲中文字幕久久精品无码APP| 国産精品久久久久久久| 韩国三级中文字幕hd久久精品| 国产亚洲色婷婷久久99精品| 性欧美大战久久久久久久久| 亚洲国产小视频精品久久久三级 | 激情综合色综合久久综合| 亚洲日本久久久午夜精品| 亚洲精品视频久久久| 成人国内精品久久久久一区| 久久婷婷五月综合成人D啪| 欧美激情一区二区久久久| 国产精品免费久久久久影院| 日本一区精品久久久久影院| 99久久婷婷免费国产综合精品| 国内精品久久人妻互换| 久久777国产线看观看精品|