HAOI2011 防線修建

2021-09-25 10:04:36 字數 2058 閱讀 8494

傳送門

參考部落格

練習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國上層...