分析
显然横向通道和纵向通道的放置是相互独立的,所以我们可以只考虑放一种通道应该怎么放,
贪心的放,优先放更多对的地方,可以拆分的对数会更多。
#include <bits/stdc++.h> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) #define pii pair<int,int> #define int long long const int inf = 0x3f3f3f3f; const int maxn = 2110; const int M = 1e9+7; int n,m,k,l,d; int a[maxn],b[maxn]; struct node { int x,id; bool operator < (const node tmp) const { return x > tmp.x; } }c[maxn]; signed main() { ios::sync_with_stdio(false);cin.tie(0); cin>>n>>m>>k>>l>>d; int x1,x2,y1,y2; for(int i = 1; i <= d; i++) { cin>>x1>>y1>>x2>>y2; if(x1 == x2) { b[min(y1,y2)]++; //竖线 } else { a[min(x1,x2)]++; //横线 } } for(int i = 1; i <= m; i++) { c[i].x = a[i]; c[i].id = i; } sort(c+1,c+1+m); for(int i = 1; i <= k; i++) a[i] = c[i].id; sort(a+1,a+1+k); for(int i = 1; i <= k; i++) cout<<a[i]<<' '; cout<<endl; for(int i = 1; i <= n; i++) { c[i].x = b[i]; c[i].id = i; } sort(c+1,c+1+n); for(int i = 1; i <= l; i++) b[i] = c[i].id; sort(b+1,b+1+l); for(int i = 1; i <= l; i++) cout<<b[i]<<' '; cout<<endl; return 0; }