记录编号 158208 评测结果 AAAAAAAAAA
题目名称 Uyuw的音乐会 最终得分 100
用户昵称 Gravatarnew ioer 是否通过 通过
代码语言 C++ 运行时间 0.567 s
提交时间 2015-04-13 15:48:58 内存使用 2.13 MiB
显示代码纯文本
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
const double eps=1e-10;
const int maxn=20100,_side=10000;
struct point{
	double x,y;
	point operator -(const point &a) const{
		return (point){x-a.x,y-a.y};
	}
	double operator *(const point &a) const{
		return x*a.y-a.x*y;
	}
}o,p[maxn];
struct list{
	point a,b;
	double angle;
	void calc(){
		angle=atan2(b.y-a.y,b.x-a.x);
	}
	void init(const double &x1,const double &y1,const double &x2,const double &y2){
		a=(point){x1,y1},b=(point){x2,y2};
	}
}lis[maxn],deq[maxn];
int n,m,cnt;
int dc(const double &x){
	if(x>eps) return 1;
	else if(x<-eps) return -1;
	return 0;
}
double cross(const point &a,const point &b,const point &c){
	return (b-a)*(c-a);
}
bool cmp(const list &a,const list &b){
	if(!dc(a.angle-b.angle)) return dc(cross(a.a,a.b,b.a))<0;
	return a.angle>b.angle;
}
point getp(const list &a,const list &b){
	double k1=cross(a.a,b.b,b.a);
	double k2=cross(a.b,b.a,b.b);
	point tmp=a.b-a.a;
	return (point){a.a.x+tmp.x*k1/(k1+k2),a.a.y+tmp.y*k1/(k1+k2)};
}
template<class T>bool _get(T &x){
	static int ch,gg;gg=0;
	while((ch=getchar())<40&&ch!=EOF);
	if(ch==EOF) return 0;if(ch==45) gg=1,x=0;else x=ch-48;
	while((ch=getchar())>47) x=x*10+ch-48;
	if(gg) x=-x;return 1;
}
double _calc(){
	double res=0.0;
	p[cnt+1]=p[1];
	for(int i=1;i<=cnt;i++)
		res+=cross(o,p[i],p[i+1]);
	return res;
}
void cut(){
	sort(lis+1,lis+n+1,cmp),m=1,cnt=0;
	for(int i=2;i<=n;i++)
		if(dc(lis[i].angle-lis[m].angle))
			lis[++m]=lis[i];
	deq[1]=lis[1],deq[2]=lis[2];
	int l=1,r=2;
	for(int i=3;i<=m;i++){
		while(l<r&&dc(cross(lis[i].a,lis[i].b,getp(deq[r],deq[r-1])))<0) r--;
		while(l<r&&dc(cross(lis[i].a,lis[i].b,getp(deq[l],deq[l+1])))<0) l++;
		deq[++r]=lis[i];
	}
	while(l<r&&dc(cross(deq[l].a,deq[l].b,getp(deq[r],deq[r-1])))<0) r--;
	while(l<r&&dc(cross(deq[r].a,deq[r].b,getp(deq[l],deq[l+1])))<0) l++; 
	if(l==r) return;
	for(int i=l;i<r;i++) p[++cnt]=getp(deq[i],deq[i+1]);
	if(r>l+1) p[++cnt]=getp(deq[r],deq[l]);
}
int main(){
	freopen("concert.in","r",stdin);
	freopen("concert.out","w",stdout);
	while(_get(n)){
		for(int i=1;i<=n;i++){
			_get(lis[i].a.x),_get(lis[i].a.y);
			_get(lis[i].b.x),_get(lis[i].b.y);
			lis[i].calc();
		}
		lis[n+1].init(0,0,_side,0),lis[n+1].calc();
		lis[n+2].init(0,_side,0,0),lis[n+2].calc();
		lis[n+3].init(_side,0,_side,_side),lis[n+3].calc();
		lis[n+4].init(_side,_side,0,_side),lis[n+4].calc();
		n+=4,cut(),printf("%.1lf\n",fabs(_calc())*0.5);
	}
}