并非是题目求助!!是题目之外的问题!!
(很抱歉标题起得很模糊,因为我自己也不能确定是哪里错了)
在做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
这令我很疑惑。
真的是很奇怪,这是为什么?