天神下凡題解

2022-05-01 03:24:07 字數 1729 閱讀 2352

題目描述

czy找到寶藏獲得屠龍寶刀和神秘秘籍!現在他要去找經常ntr他的jmars報仇……

czy學會了一招「墮天一擊」,他對乙個地點發動墮天一擊,地面上就會留下乙個很大的圓坑。圓坑的周圍一圈能量太過龐大,因此無法通過。所以每次czy發動技能都會把地面分割。jmars擁有好大好大的土地,幾十眼都望不到頭,所以可以假設土地的大小是無限大。現在czy對他發動了猛烈的攻擊,他想知道在澤宇攻擊之後他的土地被切成幾份了?czy畢竟很虛,因此圓心都在x座標軸上。另外,保證所有圓兩兩之間不會相交。

輸入輸入第一行為整數n,表示czy放了n次墮天一擊。

接下來n行,每行兩個整數x[i],r[i]。表示在座標(x[i] ,

0)放了一次墮天一擊,半徑為r[i]。

輸出輸出一行,表示地面被分割成幾塊。

樣例輸入47

5-9111190

20樣例輸出

6

考試的時候打了n^2的dp,只拿到了30分部分分。

乙個解法:

掃瞄線(其實打完了發現也就是暴力模擬),先按左端點小的排序,如果左端點相同則右端點大的在前,這樣可以保證每個小圓被大圓包含,本身每個圓對答案貢獻是1,但是有可能乙個大圓被許多小圓分割成兩部份,對答案貢獻需要加1,所以o(n)列舉排序後的每個圓,如果當前圓左邊界和下乙個圓左邊界相同則說明這個圓可以被分割(但這時要注意倒數第二個圓),將這個圓壓入棧。如果這個圓的右端點和棧頂圓的右端點相同則說明棧頂的大圓可以被分割,對答案貢獻加1,。如果這個圓的右端點和下乙個圓的左端點沒有相連,則棧頂的大圓無法被徹底分割,出棧。

最後的num為被徹底分割大圓做出的貢獻,本身每個圓都對答案有1個貢獻,且所有圓外面也是一部份,所以最終答案應為num+n+1

好像大神的解法是線段樹,不過蒟蒻太弱了,沒有想出來,就打了個暴力模擬qaq,膜大佬orzzzz

1 #include2 #include3 #include4 #include5 #include6 using namespace std;

7 __attribute__((optimize("o3")))int read()

15 while(ch>='0'&&ch<='9')

19 return s*f;

20 }

21 struct oo cir[300005];

24 int n;

25 __attribute__((optimize("o3")))bool cmp(oo a,oo b)

32 if(a.r>b.r)

35 return 0;

36 }

37 int stack[300005],tail;

38 __attribute__((optimize("o3")))int main()

46 sort(cir+1,cir+1+n,cmp);

47 int ans=0;

48 for(int i=1; i<=n; i++)

53 if(cir[i].r==cir[stack[tail]].r)

57 if(cir[i].r!=cir[i+1].l)

61 }

62 }

63 printf("%d\n",n+ans+1);

64 return 0;

65 }

noip模擬題 天神下凡(貪心)

vijos某次模擬賽原題。處理出每個圓的一級祖先就行了。其實沒有那麼麻煩,貪心即可出解。我們將每個圓轉換成線段後按左端點小右端點大的方法排序 然後維護乙個棧 對於每乙個圓i 如果棧頂右端點比圓i的右端點小,則出棧,直到棧空 否則i的一級祖先就是棧頂,並且加入i到棧。證明 因為左端點排序,所以問題轉換...

NOIP模擬賽 天神下凡 動態開點線段樹

這些圓一定是在同一水平面上的,由於他們沒有相交,因此我們發現他們每個人與外界關係可以分為,1.存在並圈圈 2.存在圈圈並被割,因此我們把所有的圓都加1,把被割的在加1,就可以啦,因此我們開乙個線段樹,維護一段區間有沒有被全部覆蓋 include include include include inc...

天神的密碼

2018年,icebound開啟了神殿。而在2019年,icebound正在試圖破解天神的密碼,以期獲得天神的力量。icebound發現,想要得到神的密碼,必須先要完成乙個祭祀儀式。在這個祭祀儀式上,我們首先會追隨神的指引,得到兩個正整數 n和 k。隨後,我們令 x n k,得到天神喜歡的數字x。利...