bzoj 2300 防線修建

2021-07-05 12:45:11 字數 1668 閱讀 7213

題意:

給出乙個點集,每次可能刪去乙個點或查詢上凸包的面積;

保證無重點,保證最左面 最右面的點一定在凸包上;

n<=100000,m<=200000;

題解:

動態凸包問題,然而這道題的保證簡直極為良心;

所以呢,我們就可以用set來水這道題啦;

我還是漲了不少姿勢的,比如迭代器居然可以自減;

離線所有的操作之後處理,就是凸包加點了;

每次來乙個點,判斷一下加不加入,之後左面幹點右面幹點,插進去就好了;

不過這題細節還是用很多,主要是邊界問題吧;

時間複雜度o(set(n))o(nlogn);

**:

#include#include#include#include#include#define n 110000

#define iter set::iterator

using namespace std;

const double inf=1e100;

struct point

point(int _,int __):x(_),y(__){}

friend bool operator <(point a,point b)

scanf("%d",&q);

for(i=1;i<=q;i++) }

ans=dis(p,point(0,0))+dis(p,point(n,0));

for(i=1;i<=m;i++)

if(*it1==point(n,0)&&*it2==point(0,0))

ans=0;

else

ans-=dis(*it1,*it2);

temp=it1;

while(++temp!=s.end()&&slope(a[i],*it1,*temp))

ans-=dis(*it1,*temp),s.erase(it1++);

temp=it2;

while(temp--!=s.begin()&&slope(*temp,*it2,a[i]))

ans-=dis(*it2,*temp),s.erase(it2--);

ans+=dis(a[i],*it1)+dis(a[i],*it2);

} }for(i=q;i>=1;i--)

if(*it1==point(n,0)&&*it2==point(0,0))

ans=0;

else

ans-=dis(*it1,*it2);

temp=it1;

while(++temp!=s.end()&&slope(a[qx[i]],*it1,*temp))

ans-=dis(*it1,*temp),s.erase(it1++);

temp=it2;

while(temp--!=s.begin()&&slope(*temp,*it2,a[qx[i]]))

ans-=dis(*it2,*temp),s.erase(it2--);

ans+=dis(a[qx[i]],*it1)+dis(a[qx[i]],*it2);

} else

st[++top]=ans;

} while(top)

}

防線修建 BZOJ 2300

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

HAOI2011 BZOJ2300 防線修建

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

BZOJ2300 HAOI2011 防線修建

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