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;
}