思路:每当出现存在同一行有会交头接耳的同学我们就把他们用其中列数较小的一个截下所能阻止的学生对数++,在线处理(按照所有通道所能阻止的人数进行降序排序)完之后用一种贪心策略即选取前k和前l个通道可以满足决策最优化,即最后行列各需要四次快排(2333还好有sort黑科技)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct way
{
int id,student;
}hang[2002],lie[2002];
int comp1(way a,way b)
{
return a.student>b.student;
}
int comp2(way a,way b)
{
return a.id<b.id;
}
int main ()
{
int m,n,k,l,d;
cin>>m>>n>>k>>l>>d;
int xi,yi,pi,qi;
for (int i=1;i<=m;i++)
hang[i].id=i,hang[i].student=0;
for (int i=1;i<=n;i++)
lie[i].id=i,lie[i].student=0;
for (int i=1;i<=d;i++)
{
cin>>xi>>yi>>pi>>qi;
if (xi==pi)
lie[min(yi,qi)].student++;
else
hang[min(xi,pi)].student++;
}
sort(hang+1,hang+1+m,comp1);
sort(lie+1,lie+1+n,comp1);
sort(hang+1,hang+k+1,comp2);
sort(lie+1,lie+l+1,comp2);
for (int i=1;i<=k;i++)
cout<<hang[i].id<<" ";
cout<<endl;
for (int i=1;i<=l;i++)
cout<<lie[i].id<<" ";
return 0;
}