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

            學(xué)習(xí)心得(code)

            superlong@CoreCoder

              C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
              74 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

            公告

            文字可能放在http://blog.csdn.net/superlong100,此處存放代碼

            常用鏈接

            留言簿(4)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新隨筆

            最新評(píng)論

            • 1.?re: Poj 1279
            • 對(duì)于一個(gè)凹多邊形用叉積計(jì)算面積 后能根據(jù)結(jié)果的正負(fù)來(lái)判斷給的點(diǎn)集的時(shí)針?lè)较颍?
            • --bsshanghai
            • 2.?re: Poj 3691
            • 你寫(xiě)的這個(gè)get_fail() 好像并是真正的get_fail,也是說(shuō)fail指向的串并不是當(dāng)前結(jié)點(diǎn)的子串。為什么要這樣弄呢?
            • --acmer1183
            • 3.?re: HDU2295[未登錄](méi)
            • 這個(gè)是IDA* 也就是迭代加深@ylfdrib
            • --superlong
            • 4.?re: HDU2295
            • 評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
            • --ylfdrib
            • 5.?re: HOJ 11482
            • 呵呵..把代碼發(fā)在這里很不錯(cuò)..以后我也試試...百度的編輯器太爛了....
            • --csuft1

            閱讀排行榜

            評(píng)論排行榜

            算法:掃描線
            用一條豎直線從左到右掃描所有的圓,處理每個(gè)圓“剛接觸掃描線”和“剛離開(kāi)
            掃描線”兩個(gè)事件點(diǎn)。
            為了下面描述方便,令某圓A的嵌套層數(shù)為f(A), 如果某圓A被某圓B嵌套且A和B
            緊鄰,那么說(shuō)A是B的兒子,B是A的父親。如果圓A,圓B同時(shí)是圓C的兒子,那么A,
            B互為兄弟,當(dāng)前考慮的圓為圓C。

            根據(jù)“剛接觸掃描線”事件點(diǎn)的上下相鄰事件點(diǎn)分類(lèi)有如下情況:
            1)沒(méi)有上方事件點(diǎn),或者沒(méi)有下方事件點(diǎn)。這時(shí)該圓C的嵌套層數(shù)f(C) = 1
            2)上方事件點(diǎn)和下方事件點(diǎn)屬于同一個(gè)圓A,這時(shí)圓A必定是圓C的父親,f(C) =
            f(A) + 1
            3)上方事件點(diǎn)和下方事件點(diǎn)分別屬于兩個(gè)圓A,B,且f(A) != f(B),這里不妨
            設(shè)f(A) < f(B),那么A是C的父親,B是C的兄弟。f(C) = f(A) + 1, f(C) = f(B)
            4) 上方事件點(diǎn)和下方事件點(diǎn)分別屬于兩個(gè)圓A,B,且f(A) == f(B),那么A是C
            的兄弟,B是C的兄弟,f(C) = f(A) = f(B).
            在處理“剛接觸掃描線”事件點(diǎn)時(shí)插入一對(duì)點(diǎn)表示該圓與掃描線的相交情況,
            并利用上述分類(lèi)計(jì)算其嵌套層數(shù),在處理“ 剛離開(kāi)掃描線”事件點(diǎn)是刪除對(duì)應(yīng)
            的那一對(duì)點(diǎn)。可以采用STL 中的set來(lái)維護(hù)
            相關(guān)的題目:
            http://acm.pku.edu.cn/JudgeOnline/problem?id=2932
            http://acmicpc-live-archive.uva.es/nuevoportal/data/problem.php?p=4125

            #include <stdio.h>
            #include 
            <string.h>
            #include 
            <math.h>
            #include 
            <set>
            #include 
            <algorithm>

            using namespace std;

            const int UP = 0;
            const int DOWN = 1;
            const int IN = 0;
            const int OUT = 1;
            const int N = 50005;

            int Time;

            struct circle {
                
            int x, y, r;
                
            int w;
                
            void read() {
                    scanf(
            "%d %d %d"&x, &y, &r);
                    w 
            = 0;
                }
                
            int getX(int flag) {
                    
            if( flag == IN )     return x - r;
                    
            else                return x + r;
                }
                
            double getY(int flag) {
                    
            double ret = sqrt((double)r*r-(double)(Time-x)*(Time-x));
                    
            if( flag == UP )     return (double)y + ret;
                    
            else                return (double)y - ret;
                }
                
            } cir[N];

            struct event {
                
            int x, y, id;
                
            int flag;
                
            void get(int _x, int _y, int _id, int _flag) {
                    x 
            = _x;
                    y 
            = _y;
                    id 
            = _id;
                    flag 
            = _flag;
                }
                
            bool operator<(const event ev) const {
                    
            return x < ev.x || x == ev.x && y > ev.y;
                }
            } eve[N
            *2];

            struct node {
                
            int id;
                
            int flag;
                node(){}
                node(
            int _id, int _flag) {
                    id 
            = _id;
                    flag 
            = _flag;
                }
                
            bool operator<(const node a) const {
                    
            double y1 = cir[id].getY(flag);
                    
            double y2 = cir[a.id].getY(a.flag);
                    
            return y1 > y2 || y1 == y2 && flag < a.flag;
                }
            };

            int n, eveN;

            set<node> line;
            set<node>::iterator it, f, e, p;

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

            void moveline() {
                line.clear();
                
            for(int i = 0; i < eveN; i ++) {
                    Time 
            = eve[i].x;
                    
            if( eve[i].flag == OUT ) {
                        line.erase(node(eve[i].id, UP));
                        line.erase(node(eve[i].id, DOWN));
                    } 
            else {
                        it 
            = line.insert(node(eve[i].id, UP)).first;
                        e 
            = f = it;
                        e 
            ++;
                        
            int id = it->id;
                        
            if( it == line.begin() || e == line.end() ) {
                            cir[id].w 
            = 1;
                        } 
            else {
                            f 
            --;
                            
            if( f->id == e->id ) {
                                cir[id].w 
            = cir[f->id].w + 1;
                            } 
            else {
                                cir[id].w 
            = max( cir[f->id].w, cir[e->id].w);
                            }
                        }
                        line.insert(node(eve[i].id, DOWN));
                    }
                }
            }

            int main() {
                
            while( scanf("%d"&n) != EOF ) {
                    eveN 
            = 0;        
                    
            for(int i = 0; i < n; i ++) {
                        cir[i].read();
                        eve[eveN
            ++].get(cir[i].getX(IN), cir[i].y, i, IN);
                        eve[eveN
            ++].get(cir[i].getX(OUT), cir[i].y, i, OUT);
                        
                    }
                    sort(eve, eve 
            + eveN);
                    moveline();
                    
            int ans = 0;
                    
            for(int i = 0; i < n; i ++) {
                        ans 
            = max(ans, cir[i].w);
                    }
                    printf(
            "%d\n", ans);
                }
            }

            posted on 2010-08-06 12:56 superlong 閱讀(1243) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            2021精品国产综合久久| 亚洲一级Av无码毛片久久精品| 国内精品久久久久伊人av| 国产精品久久国产精麻豆99网站| 色综合久久最新中文字幕| 精品国产91久久久久久久a| 久久亚洲精品成人无码网站| 国产精品久久久久影视不卡| 亚洲欧美国产日韩综合久久| 久久精品国产99国产精偷 | 日本三级久久网| 国内精品九九久久精品| 精品国产乱码久久久久久浪潮 | 国产精品女同久久久久电影院| 久久久久久国产a免费观看不卡| 一本久久a久久精品vr综合| 色综合久久天天综线观看| 青青青国产成人久久111网站| 亚洲精品国产美女久久久 | 69SEX久久精品国产麻豆| 久久精品国产亚洲AV不卡| 久久人人爽人人爽人人片AV东京热| 精品久久久噜噜噜久久久| 亚洲∧v久久久无码精品| 久久久久亚洲AV成人网人人网站| 久久久99精品成人片中文字幕| 亚洲精品高清国产一久久| 久久精品国产久精国产| 国产精品久久久久9999| 国产精品欧美久久久天天影视| 久久精品无码专区免费青青| 伊人久久大香线蕉av不卡| 狠狠综合久久AV一区二区三区| 国产精品99久久久精品无码 | 久久国产AVJUST麻豆| 99久久精品免费看国产免费| 久久久久亚洲av无码专区| 久久免费的精品国产V∧| 无码超乳爆乳中文字幕久久| 久久人人爽人人爽人人AV| 国产精品无码久久久久久|