• <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>
            題目意思是給出平面上n個不相鄰的點,要求到這n個點的曼哈頓距離之和最小的點的個數ans2,和這個最小距離ans1。
            點的坐標范圍是-10000到10000(這個很重要)

            考慮到曼哈頓距離的定義:|x - x0| + |y - y0|
            這個定義是線性的,對稱的
            因此考慮分別在兩個方向上解這個問題(曼哈頓距離的性質)

            1。對于x方向,定義x曼哈頓距離是|x - x0|,因為坐標范圍很小,所以可以對所有可能的坐標,做一個線性掃描,求出fx,fx[x0]表示所有點到x0這個x坐標的x曼哈頓距離之和。對y方向相應地求出fy。
            2。有了fx和fy,我們可以用O(1)時間算出所有點到某一坐標(x0, y0)的曼哈頓距離之和ans1。現在選出fx[x0] + fy[y0]的最小值(剔除那些輸入的點),這一步我是把fx和fy分別排序做的,復雜度O(nlogn)。應該能利用點的不相鄰性質做得更好。
            3。現在統計滿足題意的點的個數。利用fx計算數組nx,nx[i].coor表示此點的x坐標,nx[i].num表示x坐標是nx[i].coor的點的個數,nx[i].dist表示所有點到nx[i].coor的x曼哈頓距離之和。相應地計算ny。計算數組dd,dd[i]表示所有點到第i個點的曼哈頓距離之和。令t1 = sum(nx[i].num * ny[i].num), if (nx[i].dist + ny[i].dist == ans1)。令t2 = (dd[i] == ans1) 的個數。因此ans2 = t1 - t2。

            下面是我的代碼:

            /*************************************************************************
            Author: WHU_GCC
            Created Time: 2008-1-19 20:26:13
            File Name: pku3269.cpp
            Description: 
            ***********************************************************************
            */

            #include 
            <iostream>
            #include 
            <set>
            using namespace std;

            #define out(x) (cout << #x << ": " << x << endl)
            typedef 
            long long int64;
            const int maxint = 0x7FFFFFFF;
            const int64 maxint64 = 0x7FFFFFFFFFFFFFFFLL;
            template 
            <class T> void show(T a, int n) for (int i = 0; i < n; ++i) cout << a[i] << ' '; cout << endl; }
            template 
            <class T> void show(T a, int r, int l) for (int i = 0; i < r; ++i) show(a[i], l); cout << endl; }

            const int maxn = 10010;

            struct node_t
            {
                
            int dist;
                
            int coor;
            }
            ;

            struct num_t
            {
                
            int dist;
                
            int num;
            }
            ;

            bool operator <(const node_t &a, const node_t &b)
            {
                
            return a.dist < b.dist;
            }


            int n;
            int x[maxn];
            int y[maxn];
            node_t fx[maxn 
            * 2];
            node_t fy[maxn 
            * 2];
            int hx[maxn * 2];
            int hy[maxn * 2];
            int minx, miny, maxx, maxy;
            int dd[maxn];

            set <pair<intint> > ptrset;

            num_t nx[maxn];
            num_t ny[maxn];
            int lnx, lny;

            int main()
            {
                scanf(
            "%d"&n);
                memset(hx, 
            0sizeof(hx));
                memset(hy, 
            0sizeof(hy));
                
                minx 
            = miny = maxint;
                maxx 
            = maxy = 0;
                ptrset.clear();
                
            for (int i = 0; i < n; i++)
                
            {
                    scanf(
            "%d%d"&x[i], &y[i]);
                    x[i] 
            += 10000;
                    y[i] 
            += 10000;
                    ptrset.insert(make_pair(x[i], y[i]));
                    hx[x[i]]
            ++;
                    hy[y[i]]
            ++;
                    minx 
            <?= x[i];
                    miny 
            <?= y[i];
                    maxx 
            >?= x[i];
                    maxy 
            >?= y[i];
                }

                fx[minx].dist 
            = 0;
                fx[minx].coor 
            = minx;
                
            for (int i = minx + 1; i <= maxx; i++)
                    fx[minx].dist 
            += abs(i - minx) * hx[i];
                
            int numrx = n - hx[minx];
                
            int nummx = hx[minx];
                
            int numlx = 0;
                
            for (int i = minx + 1; i <= maxx; i++)
                
            {
                    fx[i].dist 
            = fx[i - 1].dist + numlx + nummx - numrx;
                    fx[i].coor 
            = i;
                    numlx 
            += nummx;
                    nummx 
            = hx[i];
                    numrx 
            -= nummx;
                }

                fy[miny].dist 
            = 0;
                fy[miny].coor 
            = miny;
                
            for (int i = miny + 1; i <= maxy; i++)
                    fy[miny].dist 
            += abs(i - miny) * hy[i];
                
            int numry = n - hy[miny];
                
            int nummy = hy[miny];
                
            int numly = 0;
                
            for (int i = miny + 1; i <= maxy; i++)
                
            {
                    fy[i].dist 
            = fy[i - 1].dist + numly + nummy - numry;
                    fy[i].coor 
            = i;
                    numly 
            += nummy;
                    nummy 
            = hy[i];
                    numry 
            -= nummy;
                }

                
            for (int i = 0; i < n; i++)
                    dd[i] 
            = fx[x[i]].dist + fy[y[i]].dist;

                sort(fx 
            + minx, fx + maxx + 1);
                sort(fy 
            + miny, fy + maxy + 1);
                
            int ans1;
                
            for (int i = minx; i <= maxx; i++)
                    
            for (int j = miny; j <= maxy; j++)
                    
            {
                        
            if (ptrset.count(make_pair(fx[i].coor, fy[j].coor)) == 0)
                        
            {
                            ans1 
            = fx[i].dist + fy[j].dist;
                            
            goto end;
                        }

                    }

                end:;
                lnx 
            = 0;
                
            for (int i = minx; i <= maxx; i++)
                
            {
                    
            if (i == minx)
                    
            {
                        nx[lnx].dist 
            = fx[i].dist;
                        nx[lnx].num 
            = 1;
                        lnx
            ++;
                    }

                    
            else
                    
            {
                        
            if (fx[i].dist == nx[lnx - 1].dist)
                            nx[lnx 
            - 1].num++;
                        
            else
                        
            {
                            nx[lnx].dist 
            = fx[i].dist;
                            nx[lnx].num 
            = 1;
                            lnx
            ++;
                        }

                    }

                }


                lny 
            = 0;
                
            for (int i = miny; i <= maxy; i++)
                
            {
                    
            if (i == miny)
                    
            {
                        ny[lny].dist 
            = fy[i].dist;
                        ny[lny].num 
            = 1;
                        lny
            ++;
                    }

                    
            else
                    
            {
                        
            if (fy[i].dist == ny[lny - 1].dist)
                            ny[lny 
            - 1].num++;
                        
            else
                        
            {
                            ny[lny].dist 
            = fy[i].dist;
                            ny[lny].num 
            = 1;
                            lny
            ++;
                        }

                    }

                }

                
            int ans2 = 0;
                
            for (int i = 0; i < lnx; i++)
                    
            if (nx[i].dist <= ans1)
                    
            {
                        
            for (int j = 0; j < lny; j++)
                            
            if (nx[i].dist + ny[j].dist <= ans1)
                            
            {
                                
            if (nx[i].dist + ny[j].dist == ans1)
                                    ans2 
            += nx[i].num * ny[j].num;
                            }

                            
            else break;
                    }

                    
            else break;
                
            for (int i = 0; i < n; i++)
                    
            if (dd[i] == ans1)
                        ans2
            --;
                printf(
            "%d %d\n", ans1, ans2);
                
            return 0;
            }

            posted on 2008-01-20 11:22 Felicia 閱讀(1304) 評論(3)  編輯 收藏 引用 所屬分類: 雜題
            Comments
            • # re: [雜題]pku3269 曼哈頓距離的性質
              richardxx
              Posted @ 2008-02-01 23:08
              做了做,那個不相鄰的條件的確是可以利用的。。
                回復  更多評論   
            • # re: [雜題]pku3269 曼哈頓距離的性質[未登錄]
              Felicia
              Posted @ 2008-02-03 15:55
              @richardxx
              怎么用?請賜教  回復  更多評論   
            • # re: [雜題]pku3269 曼哈頓距離的性質
              richardxx
              Posted @ 2008-02-03 21:21
              分別求出x和y取最優的區間[L,R],[B,U]和最優值optx,opty,num = (R-L+1)*(U-B+1)-區域中的點,值是optx+opty.

              因為沒有鄰點,所以num = 0 iif L=R && B=U,而此時可知(L,B)這點四周都是空的,而新的最優值就是它們中的某些了。。
                回復  更多評論   
             
            国产精品无码久久综合| 久久一区二区三区免费| 国内精品伊人久久久久妇| 99久久精品国产一区二区| 97精品久久天干天天天按摩| 亚洲女久久久噜噜噜熟女| 久久亚洲国产成人影院| 国内精品伊人久久久影院| 亚洲精品蜜桃久久久久久| 亚洲精品无码久久久久sm| 久久香蕉超碰97国产精品| 久久精品亚洲中文字幕无码麻豆| 亚洲精品无码久久一线| 国产精品9999久久久久| 久久久青草久久久青草| 久久激情五月丁香伊人| 亚州日韩精品专区久久久| 国内精品伊人久久久影院| 老色鬼久久亚洲AV综合| 久久99精品综合国产首页| 精品无码久久久久久久动漫| 久久青青草原精品国产不卡| 99久久综合国产精品免费| 久久久无码精品亚洲日韩蜜臀浪潮| 久久综合88熟人妻| 99热热久久这里只有精品68| 亚洲欧美成人久久综合中文网 | 久久青青国产| 日韩精品久久无码中文字幕| 久久99精品久久久久久| 性做久久久久久久久久久| 99久久综合狠狠综合久久止| 精品无码久久久久久久久久 | 亚洲香蕉网久久综合影视| 国产午夜福利精品久久2021| 久久e热在这里只有国产中文精品99| 亚洲国产成人久久笫一页| 久久66热人妻偷产精品9| 色偷偷88欧美精品久久久| 精品国产一区二区三区久久| 久久久久久久精品妇女99|