AtCoder Regular Contest 092 C - 2D Plane 2N Points(二分图匹配)
Problem Statement
On a two-dimensional plane, there are N red points and N blue points. The coordinates of the i-th red point are (ai,bi), and the coordinates of the i-th blue point are (ci,di).
A red point and a blue point can form a friendly pair when, the x-coordinate of the red point is smaller than that of the blue point, and the y-coordinate of the red point is also smaller than that of the blue point.
At most how many friendly pairs can you form? Note that a point cannot belong to multiple pairs.
Constraints
- All input values are integers.
- 1≤N≤100
- 0≤ai,bi,ci,di<2N
- a1,a2,…,aN,c1,c2,…,cN are all different.
- b1,b2,…,bN,d1,d2,…,dN are all different.
Input
Input is given from Standard Input in the following format:
N a1 b1 a2 b2 : aN bN c1 d1 c2 d2 : cN dN
Output
Print the maximum number of friendly pairs.
Sample Input 1
3 2 0 3 1 1 3 4 2 0 4 5 5
Sample Output 1
2
For example, you can pair (2,0) and (4,2), then (3,1) and (5,5).
Sample Input 2
3 0 0 1 1 5 2 2 3 3 4 4 5
Sample Output 2
2
For example, you can pair (0,0) and (2,3), then (1,1) and (3,4).
Sample Input 3
2 2 2 3 3 0 0 1 1
Sample Output 3
0
It is possible that no pair can be formed.
Sample Input 4
5 0 0 7 3 2 2 4 8 1 6 8 5 6 9 5 4 9 1 3 7
Sample Output 4
5
Sample Input 5
5 0 0 1 1 5 5 6 6 7 7 2 2 3 3 4 4 8 8 9 9
Sample Output 5
4
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int N=310; 5 pair<int,int> p[N]; 6 int vis[N],match[N]; 7 int n; 8 int Find(int u) 9 { 10 for(int i=n+1;i<=n+n;i++) 11 { 12 if(p[i].first>p[u].first&&p[i].second>p[u].second&&!vis[i]) 13 { 14 vis[i]=1; 15 if(!match[i]||Find(match[i])) 16 { 17 match[i]=u; 18 return 1; 19 } 20 } 21 } 22 return 0; 23 } 24 int main() 25 { 26 cin>>n; 27 for(int i=1;i<=n+n;i++) 28 cin>>p[i].first>>p[i].second; 29 int ans=0; 30 for(int i=1;i<=n;i++) 31 { 32 memset(vis,0,sizeof(vis)); 33 if(Find(i)) 34 ans++; 35 } 36 cout<<ans; 37 return 0; 38 }