求助程序缺氧
  • 板块灌水区
  • 楼主white_carton
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/3/25 20:35
  • 上次更新2024/3/25 21:52:23
查看原帖
求助程序缺氧
487199
white_carton楼主2024/3/25 20:35

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一样

2024/3/25 20:35
加载中...