分析

显然横向通道和纵向通道的放置是相互独立的,所以我们可以只考虑放一种通道应该怎么放,

贪心的放,优先放更多对的地方,可以拆分的对数会更多。

#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;
}