记录编号 275563 评测结果 AAAAAAAAAA
题目名称 [HAOI 2011]防线修建 最终得分 100
用户昵称 Gravatarstdafx.h 是否通过 通过
代码语言 C++ 运行时间 0.211 s
提交时间 2016-07-02 16:29:19 内存使用 5.08 MiB
显示代码纯文本
# define maxn 200010ul

# include <set>
# include <cmath>
# include <stdio.h>
# include <iostream>
# include <algorithm>

# define fi first
# define se second

# define mp(a,b) std::make_pair((a),(b))

typedef std::pair<int,int> PII;
typedef std::set<PII>::iterator iter;

std::set<PII> Gap;

inline double sqr(double x) { return x*x; }
double dist(const PII &a,const PII &b) { return std::sqrt(sqr(a.fi-b.fi)+sqr(a.se-b.se)); }
PII operator + (const PII &a,const PII &b) { return mp(a.fi+b.fi,a.se+b.se); }
PII operator - (const PII &a,const PII &b) { return mp(a.fi-b.fi,a.se-b.se); }
double operator * (const PII &a,const PII &b) { return a.fi*b.se-a.se*b.fi; }

void read(int &x) {
	x=0; int c=getchar(),f=0; for(;c<'0'||c>'9';c=getchar()) f|=(c=='-');
	for(;c>='0'&&c<='9';c=getchar()) x=(x*10)+(c^48); if(f) x=-x; return;
}

int n,m,q,a[maxn][2],c[maxn][2]; double sum,ans[maxn]; bool b[maxn];

void del(iter x) {
	iter u=x,v=x; u--,v++;
	sum-=dist(*u,*x)+dist(*x,*v);
	sum+=dist(*u,*v); Gap.erase(x); return;
}

void ins(PII x){
	iter it=Gap.upper_bound(x); --it;
	iter v=it,u; ++v; if((x-*it)*(*v-*it)>=0) return;
	Gap.insert(x); it=Gap.find(x); v=it,u=it; u--,v++;
	sum+=dist(*u,*it)+dist(*it,*v); sum-=dist(*u,*v);
	for(v=it;;v=it) {
		++v,u=v,++v;
		if(v==Gap.end()||((*u-*it)*(*v-*it))<0) break;
		del(u);
	} for(v=it;;v=it){
		--v; if(v==Gap.begin()) break;
		u=v,--v; if(((*u-*v)*(*it-*v))<0) break;
		del(u);
	} return;
}

int main() {
	freopen("defense.in","r",stdin),freopen("defense.out","w",stdout);
	read(n),read(a[0][0]),read(a[0][1]),read(m);
	for(int i=1;i<=m;i++) read(a[i][0]),read(a[i][1]);
	read(q); for(int i=1;i<=q;i++) {
		read(c[i][0]);
		if(c[i][0]==1) read(c[i][1]),b[c[i][1]]=1;
	} Gap.insert(mp(0,0)),Gap.insert(mp(n,0)); sum=n;
	for(int i=0;i<=m;i++) if(!b[i]) ins(mp(a[i][0],a[i][1]));
	for(int i=q;i;i--) {
		if(c[i][0]==1) ins(mp(a[c[i][1]][0],a[c[i][1]][1]));
		else ans[i]=sum;
	} for(int i=1;i<=q;i++) if(ans[i]>1e-9) printf("%.2lf\n",ans[i]); return 0;
}