记录编号 533157 评测结果 AAAAAAAAAA
题目名称 [HAOI 2011]防线修建 最终得分 100
用户昵称 GravatarHale 是否通过 通过
代码语言 C++ 运行时间 0.512 s
提交时间 2019-06-18 13:14:13 内存使用 17.67 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define IT set<node>::iterator
#define check(a,b,c) ((b-a)*(c-b))
using namespace std;
const int N=1e5+7;
const int M=2e5+7;
const double eps=1e-10;
int m,n,x,y,q;
int opt[M],Q[M];
bool vis[M];
double ans[N],Ans;
struct node
{
	double x,y;
} pt[N];
set<node> s;
bool operator< (const node &a,const node &b)
{
	return a.x!=b.x?a.x<b.x:a.y<b.y;
}
node operator - (const node &a,const node &b) {return (node){a.x-b.x,a.y-b.y};}
double sqr(double x) {return x*x;}
double dis(node a,node b) {return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));}
bool operator * (const node &a,const node &b) {return a.y*b.x>a.x*b.y;}
void insert(const node &pos)
{
	IT it,itl,itr;
	itl=s.lower_bound(pos);itr=itl--;
	if (!check(*itl,pos,*itr)) return;
	Ans-=dis(*itl,*itr);
	it=itl;it--;
	while (it!=s.end()&&!check(*it,*itl,pos))
	{
		Ans-=dis(*itl,*it);
		s.erase(itl--);
		it--;
	}
	it=itr;it++;
	while (it!=s.end()&&!check(pos,*itr,*it))
	{
		Ans-=dis(*it,*itr);
		s.erase(itr++);
		++it;
	}
	Ans+=dis(*itl,pos)+dis(*itr,pos);
	s.insert(pos);
}
int main()
{
	freopen("defense.in","r",stdin);
	freopen("defense.out","w",stdout);
	scanf("%d%d%d%d",&n,&x,&y,&m);
	for (int i=1;i<=m;i++) scanf("%lf%lf",&pt[i].x,&pt[i].y);
	scanf("%d",&q);int p;
	for (int i=1;i<=q;i++)
	{
		scanf("%d",&p);p--;opt[i]=p;
		if (!p) scanf("%d",&Q[i]),vis[Q[i]]=true;
	}
	node a={0,0},b={x,y},c={n,0};
	s.insert(a);s.insert(b);s.insert(c);
	Ans=dis(a,b)+dis(b,c);
	for (int i=1;i<=m;i++) if (!vis[i]) insert(pt[i]);
	for (int i=q;i;i--)
	{
		if (opt[i]) ans[i]=Ans;
		else insert(pt[Q[i]]);
	}
	for (int i=1;i<=q;i++) if (opt[i]) printf("%.2lf\n",ans[i]+eps);
	return 0;
}