萌新刚学OI,求助神仙RE
查看原帖
萌新刚学OI,求助神仙RE
279800
ExplodingKonjac楼主2021/12/18 10:33

link

RE 的点显示 Invalid Memmory Reference,但我真的不知道哪里有非法内存访问啊qwq求大神帮忙

Code:

#include <bits/stdc++.h>
using namespace std;

/*为避免影响观感去掉FastIO*/

using namespace FastIO;
const double INF=1e18,EPS=1e-8;
#define FEQ(x,y) (abs((x)-(y))<EPS)
#define FGT(x,y) ((x)-(y)>EPS)
#define FLS(x,y) ((y)-(x)>EPS)
#define FGE(x,y) ((x)-(y)>-EPS)
#define FLE(x,y) ((y)-(x)>-EPS)
int n,m,tot,ord[305];
double ans,lb[305],rb[305],cut[100005];
bool up[305];
struct Point
{
	double x,y;
	Point()=default;
	Point(double _x,double _y): x(_x),y(_y){}
};
struct Line
{
	double k,b;
	Line()=default;
	Line(double _k,double _b): k(_k),b(_b){}
	Line(const Point &A,const Point &B)
	{
		if(FEQ(A.x,B.x))	k=INF,b=A.x;
		else	k=(A.y-B.y)/(A.x-B.x),b=(A.x*B.y-B.x*A.y)/(A.x-B.x);
	}
	inline double operator ()(double x)
		{ return k*x+b; }
}ed[305];
inline Point intersect(const Line &l1,const Line &l2)
	{ return Point((l2.b-l1.b)/(l1.k-l2.k),(l1.b*l2.k-l2.b*l1.k)/(l2.k-l1.k)); }
int main()
{
	qin>>n;
	for(int i=1;i<=n;i++)
	{
		Point A,B,C;
		scanf("%lf%lf%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y,&C.x,&C.y);
		ed[++m]=Line(B,C),up[m]=ed[m](A.x)>A.y,lb[m]=B.x,rb[m]=C.x;
		ed[++m]=Line(C,A),up[m]=ed[m](B.x)>B.y,lb[m]=C.x,rb[m]=A.x;
		ed[++m]=Line(A,B),up[m]=ed[m](C.x)>C.y,lb[m]=A.x,rb[m]=B.x;
	}
	for(int i=1;i<=m;i++)
		if(FGT(lb[i],rb[i]))	swap(lb[i],rb[i]);
	for(int i=1;i<=m;i++)
		for(int j=i+1;j<=m;j++)
		{
			if(FEQ(ed[i].k,ed[j].k))	continue;
			Point p;
			if(ed[i].k==INF)
				p=Point(ed[i].b,ed[j](ed[i].b));
			else if(ed[j].k==INF)
				p=Point(ed[j].b,ed[i](ed[j].b));
			else
				p=intersect(ed[i],ed[j]);
			if(FGE(p.x,lb[i]) && FLE(p.x,rb[i]) && FGE(p.x,lb[j]) && FLE(p.x,rb[j]))
				cut[++tot]=p.x;
		}
	sort(cut+1,cut+tot+1),tot=unique(cut+1,cut+tot+1)-cut-1;
	for(int i=1;i<=tot;i++)
	{
		double pos=cut[i],last=cut[i-1];
		int cnt=0,top=0;
		for(int j=1;j<=m;j++)
			if(ed[j].k!=INF && FGT(pos,lb[j]) && FLE(pos,rb[j]))
				ord[++cnt]=j;
		sort(ord+1,ord+cnt+1,[pos,last](int x,int y)
			{ return FGE(ed[x](pos),ed[y](pos)) && FGE(ed[x](last),ed[y](last)); });
		for(int _=1,j;j=ord[_],_<=cnt;_++)
		{
			int pre=ord[_-1];
			if(up[j] && (top++)>0)
				ans+=(ed[pre](last)-ed[j](last)+ed[pre](pos)-ed[j](pos))*(pos-last)/2;
			if(!up[j] && (top--)>0)
				ans+=(ed[pre](last)-ed[j](last)+ed[pre](pos)-ed[j](pos))*(pos-last)/2;
		}
	}
	printf("%.2lf",ans);
//	return qout.flush(),0;
}

2021/12/18 10:33
加载中...