• <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>

            The Fourth Dimension Space

            枯葉北風(fēng)寒,忽然年以殘,念往昔,語默心酸。二十光陰無一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢令

            #

            discovery(探索發(fā)現(xiàn))下載地址

                 摘要: 美國探索節(jié)目  閱讀全文

            posted @ 2009-08-26 11:18 abilitytao 閱讀(1500) | 評論 (0)編輯 收藏

            差分約束系統(tǒng)(System Of Difference Constraints)

            (本文假設(shè)讀者已經(jīng)有以下知識:最短路徑的基本性質(zhì)、Bellman-Ford算法。)
                比如有這樣一組不等式:
               
            X1 - X2 <= 0
            X1 - X5 <= -1
            X2 - X5 <= 1
            X3 - X1 <= 5
            X4 - X1 <= 4
            X4 - X3 <= -1
            X5 - X3 <= -3
            X5 - X4 <= -3
            不等式組(1)

                全都是兩個(gè)未知數(shù)的差小于等于某個(gè)常數(shù)(大于等于也可以,因?yàn)樽笥页艘?1就可以化成小于等于)。這樣的不等式組就稱作差分約束系統(tǒng)。
                這個(gè)不等式組要么無解,要么就有無數(shù)組解。因?yàn)槿绻幸唤M解{X1, X2, ..., Xn}的話,那么對于任何一個(gè)常數(shù)k,{X1 + k, X2 + k, ..., Xn + k}肯定也是一組解,因?yàn)槿魏蝺蓚€(gè)數(shù)同時(shí)加一個(gè)數(shù)之后,它們的差是不變的,那么這個(gè)差分約束系統(tǒng)中的所有不等式都不會被破壞。
               
                差分約束系統(tǒng)的解法利用到了單源最短路徑問題中的三角形不等式。即對于任何一條邊u -> v,都有:

            d(v) <= d(u) + w(u, v)

                其中d(u)和d(v)是從源點(diǎn)分別到點(diǎn)u和點(diǎn)v的最短路徑的權(quán)值,w(u, v)是邊u -> v的權(quán)值。
                顯然以上不等式就是d(v) - d(u) <= w(u, v)。這個(gè)形式正好和差分約束系統(tǒng)中的不等式形式相同。于是我們就可以把一個(gè)差分約束系統(tǒng)轉(zhuǎn)化成一張圖,每個(gè)未知數(shù)Xi對應(yīng)圖中的一個(gè)頂點(diǎn)Vi,把所有不等式都化成圖中的一條邊。對于不等式Xi - Xj <= c,把它化成三角形不等式:Xi <= Xj + c,就可以化成邊Vj -> Vi,權(quán)值為c。最后,我們在這張圖上求一次單源最短路徑,這些三角形不等式就會全部都滿足了,因?yàn)樗亲疃搪窂絾栴}的基本性質(zhì)嘛。
                話說回來,所謂單源最短路徑,當(dāng)然要有一個(gè)源點(diǎn),然后再求這個(gè)源點(diǎn)到其他所有點(diǎn)的最短路徑。那么源點(diǎn)在哪呢?我們不妨自已造一個(gè)。以上面的不等式組為例,我們就再新加一個(gè)未知數(shù)X0。然后對原來的每個(gè)未知數(shù)都對X0隨便加一個(gè)不等式(這個(gè)不等式當(dāng)然也要和其它不等式形式相同,即兩個(gè)未知數(shù)的差小于等于某個(gè)常數(shù))。我們索性就全都寫成Xn - X0 <= 0,于是這個(gè)差分約束系統(tǒng)中就多出了下列不等式:
               
            X1 - X0 <= 0
            X2 - X0 <= 0
            X3 - X0 <= 0
            X4 - X0 <= 0
            X5 - X0 <= 0

            不等式組(2)

                對于這5個(gè)不等式,也在圖中建出相應(yīng)的邊。最后形成的圖如下:


            圖1

                圖中的每一條邊都代表差分約束系統(tǒng)中的一個(gè)不等式。現(xiàn)在以V0為源點(diǎn),求單源最短路徑。最終得到的V0到Vn的最短路徑長度就是Xn的一個(gè)解啦。從圖1中可以看到,這組解是{-5, -3, 0, -1, -4}。當(dāng)然把每個(gè)數(shù)都加上10也是一組解:{5, 7, 10, 9, 6}。但是這組解只滿足不等式組(1),也就是原先的差分約束系統(tǒng);而不滿足不等式組(2),也就是我們后來加上去的那些不等式。當(dāng)然這是無關(guān)緊要的,因?yàn)閄0本來就是個(gè)局外人,是我們后來加上去的,滿不滿足與X0有關(guān)的不等式我們并不在乎。
                也有可能出現(xiàn)無解的情況,也就是從源點(diǎn)到某一個(gè)頂點(diǎn)不存在最短路徑。也說是圖中存在負(fù)權(quán)的圈。這一點(diǎn)我就不展開了,請自已參看最短路徑問題的一些基本定理。

                其實(shí),對于圖1來說,它代表的一組解其實(shí)是{0, -5, -3, 0, -1, -4},也就是說X0的值也在這組解當(dāng)中。但是X0的值是無可爭議的,既然是以它作為源點(diǎn)求的最短路徑,那么源點(diǎn)到它的最短路徑長度當(dāng)然是0了。因此,實(shí)際上我們解的這個(gè)差分約束系統(tǒng)無形中又存在一個(gè)條件:

            X0 = 0

                也就是說在不等式組(1)、(2)組成的差分約束系統(tǒng)的前提下,再把其中的一個(gè)未知數(shù)的值定死。這樣的情況在實(shí)際問題中是很常見的。比如一個(gè)問題表面上給出了一些不等式,但還隱藏著一些不等式,比如所有未知數(shù)都大于等于0或者都不能超過某個(gè)上限之類的。比如上面的不等式組(2)就規(guī)定了所有未知數(shù)都小于等于0。
               
                對于這種有一個(gè)未知數(shù)定死的差分約束系統(tǒng),還有一個(gè)有趣的性質(zhì),那就是通過最短路徑算法求出來的一組解當(dāng)中,所有未知數(shù)都達(dá)到最大值。下面我來粗略地證明一下,這個(gè)證明過程要結(jié)合Bellman-Ford算法的過程來說明。
                假設(shè)X0是定死的;X1到Xn在滿足所有約束的情況下可以取到的最大值分別為M1、M2、……、Mn(當(dāng)然我們不知道它們的值是多少);解出的源點(diǎn)到每個(gè)點(diǎn)的最短路徑長度為D1、D2、……、Dn。
                基本的Bellman-Ford算法是一開始初始化D1到Dn都是無窮大。然后檢查所有的邊對應(yīng)的三角形不等式,一但發(fā)現(xiàn)有不滿足三角形不等式的情況,則更新對應(yīng)的D值。最后求出來的D1到Dn就是源點(diǎn)到每個(gè)點(diǎn)的最短路徑長度。
                如果我們一開始初始化D1、D2、……、Dn的值分別為M1、M2、……、Mn,則由于它們?nèi)紳M足三角形不等式(我們剛才已經(jīng)假設(shè)M1到Mn是一組合法的解),則Bellman-Ford算法不會再更新任合D值,則最后得出的解就是M1、M2、……、Mn。
                好了,現(xiàn)在知道了,初始值無窮大時(shí),算出來的是D1、D2、……、Dn;初始值比較小的時(shí)候算出來的則是M1、M2、……、Mn。大家用的是同樣的算法,同樣的計(jì)算過程,總不可能初始值大的算出來的結(jié)果反而小吧。所以D1、D2、……、Dn就是M1、M2、……、Mn。
               
                那么如果在一個(gè)未知數(shù)定死的情況下,要求其它所有未知數(shù)的最小值怎么辦?只要反過來求最長路徑就可以了。最長路徑中的三角不等式與最短路徑中相反:

            d(v) >= d(u) + w(u, v)
            也就是 d(v) - d(u) >= w(u, v)


                所以建圖的時(shí)候要先把所有不等式化成大于等于號的。其它各種過程,包括證明為什么解出的是最小值的證法,都完全類似。
                
                用到差分約束系統(tǒng)的題目有ZJU 2770,祝好運(yùn)。

            轉(zhuǎn)自:http://imlazy.ycool.com/post.1702305.html

            posted @ 2009-08-21 23:34 abilitytao 閱讀(2328) | 評論 (6)編輯 收藏

            POJ 3322 Bloxorz I(BFS, 改編自同名游戲,很不錯(cuò)的一題)

                 摘要: Bloxorz I Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 2624 Acce...  閱讀全文

            posted @ 2009-08-16 22:25 abilitytao 閱讀(1849) | 評論 (4)編輯 收藏

            POJ 1631 Bridging signals——最長上升子序列 DP(nlogn)

            題目說了很多,其實(shí)就是一個(gè)最長上升子序列的問題,傳統(tǒng)的n^2算法在這里會超時(shí),所以改用二分的算法,1000MS的時(shí)限用掉110MS,差強(qiáng)人意,但不知還有沒有更快的算法,希望各位大牛能指點(diǎn)一二。
            代碼如下:(閱讀前建議先閱讀我轉(zhuǎn)的上一篇關(guān)于算法介紹的文章)
            #include<iostream>
            #include
            <cstdio>
            using namespace std;


            const int N =  40000;

            int a[N], C[N], f[N]; // f[i]用于記錄a[0i]的最大長度

            int bsearch(const int *C, int size, const int &a) 

            {
                
                
            int l=0, r=size-1;
                
                
            while( l <= r ) 
                    
                
            {
                    
                    
            int mid = (l+r)/2;
                    
                    
            if( a > C[mid-1&& a <= C[mid] ) return mid; // >&&<= 換為: >= && <
                    
                    
            else if( a < C[mid] ) r = mid-1;
                    
                    
            else l = mid+1;
                    
                }

                
            }


            int LIS(const int *a, const int &n){
                
                
            int i, j, size = 1;
                
                C[
            0= a[0]; f[0= 1;
                
                
            for( i=1; i < n; ++i ){
                    
                    
            if( a[i] <= C[0] ) j = 0;                 // <= 換為: <
                    
                    
            else if( a[i] >C[size-1] ) j = size++;   // > 換為: >= 
                    
                    
            else j = bsearch(C, size, a[i]);
                    
                    C[j] 
            = a[i]; f[i] = j+1;
                    
                }

                
                
            return size;
                
            }




            int main()
            {
                
            int testcase;
                
            int n;
                scanf(
            "%d",&testcase);
                
            int i,j;
                
            for(i=1;i<=testcase;i++)
                
            {
                    scanf(
            "%d",&n);
                    
            for(j=0;j<n;j++)
                        scanf(
            "%d",&a[j]);
                    printf(
            "%d\n",LIS(a,n));
                }

                
            return 0;
            }

            posted @ 2009-08-12 19:14 abilitytao 閱讀(1855) | 評論 (1)編輯 收藏

            最長不降子序列的nlogn算法 (轉(zhuǎn))

            所謂“最長不降子序列問題”,就是在一個(gè)給定的序列中尋找一個(gè)子序列{ai}滿足:

                                   a1<=a2<=...<an

            這個(gè)問題在一般教材上,往往會作為動態(tài)規(guī)劃的引例。

            即使用如下的狀態(tài)轉(zhuǎn)移方程進(jìn)行計(jì)算:

                               F[i]=max{F[j]}+1     aj<=ai

            但是它的復(fù)雜度是O(n^2)的,對于稍大的規(guī)模便無法承受。

            那么有沒有改進(jìn)的方法呢?答案是肯定的。

            ----------------------------------------------------------------分割線------------------------------------------------------------------------------------------

            我們維護(hù)一個(gè)數(shù)組C[i],這里C[i]表示F值為i的最小數(shù)。

            不難發(fā)現(xiàn)   C[1]<=C[2]<=...<=C[n]

            因此我們可以利用C[]通過二分查找確定F[j]的值。

            ----------------------------------------------------------------分割線------------------------------------------------------------------------------------------

            實(shí)現(xiàn)如下:

            const int N = 1001;

            int a[N], C[N], f[N]; // f[i]用于記錄a[0...i]的最大長度

            int bsearch(const int *C, int size, const int &a)

            {

                int l=0, r=size-1;

                while( l <= r )

                {

                    int mid = (l+r)/2;

                    if( a > C[mid-1] && a <= C[mid] ) return mid; // >&&<= 換為: >= && <

                    else if( a < C[mid] ) r = mid-1;

                    else l = mid+1;

                }

            }

            int LIS(const int *a, const int &n){

                 int i, j, size = 1;

                 C[0] = a[0]; f[0] = 1;

                 for( i=1; i < n; ++i ){

                      if( a[i] <= C[0] ) j = 0;                 // <= 換為: <

                     else if( a[i] >C[size-1] ) j = size++;   // > 換為: >=

                     else j = bsearch(C, size, a[i]);

                     C[j] = a[i]; f[i] = j+1;

                 }

                 return size;

            }

            ------------------------------------------------------------------分割線------------------------------------------------------------------------------------------

            至此,我們了解了O(nlogn)的算法,它主要是利用了二分查找的方法對樸素的動態(tài)規(guī)劃進(jìn)行加速、優(yōu)化,從而達(dá)到理想的效率。



            轉(zhuǎn)自:http://fqq11679.blog.hexun.com/21632261_d.html

            posted @ 2009-08-12 18:27 abilitytao 閱讀(413) | 評論 (0)編輯 收藏

            POJ 計(jì)算幾何入門題目推薦(轉(zhuǎn))

            計(jì)算幾何題的特點(diǎn)與做題要領(lǐng):
            1.大部分不會很難,少部分題目思路很巧妙
            2.做計(jì)算幾何題目,模板很重要,模板必須高度可靠。
            3.要注意代碼的組織,因?yàn)橛?jì)算幾何的題目很容易上兩百行代碼,里面大部分是模板。如果代碼一片混亂,那么會嚴(yán)重影響做題正確率。
            4.注意精度控制。
            5.能用整數(shù)的地方盡量用整數(shù),要想到擴(kuò)大數(shù)據(jù)的方法(擴(kuò)大一倍,或擴(kuò)大sqrt2)。因?yàn)檎麛?shù)不用考慮浮點(diǎn)誤差,而且運(yùn)算比浮點(diǎn)快。

            一。點(diǎn),線,面,形基本關(guān)系,點(diǎn)積叉積的理解

            POJ 2318 TOYS(推薦)
            http://acm.pku.edu.cn/JudgeOnline/problem?id=2318
            POJ 2398 Toy Storage(推薦)
            http://acm.pku.edu.cn/JudgeOnline/problem?id=2398
            一個(gè)矩形,有被若干直線分成N個(gè)格子,給出一個(gè)點(diǎn)的坐標(biāo),問你該點(diǎn)位于哪個(gè)點(diǎn)中。
            知識點(diǎn):其實(shí)就是點(diǎn)在凸四邊形內(nèi)的判斷,若利用叉積的性質(zhì),可以二分求解。

            POJ 3304 Segments
            http://acm.pku.edu.cn/JudgeOnline/problem?id=3304
            知識點(diǎn):線段與直線相交,注意枚舉時(shí)重合點(diǎn)的處理

            POJ 1269 Intersecting Lines
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1269
            知識點(diǎn):直線相交判斷,求相交交點(diǎn)

            POJ 1556 The Doors (推薦)
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1556
            知識點(diǎn):簡單圖論+簡單計(jì)算幾何,先求線段相交,然后再用Dij求最短路。

            POJ 2653 Pick-up sticks
            http://acm.pku.edu.cn/JudgeOnline/problem?id=2653
            知識點(diǎn):還是線段相交判斷

            POJ 1066 Treasure Hunt
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1066
            知識點(diǎn):線段相交判斷,不過必須先理解“走最少的門”是怎么一回事。

            POJ 1410 Intersection
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1410
            知識點(diǎn):線段與矩形相交。正確理解題意中相交的定義。
            詳見:
            http://hi.baidu.com/novosbirsk/blog/item/68c682c67e8d1f1d9d163df0.html

            POJ 1696 Space Ant (推薦)
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1696
            德黑蘭賽區(qū)的好題目。需要理解點(diǎn)積叉積的性質(zhì)

            POJ 3347 Kadj Squares
            http://acm.pku.edu.cn/JudgeOnline/problem?id=3347
            本人的方法極度猥瑣。復(fù)雜的線段相交問題。這個(gè)題目是計(jì)算幾何的擴(kuò)大數(shù)據(jù)運(yùn)算的典型應(yīng)用,擴(kuò)大根號2倍之后就避免了小數(shù)。

            POJ 2826 An Easy Problem?! (推薦)
            http://acm.pku.edu.cn/JudgeOnline/problem?id=2826
            問:兩條直線組成一個(gè)圖形,能容納多少雨水。很不簡單的Easy Problem,要考慮所有情況。你不看discuss看看能否AC。(本人基本不能)提示一下,水是從天空垂直落下的。

            POJ 1039 Pipe
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1039
            又是線段與直線相交的判斷,再加上枚舉的思想即可。

            POJ 3449 Geometric Shapes
            http://acm.pku.edu.cn/JudgeOnline/problem?id=3449
            判斷幾何體是否相交,不過輸入輸出很惡心。
            此外,還有一個(gè)知識點(diǎn),就是給出一個(gè)正方形(邊不與軸平行)的兩個(gè)對角線上的頂點(diǎn),需要你求出另外兩個(gè)點(diǎn)。必須掌握其方法。

            POJ 1584 A Round Peg in a Ground Hole
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1584
            知識點(diǎn):點(diǎn)到直線距離,圓與多邊形相交,多邊形是否為凸

            POJ 2074 Line of Sight (推薦)
            http://acm.pku.edu.cn/JudgeOnline/problem?id=2074
            與視線問題的解法,關(guān)鍵是求過兩點(diǎn)的直線方程,以及直線與線段的交點(diǎn)。數(shù)據(jù)有一個(gè)trick,要小心。

            二。凸包問題

            POJ 1113 Wall
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1113
            知識點(diǎn):赤裸裸的凸包問題,凸包周長加上圓周。

            POJ 2007 Scrambled Polygon
            http://acm.pku.edu.cn/JudgeOnline/problem?id=2007
            知識點(diǎn):凸包,按極角序輸出方案

            POJ 1873 The Fortified Forest (推薦)
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1873
            World Final的水題,先求凸包,然后再搜索。由于規(guī)模不大,可以使用位運(yùn)算枚舉。
            詳見:
            http://hi.baidu.com/novosbirsk/blog/item/333abd54c7f22c52574e0067.html

            POJ 1228 Grandpa's Estate (推薦)
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1228
            求凸包頂點(diǎn)數(shù)目,很多人求凸包的模板是會多出點(diǎn)的,雖然求面積時(shí)能得到正確答案,但是在這個(gè)題目就會出問題。此外,還要正確理解凸包的性質(zhì)。

            POJ 3348 Cows
            http://acm.pku.edu.cn/JudgeOnline/problem?id=3348
            凸包面積計(jì)算

            三。面積問題,公式問題

            POJ 1654 Area
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1654
            知識點(diǎn):利用有向面積(叉積)計(jì)算多邊形面積

            POJ 1265 Area
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1265
            POJ 2954 Triangle
            http://acm.pku.edu.cn/JudgeOnline/problem?id=2954
            Pick公式的應(yīng)用,多邊形與整點(diǎn)的關(guān)系。(存在一個(gè)GCD的關(guān)系)

            四。半平面交

            半平面交的主要應(yīng)用是判斷多邊形是否存在核,還可以解決一些與線性方程組可行區(qū)域相關(guān)的問題(就是高中時(shí)的那些)。

            POJ 3335 Rotating Scoreboard
            http://acm.pku.edu.cn/JudgeOnline/problem?id=3335
            POJ 3130 How I Mathematician Wonder What You Are!
            http://acm.pku.edu.cn/JudgeOnline/problem?id=3130
            POJ 1474 Video Surveillance
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1474
            知識點(diǎn):半平面交求多邊形的核,存在性判斷

            POJ 1279 Art Gallery
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1279
            半平面交求多邊形的核,求核的面積

            POJ 3525 Most Distant Point from the Sea (推薦)
            http://acm.pku.edu.cn/JudgeOnline/problem?id=3525
            給出一個(gè)多邊形,求里面的一個(gè)點(diǎn),其距離離多邊形的邊界最遠(yuǎn),也就是多邊形中最大半徑圓。
            可以使用半平面交+二分法解。二分這個(gè)距離,邊向內(nèi)逼近,直到達(dá)到精度。

            POJ 3384 Feng Shui (推薦)
            http://acm.pku.edu.cn/JudgeOnline/problem?id=3384
            半平面交實(shí)際應(yīng)用,用兩個(gè)圓覆蓋一個(gè)多邊形,問最多能覆蓋多邊形的面積。
            解法:用半平面交將多邊形的每條邊一起向“內(nèi)”推進(jìn)R,得到新的多邊形,然后求多邊形的最遠(yuǎn)兩點(diǎn)。

            POJ 1755 Triathlon (推薦)
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1755
            半平面交判斷不等式是否有解。注意不等式在轉(zhuǎn)化時(shí)正負(fù)號的選擇,這直接影響到半平面交的方向。

            POJ 2540 Hotter Colder
            http://acm.pku.edu.cn/JudgeOnline/problem?id=2540
            半平面交求線性規(guī)劃可行區(qū)域的面積。

            POJ 2451 Uyuw's Concert
            http://acm.pku.edu.cn/JudgeOnline/problem?id=2451
            Zzy專為他那篇nlogn算法解決半平面交問題的論文而出的題目。

            五。計(jì)算幾何背景,實(shí)際上解題的關(guān)鍵是其他問題(數(shù)據(jù)結(jié)構(gòu)、組合數(shù)學(xué),或者是枚舉思想)
            若干道經(jīng)典的離散化+掃描線的題目,ACM選手必做題目

            POJ 1151 Atlantis (推薦)
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1151
            POJ 1389 Area of Simple Polygons
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1389
            矩形離散化,線段樹處理,矩形面積求交

            POJ 1177 Picture (推薦

            http://acm.pku.edu.cn/JudgeOnline/problem?id=1177
            矩形離散化,線段樹處理,矩形交的周長,這個(gè)題目的數(shù)據(jù)比較強(qiáng)。線段樹必須高效。

            POJ 3565 Ants (推薦)
            http://acm.pku.edu.cn/JudgeOnline/problem?id=3565
            計(jì)算幾何中的調(diào)整思想,有點(diǎn)像排序。要用到線段相交的判斷。
            詳見:
            http://hi.baidu.com/novosbirsk/blog/item/fb668cf0f362bec47931aae2.html


            POJ 3695 Rectangles   
            http://acm.pku.edu.cn/JudgeOnline/problem?id=3695
            又是矩形交的面積,但是由于是多次查詢,而且矩形不多,使用組合數(shù)學(xué)中的容斥原理解決之最適合。線段樹是通法,但是除了線段樹,還有其他可行的方法。

            POJ 2002 Squares   
            http://acm.pku.edu.cn/JudgeOnline/problem?id=2002
            枚舉思想,求平面上若干個(gè)點(diǎn)最多能組成多少個(gè)正方形,點(diǎn)的Hash

            POJ 1434 Fill the Cisterns!(推薦)
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1434
            一開始發(fā)昏了,準(zhǔn)備弄個(gè)線段樹。其實(shí)只是個(gè)簡單的二分。

            六。隨機(jī)算法
            POJ 2420 A Star not a Tree?
            http://acm.pku.edu.cn/JudgeOnline/problem?id=2420
            多邊形的費(fèi)馬點(diǎn)。所謂費(fèi)馬點(diǎn),就是多邊形中一個(gè)點(diǎn)P,該點(diǎn)到其他點(diǎn)的距離之和最短。四邊形以上的多邊形沒有公式求費(fèi)馬點(diǎn),因此可以使用隨機(jī)化變步長貪心法。
            詳見:
            http://hi.baidu.com/novosbirsk/blog/item/75983f138499f825dd54019b.html

            七。解析幾何
            這種題目本人不擅長,所以做得不多,模板很重要。當(dāng)然,熟練運(yùn)用叉積、點(diǎn)積的性質(zhì)還是很有用的。
            POJ 1375 Intervals
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1375
            知識點(diǎn):過圓外一點(diǎn)求與圓的切線

            POJ 1329 Circle Through Three Points   
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1329
            求三角形外接圓

            POJ 2354 Titanic
            http://acm.pku.edu.cn/JudgeOnline/problem?id=2354
            求球面上兩個(gè)點(diǎn)的距離,而且給的是地理經(jīng)緯坐標(biāo)。

            POJ 1106 Transmitters
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1106
            角度排序,知道斜率求角度,使用atan函數(shù)。

            POJ 1673 EXOCENTER OF A TRIANGLE
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1673
            可以轉(zhuǎn)化為三角形的垂心問題。

            八。旋轉(zhuǎn)卡殼

            POJ 2187 Beauty Contest
            http://acm.pku.edu.cn/JudgeOnline/problem?id=2187
            凸包求最遠(yuǎn)點(diǎn)對。可以暴力枚舉,也可以使用旋轉(zhuǎn)卡殼。

            POJ 3608 Bridge Across Islands(難)
            http://acm.pku.edu.cn/JudgeOnline/problem?id=3608
            兩個(gè)凸包的最近距離。本人的卡殼始終WA。郁悶。

            九。其他問題
            POJ 1981 Circle and Points
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1981
            求單位圓最多能覆蓋平面上多少個(gè)點(diǎn)

            posted @ 2009-08-07 01:15 abilitytao 閱讀(1776) | 評論 (0)編輯 收藏

            POJ 1066——Treasure Hunt解題報(bào)告

            我剛開始被這道題目的名字吸引了,因?yàn)樗蛯毑赜嘘P(guān),呵呵^_^不過把題目讀完以后才發(fā)現(xiàn)這道題是個(gè)無聊的計(jì)算幾何題 ,說實(shí)話有點(diǎn)失望。。。

            題目的大意是這樣的:尋寶者在一個(gè)被分割成很多房間的正方形迷宮里尋寶,這個(gè)迷宮是100*100的正方形而且四個(gè)頂點(diǎn)坐標(biāo)一定。尋寶者具有把墻鑿穿通過的能力,若尋寶者可以從正方形的任意一個(gè)邊界進(jìn)入,問到達(dá)藏寶地點(diǎn)最少要穿過幾道墻?

            這個(gè)題的解法是:枚舉每一個(gè)入口。然后在所有的情況中取穿墻數(shù)最少的輸出即可。
            考察每一個(gè)入口的時(shí)候,枚舉每條邊,如果起點(diǎn)和終點(diǎn)在這條直線的兩側(cè),那么尋寶者一定要穿過一道墻。于是此題轉(zhuǎn)化成了判斷2點(diǎn)是否在一條直線的異側(cè)的問題。模板解決~

            由于自己寫的有點(diǎn)冗長,于是參考了下網(wǎng)上的代碼,發(fā)現(xiàn)將所有邊界上的點(diǎn)按照角度排序的確是個(gè)很巧妙的方法,學(xué)習(xí)了^_^

            //coded by abilitytao
            //Time:2009年8月5日17:50:19

            #include
            <iostream>
            #include
            <cmath>
            #include
            <algorithm>
            using namespace std;
            double const EPS = 1e-8;
            const int INF = 0xf777777;
            #define zero(x) (((x)>0?(x):-(x))<eps) 



            struct Point
            {
                
            double x,y;
                Point()
            {}
                   Point(
            double a, double b):x(a), y(b){}
                   
            bool operator<(Point a){return atan2(y - 50, x - 50< atan2(a.y - 50, a.x - 50); }
            }


            struct Line// 定義一條線段,用起點(diǎn)和終點(diǎn)來表示 
            {               
                Point a, b; 
                Line() 
            {} 
                Line(Point p10, Point p20): a(p10), b(p20) 
            {} //Line a(p1,p2);
            }



            Point mypoint[
            64], s, t;
            Line myline[
            30];
            int n, countnum, minnum;

            double xmult(Point p1, Point p2 , Point p0)
            {
                
            return (p1.x - p0.x)*(p2.y - p0.y)-(p2.x - p0.x)*(p1.y - p0.y);
            }

            int same_side(Point p1,Point p2,Line l)

                
            return xmult(l.a,p1,l.b)*xmult(l.a,p2,l.b)>EPS; 
            }


            int main()
            {
                
            int i, j, ans;
                minnum 
            = INF; countnum = 0;
                mypoint[countnum
            ++= Point(00);
                mypoint[countnum
            ++= Point(1000);
                mypoint[countnum
            ++= Point(0100);
                mypoint[countnum
            ++= Point(100100);
                
                cin 
            >> n;
                
            for(i = 0; i < n; i++)
                
            {
                    scanf(
            "%lf%lf%lf%lf",&myline[i].a.x ,&myline[i].a.y ,&myline[i].b.x ,&myline[i].b.y);
                    mypoint[countnum
            ++= myline[i].a;
                    mypoint[countnum
            ++= myline[i].b;
                }

                scanf(
            "%lf%lf",&s.x,&s.y);
                
                   sort(mypoint, mypoint
            +countnum);
                   
                   
            for(i=0;i<countnum;i++ )
                   
            {
                       ans 
            = 0;
                       t 
            = Point( (mypoint[i].x + mypoint[(i+1)%countnum].x)/2, (mypoint[i].y + mypoint[(i+1)%countnum].y)/2 );
                       
            for(j = 0; j < n; j++)          
                           
            if(!same_side(s, t, myline[j]))
                               ans
            ++;
                        
            if(ans <minnum) minnum = ans;
                   }

                   
                   printf(
            "Number of doors = %d\n", minnum+1);
                   
            return 0;
            }

            posted @ 2009-08-05 23:58 abilitytao 閱讀(1563) | 評論 (0)編輯 收藏

            2009年ACM-ICPC亞洲區(qū)預(yù)選賽共設(shè)十五個(gè)賽區(qū)如下(按現(xiàn)場賽日期排序):

            1、Harbin 哈爾濱賽區(qū)(哈爾濱工業(yè)大學(xué))
            網(wǎng)絡(luò)選拔賽日期:2009年9月13日 14:00-17:00
            現(xiàn)場賽日期:2009年9月26日~27日
            http://acm.hit.edu.cn/

            2、Dhaka 達(dá)卡賽區(qū)(孟加拉國 Northsouth University)
            現(xiàn)場賽日期:2009年10月3日
            http://www.northsouth.edu/acm/

            3、Gwalior-Kanpur 瓜廖爾-坎普爾賽區(qū)(印度 IIITM Gwalior and Indian Institute of Technology, India)
            現(xiàn)場賽日期:2009年10月3日~4日
            http://www.cse.iitk.ac.in/users/acm/

            4、Hefei 合肥賽區(qū)(中國科學(xué)技術(shù)大學(xué))
            網(wǎng)絡(luò)選拔賽日期:2009年9月6日 14:00-17:00
            現(xiàn)場賽日期:2009年10月10日~11日
            http://acm.ustc.edu.cn/

            5、Ningbo 寧波賽區(qū)(浙江大學(xué)寧波理工學(xué)院)
            網(wǎng)絡(luò)選拔賽日期:2009年9月12日
            現(xiàn)場賽日期:2009年10月17日~18日
            http://acmasia09.nit.net.cn/

            6、Jakarta 雅加達(dá)賽區(qū)(印尼 Binus University)
            現(xiàn)場賽日期:2009年10月21日
            http://icpc.ewubd.edu/

            7、Manila 馬尼拉賽區(qū)(菲律賓 Ateneo de Manila University)
            現(xiàn)場賽日期:2009年10月22日~23日
            http://www.math.admu.edu.ph/acm/

            8、Shanghai 上海賽區(qū)(東華大學(xué))
            網(wǎng)絡(luò)選拔賽日期:2009年9月20日(12:00-17:00)
            現(xiàn)場賽日期:2009年10月24日~25日
            http://acm.dhu.edu.cn

            9、Hsinchu 新竹賽區(qū)(交通大學(xué))
            報(bào)名截止日期:2009年8月19日
            現(xiàn)場賽日期:2009年10月30日~31日
            http://icpc2009.nctu.edu.tw/

            10、Wuhan 武漢賽區(qū)(武漢大學(xué))
            網(wǎng)絡(luò)選拔賽日期:2009年10月3
            現(xiàn)場賽日期:2009年10月31日~11月1日
            http://acm.whu.edu.cn/

            11、Amritapuri 阿姆里塔普里賽區(qū)(印度 Amrita Vishwa Vidyapeetham, Amritapuri Campus)
            現(xiàn)場賽日期:2009年11月1日
            http://icpc.amrita.ac.in/

            12、Phuket 普吉島賽區(qū)(泰國 Prince of Songkla University, Phuket Campus)
            報(bào)名截止日期:2009年9月30日
            現(xiàn)場賽日期:2009年11月3日~4日
            http://www.acmicpc-thailand.org/

            13、Seoul 首爾賽區(qū)(韓國 Korea Advanced Institute of Science and Technology)
            報(bào)名截止日期:2009年9月11日
            現(xiàn)場賽日期:2009年11月5日~6日
            http://acm.kaist.ac.kr/

            14、Tehran 德黑蘭賽區(qū)(伊朗 Sharif University of Technology)
            現(xiàn)場賽日期:2009年11月6日
            http://sharif.edu/~acmicpc

            15、Tokyo 東京賽區(qū)(日本早稻田大學(xué))
            現(xiàn)場賽日期:2009年11月7日~8日
            http://www.waseda.jp/assoc-icpc2009/en/index.html

            參賽報(bào)名網(wǎng)址

            http://cm.baylor.edu/welcome.icpc

            亞洲高校可組隊(duì)參加全部十五個(gè)賽區(qū)的預(yù)選賽,但每位參賽選手最多只能注冊參加兩個(gè)賽區(qū)的預(yù)選賽。

            posted @ 2009-08-04 17:08 abilitytao 閱讀(1726) | 評論 (0)編輯 收藏

            計(jì)算幾何模板整理

            #include<iostream>
            #include
            <cmath>
            #include
            <algorithm>
            using namespace std;

            struct Point // 定義一個(gè)點(diǎn)
            {              
                
            double x, y;  
                Point() 
            {} 
                Point(
            double x0, double y0): x(x0), y(y0) {} //Point a(1.0,2.0);
            }


            struct Line// 定義一條線段,用起點(diǎn)和終點(diǎn)來表示 
            {               
                Point p1, p2; 
                Line() 
            {} 
                Line(Point p10, Point p20): p1(p10), p2(p20) 
            {} //Line a(p1,p2);
            }


            //定義叉積:
            //1.如果返回值為正數(shù),表明sp在op->ep(op指向ep)這條射線的順時(shí)針方向;
            //2.如果返回值為負(fù)數(shù),表明sp在op->ep(op指向ep)這條射線的逆時(shí)針方向;
            //3.如果返回值為0,表明三點(diǎn)共線
            double multiply(Point sp,Point ep,Point op)
            {
                
            return((sp.x-op.x)*(ep.y-op.y) - (ep.x-op.x)*(sp.y-op.y));
            }

            posted @ 2009-08-04 16:35 abilitytao 閱讀(226) | 評論 (0)編輯 收藏

            POJ 2318 toys 叉積的簡單運(yùn)用

            題目意思很簡單,把一個(gè)盒子分成很多部分,往盒子里扔小球,小球的落點(diǎn)當(dāng)然要告訴你拉,讓你統(tǒng)計(jì)每個(gè)盒子里最后擁有的小球數(shù)。
            我的做法是叉積+二分。
            #include<iostream>
            #include
            <cmath>
            #include
            <algorithm>
            using namespace std;

            struct Point 
            {              // 二維點(diǎn)或矢量 
                double x, y;  
                Point() 
            {} 
                Point(
            double x0, double y0): x(x0), y(y0) {} 
            }


            struct Line
             
            {               // 二維的直線或線段 
                Point p1, p2; 
                Line() 
            {} 
                Line(Point p10, Point p20): p1(p10), p2(p20) 
            {} 
            }



            double multiply(Point sp,Point ep,Point op)
            {
                
            return((sp.x-op.x)*(ep.y-op.y) - (ep.x-op.x)*(sp.y-op.y));
            }




            Line myline[
            5100];
            int record[5100];


            int main()
            {

                
            int n,m,i;
                Point left;
                Point right;
                
            while(scanf("%d",&n))
                
            {

                    
            if(n==0)
                        
            break;
                    memset(record,
            0,sizeof(record));
                    scanf(
            "%d%lf%lf%lf%lf",&m,&left.x,&left.y,&right.x,&right.y);
                    myline[
            0].p1.x=left.x;
                    myline[
            0].p1.y=right.y;
                    myline[
            0].p2.x=left.x;
                    myline[
            0].p2.y=left.y;
                    
            for(i=1;i<=n;i++)
                    
            {
                        scanf(
            "%lf%lf",&myline[i].p2.x,&myline[i].p1.x);
                        myline[i].p1.y
            =right.y;
                        myline[i].p2.y
            =left.y;

                    }

                    myline[n
            +1].p1.x=right.x;
                    myline[n
            +1].p1.y=right.y;
                    myline[n
            +1].p2.x=right.x;
                    myline[n
            +1].p2.y=left.y;
                    
                    Point toy;
                    
            for(i=1;i<=m;i++)
                    
            {
                        scanf(
            "%lf%lf",&toy.x,&toy.y);
                        
            int front=0;
                        
            int rear=n+1;
                        
            while(front<=rear)
                        
            {

                            
            int mid=(front+rear)>>1;
                            
            if(multiply(toy,myline[front].p2,myline[front].p1)>0&&multiply(toy,myline[mid].p2,myline[mid].p1)<0)
                            
            {

                                
            if(mid==front+1)
                                
            {
                                    record[front]
            ++;
                                    
            break;
                                }

                                rear
            =mid;
                                
            continue;
                            }

                            
            else
                            
            {

                                
            if(mid+1==rear)
                                
            {
                                    record[mid]
            ++;
                                    
            break;
                                }

                                front
            =mid;
                                
            continue;
                            }


                        }

                    }


                    
            for(i=0;i<=n;i++)
                    
            {
                        printf(
            "%d: %d\n",i,record[i]);
                    }

                    printf(
            "\n");
                }

                
            return 0;
            }


            恭喜此題成為我收集計(jì)算幾何模板的第一題 呵呵~

            posted @ 2009-08-04 16:26 abilitytao 閱讀(946) | 評論 (1)編輯 收藏

            僅列出標(biāo)題
            共42頁: First 26 27 28 29 30 31 32 33 34 Last 
            久久综合色之久久综合| 国产成人久久精品一区二区三区 | 潮喷大喷水系列无码久久精品| 国产午夜精品久久久久九九| 欧美久久精品一级c片片| 国产精品青草久久久久婷婷| 东方aⅴ免费观看久久av| 久久亚洲AV成人无码| 久久婷婷五月综合色奶水99啪| 一级做a爰片久久毛片免费陪| 老司机午夜网站国内精品久久久久久久久 | 亚洲国产一成久久精品国产成人综合 | 国产成人久久精品激情| 欧美一区二区三区久久综合| 久久精品无码一区二区WWW| 久久婷婷国产剧情内射白浆| 午夜精品久久久久久毛片| 久久AV高潮AV无码AV| 久久亚洲精品人成综合网| 麻豆AV一区二区三区久久| 国产产无码乱码精品久久鸭| 青青青青久久精品国产 | 国产精品熟女福利久久AV| 久久久久人妻一区精品| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 国产成人无码久久久精品一| 麻豆精品久久精品色综合| 久久强奷乱码老熟女| 亚洲AV无码一区东京热久久| 国产麻豆精品久久一二三| 久久国产视屏| 99久久精品免费看国产一区二区三区 | 成人综合伊人五月婷久久| 久久99热这里只有精品国产 | 久久久久久久久久久久久久| 亚洲愉拍99热成人精品热久久| 久久综合给久久狠狠97色| 久久国产成人午夜aⅴ影院| 一本一本久久A久久综合精品| 久久国产精品-久久精品| 久久婷婷午色综合夜啪|