bzoj 2300 HAOI2011 防線修建

2021-08-22 13:21:58 字數 2210 閱讀 4326

description

近來a國和b國的矛盾激化,為了預防不測,a國準備修建一條長長的防線,當然修建防線的話,肯定要把需要保護的城市修在防線內部了。可是a國上層現在還猶豫不決,到底該把哪些城市作為保護物件呢?又由於a國的經費有限,所以希望你能幫忙完成如下的乙個任務:

1.給出你所有的a國城市座標

2.a國上層經過討論,考慮到經濟問題,決定取消對i城市的保護,也就是說i城市不需要在防線內了

3.a國上層詢問對於剩下要保護的城市,修建防線的總經費最少是多少

你需要對每次詢問作出回答。注意單位1長度的防線花費為1。

a國的地形是這樣的,形如下圖,x軸是一條河流,相當於一條天然防線,不需要你再修建

a國總是有兩個城市在河邊,乙個點是(0,0),乙個點是(n,0),其餘所有點的橫座標均大於0小於n,縱座標均大於0。a國有乙個不在(0,0)和(n,0)的首都。(0,0),(n,0)和首都這三個城市是一定需要保護的。

上圖中,a,b,c,d,e點為a國城市,且目前都要保護,那麼修建的防線就會是a-b-c-d,花費也就是線段ab的長度+線段bc的長度+線段cd的長度,如果,這個時候撤銷b點的保護,那麼防線變成下圖

input

第一行,三個整數n,x,y分別表示河邊城市和首都是(0,0),(n,0),(x,y)。

第二行,乙個整數m。

接下來m行,每行兩個整數a,b表示a國的乙個非首都非河邊城市的座標為(a,b)。

再接下來乙個整數q,表示修改和詢問總數。

接下來q行每行要麼形如1 i,要麼形如2,分別表示撤銷第i個城市的保護和詢問。

output

對於每個詢問輸出1行,乙個實數v,表示修建防線的花費,保留兩位小數

sample input

4 2 1

2 1 2

3 2

5 2

1 1

2 1 2

2sample output

6.47

5.84

4.47

hint

m<=100000,q<=200000,n>1

所有點的座標範圍均在10000以內, 資料保證沒有重點

題目中一開始提供了三個點是為了使得最終使得存在乙個圍成的三角形

我們用乙個set來維護所有凸包上的點 我們考慮按照x軸的座標排序即可 因為題目保證最後不會超過一開始給定的0~n這個限制範圍 我先將操作離線 然後每次變成從凸包上加點的操作

那麼我們可以每次二分出他的位置 然後不斷和左右比較 然後刪點 動態加點維護凸包 具體過程可以用叉積來判斷

#include

using namespace std;

inline char gc()

return

*s++;

}inline int

read()

while(isdigit(ch)) x=x

*10+ch-'0',ch=gc();

return

x*f;

}const int n=100100;

struct node1qr[n<<1];

struct node;}

inline friend int operator * (const node &a,const node &b)

inline friend bool operator <(const node &a,const node &b)

}p[n];

bool vis[n];

inline int

sqr(int x)

inline double dis(const node &a,const node &b)

vectorans;int n,x,y;

sets;double ans1;

inline void insert1(const node &a)

while(l!=s.begin())s.insert(a);l=r=s.find(a);--l;++r;

ans1+=dis(*l,a)+dis(*r,a);

}int main()

for (int i=1;i<=n;++i) if (!vis[i]) insert1(p[i]);

for (int i=q;i;--i)

for (int i=ans.size()-1;~i;--i) printf("%.2f\n",ans[i]);

return

0;}

HAOI2011 BZOJ2300 防線修建

description 近來a國和b國的矛盾激化,為了預防不測,a國準備修建一條長長的防線,當然修建防線的話,肯定要把需要保護的城市修在防線內部了。可是a國上層現在還猶豫不決,到底該把哪些城市作為保護物件呢?又由於a國的經費有限,所以希望你能幫忙完成如下的乙個任務 給出你所有的a國城市座標 a國上層...

BZOJ2300 HAOI2011 防線修建

每次刪乙個點或詢問剩餘點的凸包周長 刪乙個點好麻煩呀,考慮離線,倒著操作將刪點改為加點 然後就簡單了,用一顆平衡樹維護凸包中的點,倒著把點加回去 splay可以用set 論熟練運用stl code include include include include include include inc...

BZOJ 2300 HAOI2011 防線修建

近來a國和b國的矛盾激化,為了預防不測,a國準備修建一條長長的防線,當然修建防線的話,肯定要把需要保護的城市修在防線內部了。可是a國上層現在還猶豫不決,到底該把哪些城市作為保護物件呢?又由於a國的經費有限,所以希望你能幫忙完成如下的乙個任務 1.給出你所有的a國城市座標 2.a國上層經過討論,考慮到...