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