• <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| 中文精品久久久久人妻不卡| 国产精品日韩欧美久久综合| 久久精品无码免费不卡| 亚洲精品WWW久久久久久| 欧美噜噜久久久XXX| 精品久久久久久国产三级| 久久免费看黄a级毛片| 亚洲国产精品婷婷久久| 伊人久久精品无码av一区| 97久久精品人人澡人人爽 | 午夜精品久久久久久久久| 日本精品久久久中文字幕| 久久久久久久久久久| 亚洲国产精品久久久久婷婷老年| 一本久久免费视频| 亚洲狠狠久久综合一区77777| 欧美精品乱码99久久蜜桃| 99久久夜色精品国产网站| 亚洲精品国产美女久久久| 久久强奷乱码老熟女| 一级做a爰片久久毛片人呢| 国产精品免费看久久久| 伊人久久综合精品无码AV专区| 欧美久久一级内射wwwwww.| 国产精品一久久香蕉产线看| 一本久久a久久精品亚洲| 精品久久久久久久久免费影院| 久久国产福利免费| 久久996热精品xxxx| 久久精品国产91久久综合麻豆自制 | 国产精品久久自在自线观看| 久久久久久午夜成人影院| 亚洲国产精品无码久久久蜜芽| 无码人妻久久一区二区三区蜜桃| 久久精品国产亚洲7777| 久久免费视频一区| 久久这里的只有是精品23| 亚洲欧美日韩久久精品| 国产精品一区二区久久精品涩爱| 中文字幕久久亚洲一区|