贪心排过后还要再按序号从小到大再排一遍
#include <iostream>
#include <algorithm>
using namespace std;
struct Node{
int num;// 行/列号
int cnt;// 该行/列说话人数
};
bool cmp(Node a,Node b){//第一遍将说话人数多的行列排到前面
if(a.cnt!=b.cnt) return a.cnt>b.cnt;
else return a.num<b.num;
}
bool cmp2(Node a,Node b){//第二遍按序号从大到小再排一遍
return a.num<b.num;
}
int main(){
int m,n,k,l,d;
cin>>m>>n>>k>>l>>d;
int row1,line1,row2,line2;
Node row[m+1]={0},line[n+1]={0};
for(int i=0;i<m+1;i++)
row[i].num=i;// 相应行/列号赋值
for(int i=0;i<n+1;i++)
line[i].num=i;
while(d--){
cin>>row1>>line1>>row2>>line2;
if(row1==row2)
line[min(line1,line2)].cnt++;//由题意,加较小的一行/列
else if(line1==line2)
row[min(row1,row2)].cnt++;
}
sort(row,row+m+1,cmp);
sort(row,row+k,cmp2);//两组答案各排序两遍
sort(line,line+n+1,cmp);
sort(line,line+l,cmp2);
for(int i=0;i<k;i++){
if(i!=0) cout<<' ';
cout<<row[i].num;
}
cout<<endl;
for(int i=0;i<l;i++){
if(i!=0) cout<<' ';
cout<<line[i].num;
}
return 0;
}