1. 程式人生 > >[NOI考前歡樂賽] 小奇畫畫 題解

[NOI考前歡樂賽] 小奇畫畫 題解

div ace 包括 ios sin () 表示 noi 速度

小奇畫畫

時間限制: 1 Sec 內存限制: 128 MB

題目描述

紅蓮清淚兩行欲吐半點卻無
如初是你杳然若緋霧還在水榭畔畫樓處
是誰衣白衫如初誰紅裳如故
——《憶紅蓮》

小奇想畫幾朵紅蓮,可惜它剛開始學畫畫,只能從畫圓開始。小奇畫了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塊,每個圓被畫下時,一定會將畫紙至少多分割成一塊,如果一個圓和另外兩個圓相切,那麽還會再多分割一塊出來。
由於程序中對map的隨機存儲較多,使用 unordered_map (HashMap)代替 map 可以大大加快運行速度。

代碼

#include <iostream>
#include <unordered_map>

#define ll long long

using namespace std;
int n, ans = 1;
ll x, r;
unordered_map<ll, bool> ma;

int main() {
    ios::sync_with_stdio(
false); cin.tie(nullptr); cout.tie(nullptr); cin >> n; while (n--) { cin >> x >> r; if (ma[x + r] && ma[x - r]) { ans += 2; } else { ans += 1; ma[x + r] = true; ma[x - r] = true; } } cout
<< ans; return 0; }

[NOI考前歡樂賽] 小奇畫畫 題解