题目大意:在一个二维平面上放一些字母。每个字母数量相同,问能否画一些划分二维平面的直线,使得相同字符全部分布在一个区域,且该区域仅有这一种字符。
题解:首先我们定义l,r,u,d四个数组,分别表示对某一个字符划分区域的左、右、上、下边界。然后分别对四个数组进行扩展:如果一个字符的左边界被包含在另一个字符的区域内,那么这个左边界就更新为包含区域的左边界,其他也相同。最后检查一遍两条坐标轴,如果存在左右边界交错的情况且上下边界也交错,这就是不能画的情况。
1 #include<iostream>
2 #include<algorithm>
3 #include<climits>
4 using namespace std;
5 int l[30],r[30],u[30],d[30];
6 bool judge_x(int x,int y)
7 {
8 if(l[x]>=l[y]&&l[x]<=r[y])
9 {
10 return true;
11 }
12 if(r[x]>=l[y]&&r[x]<=r[y])
13 {
14 return true;
15 }
16 return false;
17 }
18 bool judge_y(int x,int y)
19 {
20 if(d[x]>=d[y]&&d[x]<=u[y])
21 {
22 return true;
23 }
24 if(u[x]>=d[y]&&u[x]<=u[y])
25 {
26 return true;
27 }
28 return false;
29 }
30 int main()
31 {
32 int T;
33 cin>>T;
34 for(int t=1;t<=T;t++)
35 {
36 int n,m;
37 cin>>n>>m;
38 for(int i=1;i<=n;i++)
39 {
40 l[i]=INT_MAX;
41 r[i]=0;
42 d[i]=INT_MAX;
43 u[i]=0;
44 for(int j=1;j<=m;j++)
45 {
46 int x,y;
47 cin>>x>>y;
48 l[i]=min(l[i],x);
49 r[i]=max(r[i],x);
50 u[i]=max(u[i],y);
51 d[i]=min(d[i],y);
52 }
53 }
54 for(int i=1;i<=n;i++)
55 {
56 for(int j=1;j<=n;j++)
57 {
58 if(i==j)
59 {
60 continue;
61 }
62 if(l[i]>=l[j]&&l[i]<=r[j])
63 {
64 l[i]=l[j];
65 }
66 if(r[i]>=l[j]&&r[i]<=r[j])
67 {
68 r[i]=r[j];
69 }
70 if(d[i]>=d[j]&&d[i]<=u[j])
71 {
72 d[i]=d[j];
73 }
74 if(u[i]>=d[j]&&u[i]<=u[j])
75 {
76 u[i]=u[j];
77 }
78 }
79 }
80 bool flag=true;
81 for(int i=1;i<=n&&flag;i++)
82 {
83 for(int j=1;j<=n;j++)
84 {
85 if(i==j)
86 {
87 continue;
88 }
89 if(judge_x(i,j)&&judge_y(i,j))
90 {
91 flag=false;
92 break;
93 }
94 }
95 }
96 if(flag)
97 {
98 cout<<"YES"<<endl;
99 }
100 else
101 {
102 cout<<"NO"<<endl;
103 }
104 }
105 return 0;
106 }