猫史档案馆


关于扫描线

用户:爵士OIer爵士OIer查看:0 回复:0 评论:0 创建时间:2020-09-26T20:11:07


众所周知,扫描线是需要离散化+线段树的。

现在我想不用线段树来实现扫描线,于是写了这份代码:

#include<bits/stdc++.h>
using namespace std;
struct node{long long x1,y1,x2,y2;}r[20005];
long long n,ans;
long long x[20005],y[20005];
bool p[20005][20005];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>r[i].x1>>r[i].y1>>r[i].x2>>r[i].y2;
		x[i*2]=r[i].x1;x[i*2-1]=r[i].x2;
		y[i*2]=r[i].y1;y[i*2-1]=r[i].y2;
	}
	sort(x+1,x+n*2+1);
	sort(y+1,y+n*2+1);
	for(int i=1;i<=n;i++)
		for(int xx=1;xx<n*2;xx++){
			if(r[i].x2<=x[xx])break;
			if(r[i].x1>=x[xx+1])continue;
			for(int yy=1;yy<n*2;yy++){				
				if(r[i].y2<=x[yy])break;
				if(r[i].y1>=x[yy+1])continue;
				p[xx][yy]=1;
			}
		}
	for(int xx=1;xx<n*2;xx++){
		long long s=x[xx+1]-x[xx];
		for(int yy=1;yy<n*2;yy++)
			if(p[xx][yy])ans+=s*(y[yy+1]-y[yy]);
	}
	cout<<ans;
	return 0;
} 

发现过不了,然后各种卡常,各种玄学优化,然后还是过不了。

有人能帮我一起调一下吗?


回复

上一页1 页 / 共 0下一页