• <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 糯米 閱讀(1371) 評論(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
            亚洲欧洲久久av| AV无码久久久久不卡蜜桃| 久久综合色区| 亚洲午夜久久久影院伊人| 97久久久精品综合88久久| 久久久亚洲精品蜜桃臀| 国产成人久久精品一区二区三区| 国产成人无码精品久久久久免费| 久久无码高潮喷水| 777米奇久久最新地址| 久久精品国产色蜜蜜麻豆| 中文字幕亚洲综合久久| 久久天天躁狠狠躁夜夜躁2O2O | 国产精品一区二区久久精品涩爱| 国内精品综合久久久40p| 青草影院天堂男人久久| 亚洲va中文字幕无码久久 | 久久精品国产一区二区三区日韩| 久久人人爽人人澡人人高潮AV| AV色综合久久天堂AV色综合在| 亚洲午夜精品久久久久久app| 精品久久人人做人人爽综合| 97久久超碰国产精品旧版| 久久狠狠爱亚洲综合影院| 一本久道久久综合狠狠躁AV| 青青青青久久精品国产h久久精品五福影院1421 | 丁香久久婷婷国产午夜视频| 久久不见久久见免费视频7| 精品伊人久久大线蕉色首页| 久久只有这里有精品4| 亚洲伊人久久成综合人影院 | 久久久久九九精品影院| 国产亚州精品女人久久久久久| 久久国产精品国产自线拍免费| 国产欧美一区二区久久| 久久91亚洲人成电影网站| 久久久久久久尹人综合网亚洲 | 久久精品中文字幕第23页| 国产高潮国产高潮久久久91| 久久99国产精品成人欧美| 亚洲国产成人乱码精品女人久久久不卡|