STL大法好

首先用两个map统计某一行和某一列交头接耳的人数,然后用两个set按人数从大到小的顺序排列好,就可以贪心统计价值最大的行和列了,最后用一个桶把价值最大的行和列装进去,排个序就好了。
#include<bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;
int m,n,k,l,d;
int main(){
    cin>>m>>n>>k>>l>>d;
    set<pii,greater<pii>> s1;
    set<pii,greater<pii>> s2;
    map<int,int> mp1;
    map<int,int> mp2;
    for(int i=1;i<=d;i++){
        int x1,y1,x2,y2;
        cin>>x1>>y1>>x2>>y2;
        if(x1==x2){
            int mn=min(y1,y2);
            mp1[mn]++;
        }else if(y1==y2){
            int mn=min(x1,x2);
            mp2[mn]++;
        }
    }
    for(auto it:mp1){
        s1.insert({it.second,it.first});
    }
    for(auto it:mp2){
        s2.insert({it.second,it.first});
    }
    vector<int> ans1,ans2;
    for(auto it:s1){
        if(!l) break;
        ans1.push_back(it.second);
        l--;
    }
    for(auto it:s2){
        if(!k) break;
        ans2.push_back(it.second);
        k--;
    }
    sort(ans1.begin(),ans1.end());
    sort(ans2.begin(),ans2.end());
    for(int i=0;i<ans2.size()-1;i++){
        cout<<ans2[i]<<" ";
    }
    cout<<ans2[ans2.size()-1]<<endl;
    for(int i=0;i<ans1.size()-1;i++){
        cout<<ans1[i]<<" ";
    }
    cout<<ans1[ans1.size()-1]<<endl;
    return 0;
}