一个奇怪的错误,求助
  • 板块学术版
  • 楼主WangLianda
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/7/22 10:54
  • 上次更新2023/10/27 18:57:52
查看原帖
一个奇怪的错误,求助
643820
WangLianda楼主2022/7/22 10:54

并非是题目求助!!是题目之外的问题!!

(很抱歉标题起得很模糊,因为我自己也不能确定是哪里错了)

在做P5490 【模板】扫描线 时。我突发奇想了一种O(n^2)的做法,当然肯定是过不去的,但是为了熟悉这个过程,我还是实践了一下。

主要思路就是先对矩形按照左侧的x进行排序,然后检测两个矩形之间有没有重叠部分,接着把重叠部分减掉。

这里用A,B,C,D分别表示矩形的左上角、左下角、右下角、右上角端点。

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
long long sum=0;
long long exclude=0;
struct coor {
	long long x,y;
};
struct rec {
	coor A,B,C,D;
};
long long area(coor a,coor b) {
	return abs(a.x-b.x)*abs(a.y-b.y);
}
bool conjugate(rec a,rec b) {
	if(b.B.x<a.D.x&&b.B.y<a.D.y) {
		//左对角线重叠 
		exclude+=area(b.B,a.D);
		return true;
	}
	else if(b.A.x<a.C.x&&a.C.y<b.A.y) {
		//右对角线重叠 
		exclude+=area(a.C,b.A);
		return true;
	}
	else return false;
}
int main(){
	int n;
	cin>>n;
	rec a[n];
	for(int i=0;i<n;i++) {
		cin>>a[i].B.x>>a[i].B.y>>a[i].D.x>>a[i].D.y;
		a[i].A.x=a[i].B.x;
		a[i].A.y=a[i].D.y;
		a[i].C.x=a[i].D.x;
		a[i].C.y=a[i].B.y;
	}
	sort(a,a+n,[](rec a_,rec b_)->bool{return a_.B.x<b_.B.x;});
//	for(auto&i:a) {
//		cout<<i.B.x<<' '; 
//		cout<<i.B.y<<' '; 
//		cout<<i.D.x<<' '; 
//		cout<<i.D.y<<endl; 
//	}
	for(int i=0;i<n;i++) {
		sum+=area(a[i].B,a[i].D);
		int j=i+1;
		while(conjugate(a[i],a[j])) j++;
	}
	cout<<sum-exclude;
	return 0;
}

输入样例1:

2
100 100 200 200
150 150 250 255

输出:

-3680300368

在检查的时候,我添加了那个被注释掉的部分,作用是打印出排序后的每个矩形的左下角、右上角端点。 但再次输入样例之后,最后输出的答案却不再是

-3680300368

而是:

100 100 200 200
150 150 250 255
18000

这令我很疑惑。

真的是很奇怪,这是为什么?

2022/7/22 10:54
加载中...