題意:
給出乙個點集,每次可能刪去乙個點或查詢上凸包的面積;
保證無重點,保證最左面 最右面的點一定在凸包上;
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...