• <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 2374 Fence Obstacle Course 線段樹+動態規劃

            思路:

            用線段樹維護所有線段的分布。
            新增加一個fence的時候,將fence的范圍[a, b]插入線段樹,節點的值為fence的編號,即高度。
            那么fence上的某一點就是樹的葉子了,從葉子往上一直到根節點的路徑中節點的最大值,
            就是從fence上的這一點垂直掉下去后,碰到的一個fence了。

            這樣,我們就可以在O(lgN)時間內知道,從一個fence的端點掉下去會碰到哪個fence了。
            不然從后往前一個個找就是O(N)復雜度了。同時N也很大,必然超時。

            同時也可以發現,一個fence保存兩個值用作動態規劃就好了,向左、右走之后,掉到其他fence上面,然后回到基地所用的最短路徑。
            推的方法很簡單,掉到其他fence上面之后,看下是向左走距離短還是向右走距離短。就行了。

            這個代碼跑到400ms。

            #include <stdio.h>

            #define MAX_N 50032
            #define MAX_R 100032 

            struct {
                
            int a, b;
            }
             dp[MAX_N], fences[MAX_N];
            int N, S, tree[MAX_R*16];

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


            __inline 
            int abs(int a)
            {
                
            return a > 0 ? a : -a;
            }


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


            void insert(int idx, int start, int end, int left, int right, int val)
            {
                
            int mid;

                
            if (start == left && right == end) {
                    tree[idx] 
            = val;
                    
            return ;
                }

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

            }


            int query(int idx, int start, int end, int pos)
            {
                
            int val, mid;

                
            if (start == pos && end == pos) 
                    
            return tree[idx];
                mid 
            = (start + end) / 2;
                
            if (pos <= mid)
                    val 
            = query(idx*2, start, mid, pos);
                
            else
                    val 
            = query(idx*2+1, mid + 1, end, pos);
                
            return max(val, tree[idx]);
            }


            __inline 
            int calc_min(int i, int pos)
            {
                
            if (!i)
                    
            return abs(pos - MAX_R);
                
            return min(pos - fences[i].a + dp[i].a, fences[i].b - pos + dp[i].b);
            }


            int main()
            {
                
            int i;

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

                scanf(
            "%d%d"&N, &S);
                S 
            += MAX_R;
                
            for (i = 1; i <= N; i++{
                    scanf(
            "%d%d"&fences[i].a, &fences[i].b);
                    fences[i].a 
            += MAX_R;
                    fences[i].b 
            += MAX_R;
                    dp[i].a 
            = calc_min(query(10, MAX_R*2, fences[i].a), fences[i].a);
                    dp[i].b 
            = calc_min(query(10, MAX_R*2, fences[i].b), fences[i].b);
                    insert(
            10, MAX_R*2, fences[i].a, fences[i].b, i);
                }

                printf(    
            "%d\n"
                        min(S 
            - fences[N].a + dp[N].a, fences[N].b - S + dp[N].b)
                        );

                
            return 0;
            }

            posted on 2010-03-08 18:21 糯米 閱讀(1338) 評論(2)  編輯 收藏 引用 所屬分類: POJ

            評論

            # re: POJ 2374 Fence Obstacle Course 線段樹+動態規劃  回復  更多評論   

            知道為什么要用線段樹,我直接開辟一個數組,每次將第i個fense的區間標記為i,好像也能得到正確的結果,可是會運行超時,不知道為什么?
            #include "stdafx.h"
            #include <stdio.h>

            #define MAX_N 50032
            #define MAX_R 100032

            struct {
            int a, b;
            } dp[MAX_N], fences[MAX_N];
            int N, S;

            int seg[MAX_R*2];

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

            __inline int abs(int a)
            {
            return a > 0 ? a : -a;
            }

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

            __inline int calc_min(int i, int pos)
            {
            if (!i)
            return abs(pos - MAX_R);
            return min(pos - fences[i].a + dp[i].a, fences[i].b - pos + dp[i].b);
            }


            int main()
            {
            //for(int k=0;k<MAX_R*2;++k)
            //{
            // seg[k] = 0;
            //}

            int i;

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

            scanf("%d%d", &N, &S);
            S += MAX_R;
            for (i = 1; i <= N; i++) {
            scanf("%d%d", &fences[i].a, &fences[i].b);
            fences[i].a += MAX_R;
            fences[i].b += MAX_R;
            dp[i].a = calc_min( seg[ fences[i].a ], fences[i].a);
            dp[i].b = calc_min( seg[ fences[i].b ], fences[i].b);

            for (int j=fences[i].a;j<=fences[i].b;++j)
            {
            seg[j] = i;
            }

            }
            printf( "%d\n",
            min(S - fences[N].a + dp[N].a, fences[N].b - S + dp[N].b)
            );

            return 0;
            }
            2012-01-29 01:28 | CWQBUPT

            # re: POJ 2374 Fence Obstacle Course 線段樹+動態規劃  回復  更多評論   

            @CWQBUPT
            因為你缺少了二分的過程,線段樹查找O(logn),而你的查找O(n)
            2016-05-07 21:20 | hez2010
            久久99精品国产麻豆宅宅| 国产精品成人精品久久久| 久久久久一级精品亚洲国产成人综合AV区| 精品久久久久久无码专区不卡| 国产美女久久精品香蕉69| 亚洲国产精品久久久久| 久久激情五月丁香伊人| 久久久久免费看成人影片| 国产精品欧美久久久久天天影视 | 国产精品日韩深夜福利久久| 国产高清国内精品福利99久久| 香蕉aa三级久久毛片| 久久777国产线看观看精品| 午夜精品久久久久成人| 情人伊人久久综合亚洲| 中文字幕乱码人妻无码久久| 国产精品久久久久久久午夜片 | 亚洲另类欧美综合久久图片区| 久久久噜噜噜久久中文福利| 欧美激情精品久久久久久| 久久91综合国产91久久精品| 狠狠色噜噜色狠狠狠综合久久| 国产精品免费久久| 久久综合九色综合精品| 久久狠狠高潮亚洲精品| 久久婷婷五月综合成人D啪| 99久久精品免费看国产免费| 亚洲av日韩精品久久久久久a| 久久久精品国产| 中文字幕无码av激情不卡久久| 99久久国产综合精品五月天喷水| 久久精品亚洲一区二区三区浴池| 久久久久久精品免费看SSS| 亚洲精品tv久久久久| 亚洲国产成人久久精品99| 久久综合色区| 久久久久se色偷偷亚洲精品av| 欧美精品丝袜久久久中文字幕 | 伊人久久大香线蕉综合Av | 99久久超碰中文字幕伊人| 久久永久免费人妻精品下载|