题目大意:在一个二维平面上放一些字母。每个字母数量相同,问能否画一些划分二维平面的直线,使得相同字符全部分布在一个区域,且该区域仅有这一种字符。
题解:首先我们定义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 }