RT,不开O2和开O2的答案不一样
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define endl '\n'
#define inf 0x3f3f3f3f
#define mkp make_pair
#define pb push_back
#define fir first
#define sec second
#define pii pair<int,int>
#define eb emplace_back
#define file(filename) freopen(filename".in","r",stdin);freopen(filename".out","w",stdout);
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Dor(i,a,b) for(int i=a;i>=b;i--)
//#define double long double
struct point{
double x,y;
};
int t;
double cross(point a,point b,point c,point d){
double x1=(a.x-b.x),y1=(a.y-b.y),x2=(c.x-d.x),y2=(c.y-d.y);
return x1*y2-x2*y1;
}
point a,b,c,d;
void solve(){
scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);
scanf("%lf%lf%lf%lf",&c.x,&c.y,&d.x,&d.y);
if(cross(a,b,c,d)==0){
printf("0.00\n");
return;
}
// cout<<1<<endl;
if(cross(a,c,a,b)*cross(a,d,a,b)>0){
printf("0.00\n");
return;
}
if(cross(a,c,c,d)*cross(b,c,c,d)>0){
printf("0.00\n");
return;
}
bool flag1=0,flag2=0;
double k1,k2,b1,b2,jx,jy;
if(b.x-a.x==0){
flag1=1;
}
else{
k1=(b.y-a.y)*1.0/(b.x-a.x);
}
if(d.x-c.x==0){
flag2=1;
}
else{
k2=(d.y-c.y)*1.0/(d.x-c.x);
}
if(k1*k2==0){
printf("0.00\n");
return;
}
if(a.y>b.y){
swap(a,b);
}
if(c.y>d.y){
swap(c,d);
}
if(flag1||flag2){
double b2;
double jx,jy;
if(flag1){
jx=a.x;
b2=c.y-c.x*k2;
jy=jx*k2+b2;
}
else{
jx=d.x;
b1=a.y-a.x*k1;
jy=jx*k1+b1;
}
double ans;
if(d.y<=b.y){
if(flag1){
ans=fabs(d.y-jy)*fabs(b.x-d.x)/2.0;
}
else{
ans=fabs(d.y-jy)*fabs((d.y-b1)/k1-d.x)/2.0;
}
printf("%.2lf\n",ans);
}
else{
if(flag1){
ans=fabs(b.y-jy)*fabs((b.y-b2)/k2-b.x)/2.0;
}
else{
ans=fabs(b.y-jy)*fabs(d.x-b.x)/2.0;
}
printf("%.2lf\n",ans);
}
return;
}
b1=a.y-k1*a.x;
b2=c.y-k2*c.x;
jx=(b2-b1)/(k1-k2);
jy=jx*k1+b1;
if(k1*k2>0&&b.x>0&&b.x<=d.x&&b.y<d.y){
printf("0.00\n");
return;
}
if(k1*k2>0&&d.x>0&&b.x>=d.x&&b.y>d.y){
printf("0.00\n");
return;
}
if(k1*k2>0&&b.x<=0&&d.x<=0&&-b.x<=-d.x&&b.y<d.y){
printf("0.00\n");
return;
}
if(k1*k2>0&&d.x<=0&&b.x<=0&&-d.x<=-b.x&&d.y<b.y){
printf("0.00\n");
return;
}
double ans;
if(d.y<b.y){
ans=fabs(d.y-jy)*fabs((d.y-b1)/k1-d.x)/2;
}
else{
ans=fabs(b.y-jy)*fabs((b.y-b2)/k2-b.x)/2;
}
printf("%.2lf\n",ans);
}
signed main(){
// freopen("data.out","r",stdin);
// freopen("baoli.out","w",stdout);
cin>>t;
while(t--){
solve();
}
}
数据
9
0 1 3 3
3 2 1 0
1 1 3 0
3 4 0 0
1 4 2 0
0 4 2 0
1 0 3 0
1 2 3 0
4 1 3 3
4 0 3 2
2 3 3 3
4 2 3 2
2 3 0 4
3 1 3 0
3 0 4 3
4 4 1 2
2 4 2 3
4 4 0 3
最后一组不一样,不开O2单独把最后一组拿出来跟O2一样