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;
}
  |