[HAOI2011][BZOJ2300][凸包]防线修建

版权声明:虽然博主很菜,但是还是请注明出处(我觉得应该没人偷我的博客) https://blog.csdn.net/qq_43346903/article/details/87858073

BZOJ2300

维护动态凸包周长,如果维护删点很不好维护,所以可以倒着维护加点
每加一个点就维护一下当前它左边和右边分别有多少点会被删除(叉积小于0)就行了
可以用set维护

Code:

#include<bits/stdc++.h>
#define db double
using namespace std;
inline int read(){
	int res=0,f=1;char ch=getchar();
	while(!isdigit(ch)) {if(ch=='-') f=-f;ch=getchar();}
	while(isdigit(ch)) {res=(res<<1)+(res<<3)+(ch^48);ch=getchar();}
	return res*f;
}
const int N=5e5+5;
struct point{
	int x,y;
	point (){}
	point(int _x,int _y): x(_x),y(_y){}
	friend inline point operator - (const point &a,const point &b) {return point(a.x-b.x,a.y-b.y);}
	friend inline db operator * (const point &a,const point &b) {return a.x*b.y-a.y*b.x;}
}p[N];
inline db dis(point a,point b){return sqrt((double)(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
inline bool operator < (const point &a,const point &b) {if(a.x==b.x) return a.y<b.y;return a.x<b.x;}
db now=0;
int n,top,m,a,b,q;
int vis[N];
struct Q{int op;int num;db ans;}o[N];
set<point>S;
inline void insert(point a){
	int x=a.x,y=a.y;
	set<point>::iterator r=S.lower_bound(a),l=r,t;--l;
	if((*l-a)*(*r-a)<0) return;
	now-=dis(*l,*r);
	S.insert(a);
	while(r!=S.end()){
		t=r,++r;
		if((*r-a)*(*t-a)>0) break;
		now-=dis(*t,*r);
		S.erase(t);
	}
	while(l!=S.begin()){
		t=l,--l;
		if((*t-a)*(*l-a)>0) break;
		now-=dis(*t,*l);
		S.erase(t);
	}
	S.insert(a);
	l=r=t=S.find(a);
	--l,++r;
	now+=dis(*l,a)+dis(*r,a);
}
int main(){
	n=read(),a=read(),b=read();m=read();
	for(int i=1;i<=m;i++) p[i].x=read(),p[i].y=read();
	q=read();
	for(int i=1;i<=q;i++){
		o[i].op=read();
		if(o[i].op==1) o[i].num=read(),vis[o[i].num]=1;
	}
	point must;must.x=a,must.y=b;
	now+=dis(point(0,0),must);now+=dis(point(n,0),must);
	S.insert(point(0,0));S.insert(point(n,0));S.insert(must);
	for(int i=1;i<=m;i++) if(!vis[i]) insert(p[i]);
	for(int i=q;i>=1;i--){
		if(o[i].op==2) o[i].ans=now;
		else insert(p[o[i].num]);
	}
	for(int i=1;i<=q;i++) if(o[i].op==2) printf("%.2lf\n",o[i].ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43346903/article/details/87858073