upcoj 5725 小奇畫畫(map維護)

2021-08-21 21:02:37 字數 1171 閱讀 2483

小奇想畫幾朵紅蓮,可惜它剛開始學畫畫,只能從畫圓開始。小奇畫了n個圓,它們的圓心都在x軸上,且兩兩不相交(可以相切)。現在小奇想知道,它畫的圓把畫紙分割成了多少塊?(假設畫紙無限大)

輸入第一行包括1個整數n。

接下來n行,每行兩個整數x,r,表示小奇畫了圓心在(x,0),半徑為r的乙個圓。

輸出輸出乙個整數表示答案。

樣例輸入

4 7 5

-9 11 11 9

0 20

樣例輸出6提示

對於 100%資料,1<=n<=300000,-10^9<=x<=10^9,1<=r<=10^9。

首先我們可以確定,每增加乙個圓都會使答案加1。唯一要判斷的是,當前的圓的直徑區間是否已經被其他圓填滿,如果是的話,答案還要加1。

我的思想是用map來維護乙個區間是否被其他圓填滿了,這個區間的左端點是l,右端點是r,如果這個區間已經被其他圓填滿,那麼用a[l]=r,a[r]=l表示;每當考慮乙個圓的直徑區間是否被其他圓填滿,我們就看這個圓的左端點和右端點是否關聯對映,如果是的話,答案要再加1。每考慮乙個圓時,將的左右端點標記,代表這兩個點可能成為切點。

維護的過程:首先將圓按照半徑從小到大排序(因為判斷乙個圓的直徑區間是否被其他圓填滿,肯定是先填小圓,再看大圓)。

然後依次考慮每乙個圓,先看左端點是否被標記,如果標記了,那麼這個圓和先前的圓外切或內切。我們找出標記的左端點相關聯的點(注意是以前的圓而不是現在的圓,a[l]=r,找出r),看它是否小於(圓從小到大排序)正考慮的圓的右端點,如果小於,那麼這個圓和先前的圓內切,我們就要更新a[l]和a[r],將他擴大,因為以後的圓只能更大,不會跑到這個圓內。否則,是外切,那麼也要更新點,即被其他圓填滿的區間變大了。對於右端點的考慮,是一樣的。

**:

#include#include#include#include#includeusing namespace std;

typedef pairpa;

mapm,a,c;

struct node

node[300005];

bool cmp(node a,node b)

else

}else//左右端點都標記了,那麼將這三個圓的聯通區間合併

c[l]=c[r]=1;//將左右端點標記

}cout<}

}

5725 小奇畫畫

題目鏈結 當某個圓被多個連續相切的小圓分成上下兩部分時塊數 2,其他情況塊數 1。上面的情況時最外面的圓被分成上下兩部分所以 2,其他小圓每個 1,初始為1 所以只需要判斷有多少個 2的,最後再 圓的個數 1 建圖把每個大圓裡直接包含的小圓建一條邊,然後判斷每個大圓直接相連的所有小圓的r的和是否等於...

UPC 5725 小奇畫畫

時間限制 1 sec 記憶體限制 128 mb 題目描述 紅蓮清淚兩行欲吐半點卻無 如初是你杳然若緋霧還在水榭畔畫樓處 是誰衣白衫如初誰紅裳如故 憶紅蓮 小奇想畫幾朵紅蓮,可惜它剛開始學畫畫,只能從畫圓開始。小奇畫了n個圓,它們的圓心都在x軸上,且兩兩不相交 可以相切 現在小奇想知道,它畫的圓把畫紙...

小奇畫畫 (bfs)

題目描述 紅蓮清淚兩行欲吐半點卻無 如初是你杳然若緋霧還在水榭畔畫樓處 是誰衣白衫如初誰紅裳如故 憶紅蓮 小奇想畫幾朵紅蓮,可惜它剛開始學畫畫,只能從畫圓開始。小奇畫了n個圓,它們的圓心都在x軸上,且兩兩不相交 可以相切 現在小奇想知道,它畫的圓把畫紙分割成了多少塊?假設畫紙無限大 輸入第一行包括1...