傳送門
參考部落格
練習s tl
stlst
l庫。動態維護凸包。由於題目要求乙個乙個刪除,可以考慮反過來離線操作,乙個乙個加回去。
當新增加乙個點的時候,往它的左右兩邊擴張(set
setse
t中按照x
xx排好序),看是否需要修改凸包。用叉積判斷即可。
注意最開始要加上dis
((0,
0),(
x,y)
)dis((0,0),(x,y))
dis((0
,0),
(x,y
))和d is
((m,
0),(
x,y)
)dis((m,0),(x,y))
dis((m
,0),
(x,y
))。
#include
using
namespace std;
const
int maxn=
1e5+10;
const
int maxq=
2e5+10;
int del[maxn]
,tot=
0,n,q;
double ans[maxq]
,cur=
0.0,m,x,y;
struct grid
friend
inline grid operator+(
const grid &a,
const grid &b)
friend
inline grid operator-(
const grid &a,
const grid &b)
friend
inline grid operator*(
const grid &a,
const
double
&b)friend
inline grid operator/(
const grid &a,
const
double
&b)friend
inline
double
cross
(const grid &a,
const grid &b)
friend
inline
double
dis(
const grid &a,
const grid &b)
friend
inline
bool
operator
<
(const grid &a,
const grid &b)
inline
void
print()
}p[maxn]
;typedef grid vector,point;
struct question
}q[maxq]
;set g;
inline
void
add(point x)
while(1
) g.
insert
(x),l=r=g.
find
(x),
--l,
++r;
cur+
=dis
(x,*l)
+dis
(x,*r);}
intmain()
for(
int i=
1;i<=n;
++i)if(
!del[i]
)add
(p[i]);
for(
int i=q;i>=
1;i--
)for
(int i=tot;i>=1;
--i)
printf
("%.2lf\n"
,ans[i]);
}
HAOI2011 防線修建
近來a國和b國的矛盾激化,為了預防不測,a國準備修建一條長長的防線,當然修建防線的話,肯定要把需要保護的城市修在防線內部了。可是a國上層現在還猶豫不決,到底該把哪些城市作為保護物件呢?又由於a國的經費有限,所以希望你能幫忙完成如下的乙個任務 給出你所有的a國城市座標 a國上層經過討論,考慮到經濟問題...
HAOI2011 防線修建
洛谷鏈結 太懶了,懶得描述題面了。凸包刪點誰受得了,凸包就沒法維護了,所以我們倒著看,把刪點改為加點,每次加乙個可能導致一些點從凸包上消失,但每個點消失一次就回不來了,所以每個點訪問一次,可以保證複雜度。還好這題是個殼不是個包,否則比較毒瘤了。每次加入乙個點,首先需要考慮它是否在凸包中,如果在就 r...
HAOI2011 BZOJ2300 防線修建
description 近來a國和b國的矛盾激化,為了預防不測,a國準備修建一條長長的防線,當然修建防線的話,肯定要把需要保護的城市修在防線內部了。可是a國上層現在還猶豫不決,到底該把哪些城市作為保護物件呢?又由於a國的經費有限,所以希望你能幫忙完成如下的乙個任務 給出你所有的a國城市座標 a國上層...