小奇畫畫 BFS

2022-02-01 19:47:09 字數 1295 閱讀 3915

紅蓮清淚兩行欲吐半點卻無

如初是你杳然若緋霧還在水榭畔畫樓處

是誰衣白衫如初誰紅裳如故

——《憶紅蓮》

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

第一行包括 \(1\) 個整數 \(n\)。

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

輸出乙個整數表示答案。

4

7 5-9 11

11 9

0 20

6
對於 \(30\%\) 資料,\(n\leq 5000\);

對於 \(100\%\) 資料,\(1\leq n\leq 300000\), \(-10^9\leq x\leq 10^9\), \(1\leq r\leq 10^9\)。

第一眼看到題一直沒看出來能用 \(bfs\),沒想到能用圖論做。

很容易發現有特殊情況:

當兩個小圓的半徑加起來等於大圓的半徑時,會多分出一塊紙片,所以我們只需要求出特殊情況的次數,最後加上 \(n+1\) 就可以了。

怎麼求出特殊情況的次數呢,就跟我們的圖論扯上關係了,將大圓向被它包含的小圓建邊,遍歷它走到的點計算半徑和。

首先將每個圓排序,將左端點從小到大排序,將右端點從大到小排序,這樣我們就可以先遍歷到大圓,建邊即可。

#include #define int long long

using namespace std;

const int maxn=3e5+50,inf=0x3f3f3f3f;

inline int read()

int n;

int rd[maxn];

struct nodea[maxn];

vectorvec[maxn];//存邊的邊表

bool cmp(node a,node b)else

} while(!q.empty())

s.pop();//不被包含在裡面,出棧

} s.push(i);

} printf("%lld\n",bfs()+n+1);

return 0;

}

小奇畫畫 (bfs)

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

5725 小奇畫畫

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

UPC 5725 小奇畫畫

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