太自闭了。。。明明很水的说。。。
有三种为0的情况。一种是有水平,一种是没交点。
第三种有点难想啊。就是下面那个板子被上面的挡住了,,雨水进不去。。。
关键是我翻了翻discuss找到了这种数据,,但是脑子短路了不知道怎么写。。。
我们只要把下面那个端点向上延长!看和上面的板子有没有交点就行了啊!还是看了kuangbin的代码受到的启发。。。
哇我是傻逼啊。
1 #include2 #include 3 #include 4 #include 5 #include 6 7 using namespace std; 8 typedef double db; 9 const db eps = 1e-6;10 const db pi = acos(-1);11 int sign(db k){ if(k>eps)return 1; else if(k<-eps)return -1;return 0;}12 int cmp(db k1,db k2){ return sign(k1-k2);}13 struct point{14 db x,y;15 point operator+(const point &k1)const { return point{k1.x+x,k1.y+y};}16 point operator - (const point &k1) const{ return (point){x-k1.x,y-k1.y};}17 point operator * (db k1) const{ return (point){x*k1,y*k1};}18 point operator / (db k1) const{ return (point){x/k1,y/k1};}19 db abs(){ return sqrt(x*x+y*y);}20 };21 db cross(point k1,point k2){ return k1.x*k2.y-k1.y*k2.x;}22 db dot(point k1,point k2){ return k1.x*k2.x+k1.y*k2.y;}23 int intersect(db l1,db r1,db l2,db r2){24 if (l1>r1) swap(l1,r1); if (l2>r2) swap(l2,r2); return cmp(r1,l2)!=-1&&cmp(r2,l1)!=-1;25 }26 int checkSS(point k1,point k2,point k3,point k4){27 return intersect(k1.x,k2.x,k3.x,k4.x)&&intersect(k1.y,k2.y,k3.y,k4.y)&&28 sign(cross(k3-k1,k4-k1))*sign(cross(k3-k2,k4-k2))<=0&&29 sign(cross(k1-k3,k2-k3))*sign(cross(k1-k4,k2-k4))<=0;30 }31 point getLL(point k1,point k2,point k3,point k4){32 db w1=cross(k1-k3,k4-k3),w2=cross(k4-k3,k2-k3); return (k1*w2+k2*w1)/(w1+w2);33 }34 point p[6];35 int t;36 int main(){37 ios::sync_with_stdio(false);38 cout< < >t;40 while (t--) {41 for (int i = 1; i <= 4; i++) {42 cin >> p[i].x >> p[i].y;43 }44 bool f=1;45 if(cmp(p[1].y,p[2].y)==0)f=0;46 if(cmp(p[3].y,p[4].y)==0)f=0;47 if(!checkSS(p[1],p[2],p[3],p[4]))f=0;48 if(!f){49 cout<<0.00< p[3].y){ //maxy=p[1]56 point ano = getLL(p[1],tmp,p[3],{p[3].x-1,p[3].y});57 if (checkSS({p[3].x,p[3].y},{p[3].x,20000},ano,p[1])){58 cout<<0.00<