紅蓮清淚兩行欲吐半點卻無
如初是你杳然若緋霧還在水榭畔畫樓處
是誰衣白衫如初誰紅裳如故
——《憶紅蓮》
小奇想畫幾朵紅蓮,可惜它剛開始學畫畫,只能從畫圓開始。小奇畫了 \(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軸上,且兩兩不相交 可以相切 現在小奇想知道,它畫的圓把畫紙...