首页 > 学院 > 开发设计 > 正文

洛谷 P2449 [SDOI2005]矩形

2019-11-08 01:05:34
字体:
来源:转载
供稿:网友

题目描述

现在我们在一个平面上画了n个矩形。每一个矩形的两边都与坐标轴相平行,且矩形定点的坐标均为整数。现我们定义满足如下性质的图形为一个块:

1.每一个矩形都是一个块;

2.如果两个块有一段公共的部分,那么这两个块就会形成一个新的块,否则这两个块就是不同的。

示例:

图1中的矩形形成了两个不同的块。图2中的矩形形成了一个块。

任务:

请写一个程序:

1.从文本文件PRO.IN中读入各个矩形的顶点坐标;

2.找出这些矩形中不同的块的数目;

3.把结果输出到文本文件PRO.OUT中。

输入输出格式

输入格式: 文本文件PRO.IN的第一行包括一个整数n,1  n  7000,为矩形的数目。以下的n行为矩形顶点的坐标。每一个矩形都是用四个整数来描述的:左下角的x坐标、左下角的y坐标、右上角的x坐标和右上角的y坐标。所有的坐标都是不大于10000的非负整数。

输出格式: 在文本文件PRO.OUT中输出唯一的一个整数——这些矩形所形成的不同的块的数目。

输入输出样例

输入样例#1: 9 0 3 2 6 4 5 5 7 4 2 6 4 2 0 3 2 5 3 6 4 3 2 5 3 1 4 4 7 0 0 1 4 0 0 4 1 输出样例#1: 2 并查集: 1.判断两两矩形是否有重合部分。 2.有就做并查集,合并成一个集合。 3.for一次判断有多少个集合。 时间复杂度:O(n^2)

var f,x,y,p,q:array [0..7001] of longint; i,j,n,ans,k,l:longint;function find(c:longint):longint;begin if f[c]=c then exit(c); f[c]:=find(f[c]); exit(f[c]);end;begin readln(n); for i:=1 to n do f[i]:=i; for i:=1 to n do begin readln(x[i],y[i],p[i],q[i]); for j:=1 to i-1 do if (p[i]>=x[j]) and (p[j]>=x[i]) and ((q[i]>=y[j]) and (q[j]>=y[i])) and (((p[i]<>x[j]) and (p[j]<>x[i])) or ((q[i]<>y[j]) and (q[j]<>y[i]))) then if find(i)<>find(j) then f[find(i)]:=find(j); end; for i:=1 to n do if f[i]=i then inc(ans); writeln(ans);end.
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表