vijos某次模擬賽原題。。。
處理出每個圓的一級祖先就行了。。。
其實沒有那麼麻煩,貪心即可出解。
我們將每個圓轉換成線段後按左端點小右端點大的方法排序
然後維護乙個棧:
對於每乙個圓i
如果棧頂右端點比圓i的右端點小,則出棧,直到棧空
否則i的一級祖先就是棧頂,並且加入i到棧。
證明:因為左端點排序,所以問題轉換為找乙個最小的右端點能夠包含此線段
假如棧頂的右端點比當前右端點小,顯然對於所有將來的線段,不可能包含將來的線段(或者說,儘管能,也不是最優解,因為最優解就是當前i)
然後如果有n個圓,那麼有n+1個面,如果乙個圓能被幾個圓分割為兩份,那麼就加乙個面。
所以我們將所有點的一級祖先加上長度然後看每個圓的長度是否為那麼長即可。
#include #include #include #include #include #include #include #include #include #include using namespace std;
typedef long long ll;
#define pii pair#define mkpii make_pair#define pdi pair#define mkpdi make_pair#define pli pair#define mkpli make_pair#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define cc(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define error(x) (!(x)?puts("error"):0)
#define printarr2(a, b, c) for1(_, 1, b)
#define printarr1(a, b) for1(_, 1, b) cout << a[_] << '\t'; cout << endl
inline const ll getint()
inline const int max(const int &a, const int &b)
inline const int min(const int &a, const int &b) { return ab.r:a.l背景
czy找到寶藏獲得屠龍寶刀和神秘秘籍!現在他要去找經常ntr他的jmars報仇……
題目描述
czy學會了一招「墮天一擊」,他對乙個地點發動墮天一擊,地面上就會留下乙個很大的圓坑。圓坑的周圍一圈能量太過龐大,因此無法通過。所以每次czy發動技能都會把地面分割。jmars擁有好大好大的土地,幾十眼都望不到頭,所以可以假設土地的大小是無限大。現在czy對他發動了猛烈的攻擊,他想知道在澤宇攻擊之後他的土地被切成幾份了?
czy畢竟很虛,因此圓心都在x座標軸上。另外,保證所有圓兩兩之間不會相交。
格式輸入第一行為整數n,表示czy放了n次墮天一擊。
接下來n行,每行兩個整數x[i],r[i]。表示在座標(x[i] , 0)放了一次墮天一擊,半徑為r[i]。
輸出一行,表示地面被分割成幾塊。
樣例輸入 4
7 5-9 11
11 9
0 20
樣例輸出 6
資料範圍
對於30%資料,n<=5000
對於100%資料,1<=n<=300000,-10^9<=x[i]<=10^9,1<=r[i]<=10^9.
NOIP模擬賽 天神下凡 動態開點線段樹
這些圓一定是在同一水平面上的,由於他們沒有相交,因此我們發現他們每個人與外界關係可以分為,1.存在並圈圈 2.存在圈圈並被割,因此我們把所有的圓都加1,把被割的在加1,就可以啦,因此我們開乙個線段樹,維護一段區間有沒有被全部覆蓋 include include include include inc...
noip2018模擬題(類揹包 貪心)
馬拉松冰球賽 marathon.pas c cpp 馬拉松冰球錦標賽的日子就要到了。正如馬拉松冰球比賽中經常出現的那樣,比賽時間 是m分鐘。和常規的冰球比賽一樣,在每一給定時刻,場上兩隊各有6名球員。然而,一 場馬拉松冰球比賽可以持續很長時間,所以教練帶了一群球員,這樣當球員們累了的時候,他們可以進...
NOIP模擬 切木板(貪心)
有乙個 m n 的矩形木板。你需要把這個木板切成 1 1 的小方塊,也就是豎著切 n 1 刀 橫著切 m 1 刀。橫著切第 i 個位置的權值為 xi 豎著切第 j 個位置的權值為 yj 切某一刀時的費用為切這一刀的權值乘上切過的塊數。請你安排切的順序使得所有費用之和最小。第一行兩個數 m,n 接下來...