因为每条线需要切割尽可能多的同学
所以每条线必定经过至少一对同学
#include<bits/stdc++.h>
using namespace std;
int m,n,k,l,d;
struct jttx
{
int x,y,x2,y2;
}
s[10000];//交头接耳的同学
struct road//分割线
{
int xy,sum;
}
h[10000],x[10000];//横线和竖线
void sousuo(int dq)//搜索(算是)
{
if(s[dq].x==s[dq].x2)//如果两个同学中间夹得是列(在同一行)
{
for(int i=1;i<=d;i++)//枚举每对交头接耳的同学
{
if(s[i].y==s[dq].y&&s[i].y2==s[dq].y2)
{
x[dq].sum++;
}
}
x[dq].xy=s[dq].y;//存储坐标
}
else//在同列即枚举行
{
for(int i=1;i<=d;i++)
{
if(s[i].x==s[dq].x&&s[i].x2==s[dq].x2)
{
h[dq].sum++;
}
}
h[dq].xy=s[dq].x;
}
}
bool cmp(road a,road b)//贪心
{
if(a.sum!=b.sum)//不同人数将大的向前
{
return a.sum>b.sum;
}
else
{
return a.xy<b.xy;//同人数将在前的往前
}
}
int main()
{
cin>>m>>n>>k>>l>>d;
for(int i=1;i<=d;i++)
{
int x,y,x2,y2;
cin>>x>>y>>x2>>y2;
if(x==x2)
{
s[i].x=x;s[i].x2=x;
s[i].y=min(y,y2);s[i].y2=max(y,y2);
}
else
{
s[i].y=y;s[i].y2=y;
s[i].x=min(x,x2);s[i].x2=max(x,x2);
}
}
for(int i=1;i<=d;i++)
{
sousuo(i);//枚举每对
}
sort(h+1,h+1+d,cmp);sort(x+1,x+1+d,cmp);//贪心
for(int i=1;i<=k;i++)
{
cout<<h[i].xy<<" ";
}
cout<<endl;
for(int i=1;i<=l;i++)
{
cout<<x[i].xy<<" ";
}
}