1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| // 더 많은 정보는 42jerrykim.github.io 에서 확인하세요.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k, p;
if (!(cin >> n >> k >> p)) return 0;
vector<vector<int>> pos(n, vector<int>(k + 1));
for (int j = 0; j < n; ++j) {
for (int r = 1; r <= k; ++r) {
int id; cin >> id;
pos[j][id] = r;
}
}
const int maj = (n / 2) + 1;
auto beats = [&](int a, int b) -> bool {
int cnt = 0;
for (int j = 0; j < n; ++j) {
if (pos[j][a] < pos[j][b]) {
if (++cnt >= maj) return true;
}
}
return false;
};
function<vector<int>(const vector<int>&)> build = [&](const vector<int>& v) -> vector<int> {
if (v.size() <= 1) return v;
size_t mid = v.size() / 2;
vector<int> L(v.begin(), v.begin() + mid);
vector<int> R(v.begin() + mid, v.end());
L = build(L);
R = build(R);
vector<int> res; res.reserve(v.size());
size_t i = 0, j = 0;
while (i < L.size() && j < R.size()) {
if (beats(L[i], R[j])) res.push_back(L[i++]);
else res.push_back(R[j++]);
}
while (i < L.size()) res.push_back(L[i++]);
while (j < R.size()) res.push_back(R[j++]);
return res;
};
vector<int> all(k); iota(all.begin(), all.end(), 1);
vector<int> order = build(all);
for (int i = 0; i < p; ++i) {
if (i) cout << ' ';
cout << order[i];
}
cout << '\n';
return 0;
}
|