タイトル説明
クラスは常にお互いにささやく学生や人々についてのいくつかの前後にある場合には、小学校の教師になる何かが非常に面倒なことです。しかし、雪の先生が座席の学生が確定したときに、限られたDはささやくでしょう、いくつかの興味深い現象を発見したときに、クラスの生徒。学生は教室で$ M $行の$ N $の列になった座って、学生が列に座っての位置は、iとj列が$である(i、j)は$は、inとout学生を容易にするために、教室の$に設定します横断チャンネルKの$、長手方向チャネルの$のL $の。だから、道のスマート雪考え、お互いにクラスのささやきの学生の、おそらく問題を低減することができる:彼女は2を分離するチャンネルは$ 2 $をささやくかのために、学生との間のチャネルの位置を変更するためにテーブルと椅子、テーブルと椅子を再配置する予定生徒たちは、その後、彼らはささやくないでしょう。あなたが雪にプログラムを書いてくださいだろう、我々は最高のチャネル分割方式を与えます。この方式の下では、クラスのささやきの学生の最小数。
入出力フォーマット
入力形式
最初の行、\(5 \)スペースで区切られた整数である\(M、N、K、ルK <M、0 L、D(2 \ルN、M \ル1000,0 \ \ルL <N、D \ル2000)\) 次\(D \)行を有する各列\(4 \)スペースで区切られた整数。最初の\(Iは\)行\(4 \)整数\(X_I、Y_I、P_I、Q_I \)は、着座位置表す\((X_I、Y_I)\ ) と\((P_I、Q_I)を\ ) (彼らはその隣接または水平方向に隣接することを確認するために入力する前と後)2人の学生がささやくます。最適解の一意性を確保するための入力データ。
出力フォーマット
2つのラインの合計。最初の行は$ K $の整数$ A_1、A_2、...、a_K $、$、最初の行と$ A_2 $ $ A_2 + 1 $のラインとの間に第一及びA_1 $の$のA_1 + 1 $行、間に線を表し含まれています行、$ a_iを<a_iを+ 1 $、二つの整数(ラインスペースのない端部)との間の空間によって分離されたそれぞれの間の通路を開くために...、$ a_k 1行$ $ a_K + $ 1。二行目は、L $ $整数$ B_1、B_2、...、B_L $、$、最初の列及びB_1 $ $ B_1 + 1 $行、最初の列と$ B_2 $ $ B_2 + 1 $列間表し含ま$ $ B_L +カラムおよびチャネルを開くために$ 1の間のカラム、$ b_i <b_i + 1 $、二つの整数(EOTスペースなし)との間の空間によって分離されたそれぞれの...、$ B_L。
サンプル入力と出力
入力サンプル#1
4 5 1 2 3
4 2 4 3
2 3 3 3
2 5 2 4
サンプル出力#1
2
2 4
説明
記号*、※、+マークによって上記の図\(3 \)学生の位置は、図ささやきする\(3 \)太線は、チャネル分割方式のみ図示され、チャネルの位置を示します最善の解決策。
2008年には、グループIIのタイトルの人気
考え
あなたは、シミュレーションを指示することができます小型から大型までの出力に注意を払う必要があります。
コード
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000 + 10;
int M, N, K, L, D;
set<int> ansl, ansc;
struct node
{
int id;
int val;
bool operator<(const node &rhs)
{
return val > rhs.val;
}
} lin[MAXN], cal[MAXN];
bool cmp(const node& a, const node& b)
{
return a.id < b.id;
}
void init(int m, int n)
{
for (int i = 1; i <= m; i++)
{
lin[i].id = i;
lin[i].val = 0;
}
for (int i = 1; i <= n; i++)
{
cal[i].id = i;
cal[i].val = 0;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
cin >> M >> N >> K >> L >> D;
init(M, N);
for (int i = 0; i < D; i++)
{
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
if (x1 == x2)
cal[min(y1, y2)].val++;
else
lin[min(x1, x2)].val++;
}
sort(lin + 1, lin + 1 + M);
sort(cal + 1, cal + 1 + N);
sort(lin + 1, lin + 1 + K, cmp);
sort(cal + 1, cal + 1 + L, cmp);
for (int i = 1; i <= K; i++)
{
if (i != 1)
cout << " ";
cout << lin[i].id;
if(i == K)cout << endl;
}
for (int i = 1; i <= L; i++)
{
if (i != 1)
cout << " ";
cout << cal[i].id;
if(i == L)cout << endl;
}
}