QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#608821#9424. Stop the Castle 2real_sigma_teamWA 58ms6572kbC++235.0kb2024-10-04 04:35:012024-10-04 04:35:01

Judging History

This is the latest submission verdict.

  • [2024-10-04 04:35:01]
  • Judged
  • Verdict: WA
  • Time: 58ms
  • Memory: 6572kb
  • [2024-10-04 04:35:01]
  • Submitted

answer

#include <bits/stdc++.h>
#include <immintrin.h>

using namespace std;

using ll = long long;
using ld = long double;
# define x first
# define y second
# define all(x) x.begin(), x.end()
# define rall(x) x.rbegin(), x.rend()

mt19937 mt(123);

void solve();
void init();

int32_t main() {
#ifndef LOCAL
    cin.tie(nullptr)->sync_with_stdio(false);
#endif
    init();
    cout << fixed << setprecision(10);
    int t = 1;
    cin >> t;
    while (t--) {
        solve();
    }
}

void init() {}

int get(int x, vector<int>& dsu) {
    return dsu[x] == x ? x : dsu[x] = get(dsu[x], dsu);
}

void merge(int x, int y, vector<int>& dsu) {
    dsu[get(y, dsu)] = get(x, dsu);
}

int tim;

bool try_kun(int s, vector<int>& used, vector<vector<int>>& g, vector<int>& pr) {
    used[s] = tim;
    for (int i : g[s]) {
        if (used[i] < tim) {
            if (pr[i] == -1) {
                pr[s] = i;
                pr[i] = s;
                return true;
            }
        }
    }
    for (int i : g[s]) {
        if (used[i] < tim && used[pr[i]] < tim) {
            if (try_kun(i, used, g, pr)) {
                pr[s] = i;
                pr[i] = s;
                return true;
            }
        }
    }
    return false;
}

void solve() {
    int n, m, k;
    cin >> n >> m >> k;
    vector<int> uv(m, 0), uh(m, 0);
    vector<pair<int, int>> a(n), b(m);
    unordered_map<int, vector<pair<int, int>>> v, h;
    for (int i = 0; i < n; i++) {
        cin >> a[i].x >> a[i].y;
        v[a[i].x].emplace_back(a[i].y, -1);
        h[a[i].y].emplace_back(a[i].x, -1);
    }
    vector<int> dsuv(m), dsuh(m);
    for (int i = 0; i < m; i++) {
        cin >> b[i].x >> b[i].y;
        v[b[i].x].emplace_back(b[i].y, i);
        h[b[i].y].emplace_back(b[i].x, i);
        dsuv[i] = i;
        dsuh[i] = i;
    }
    int ans = 0;
    for (auto [tr, vc] : v) {
        sort(all(vc));
        while (!vc.empty() && vc.back().y != -1) {
            vc.pop_back();
        }
        reverse(all(vc));
        while (!vc.empty() && vc.back().y != -1) {
            vc.pop_back();
        }
        reverse(all(vc));
        for (int i = 0; i + 1 < vc.size(); i++) {
            if (vc[i].y != -1 && vc[i + 1].y != -1) {
                merge(vc[i].y, vc[i + 1].y, dsuv);
            }
            if (vc[i].y == -1 && vc[i + 1].y == -1) {
                ans++;
            }
            if (vc[i].y != -1) {
                uv[vc[i].y] = 1;
            }
        }
    }
    for (auto [tr, vc] : h) {
        sort(all(vc));
        while (!vc.empty() && vc.back().y != -1) {
            vc.pop_back();
        }
        reverse(all(vc));
        while (!vc.empty() && vc.back().y != -1) {
            vc.pop_back();
        }
        reverse(all(vc));
        for (int i = 0; i + 1 < vc.size(); i++) {
            if (vc[i].y != -1 && vc[i + 1].y != -1) {
                merge(vc[i].y, vc[i + 1].y, dsuh);
            }
            if (vc[i].y == -1 && vc[i + 1].y == -1) {
                ans++;
            }
            if (vc[i].y != -1) {
                uh[vc[i].y] = 1;
            }
        }
    }
    vector<vector<int>> g(2 * m);
    vector<int> pr(2 * m, -1), cost(m, 0), usedv(m, 0), usedh(m, 0), used(2 * m, 0);
    for (int i = 0; i < m; i++) {
        if (uv[i] && uh[i]) {
            g[get(i, dsuv)].push_back(get(i, dsuh) + m);
        }
    }
    vector<pair<int, int>> ord(m);
    for (int i = 0; i < m; i++) {
        ord[i] = {g[i].size(), i};
    }
    sort(all(ord));
    for (int tr = 0; tr < m; tr++) {
        int i = ord[tr].y;
        for (int j : g[i]) {
            if (!used[j - m]) {
                pr[i] = j;
                pr[j] = i;
                used[j - m] = 1;
                break;
            }
        }
    }
    tim = 2;
    for (int i = 0; i < m; i++) {
        try_kun(i, used, g, pr);
        tim++;
    }

    for (int i = 0; i < m; i++) {
        if (uv[i] && uh[i] && pr[get(i, dsuv)] == get(i, dsuh) + m) {
            cost[i] = 2;
            usedv[get(i, dsuv)] = 1;
            usedh[get(i, dsuh)] = 1;
        }
    }
    for (int i = 0; i < m; i++) {
        if (uv[i] && !usedv[get(i, dsuv)]) {
            cost[i] = 1;
            usedv[get(i, dsuv)] = 1;
        }
        if (uh[i] && !usedh[get(i, dsuh)]) {
            cost[i] = 1;
            usedh[get(i, dsuh)] = 1;
        }
    }
    vector<int> res;
    for (int i = 0; i < m && res.size() < k; i++) {
        if (!cost[i]) {
            res.push_back(i + 1);
        }
    }
    for (int i = 0; i < m && res.size() < k; i++) {
        if (cost[i] == 1) {
            res.push_back(i + 1);
            ans++;
        }
    }
    for (int i = 0; i < m && res.size() < k; i++) {
        if (cost[i] == 2) {
            res.push_back(i + 1);
            ans += 2;
        }
    }
    cout << ans << '\n';
    for (int i : res) {
        cout << i << ' ';
    }
    cout << '\n';
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3504kb

input:

3
8 6 4
1 3
2 1
2 6
4 1
4 7
6 1
6 3
6 6
2 3
3 1
4 3
4 6
5 2
6 4
3 2 1
10 12
10 10
10 11
1 4
1 5
1 3 2
1 1
2 1
2 2
2 3

output:

4
3 5 2 6 
2
1 
0
1 2 

result:

ok ok 3 cases (3 test cases)

Test #2:

score: -100
Wrong Answer
time: 58ms
memory: 6572kb

input:

1224
11 17 14
7 3
4 2
8 13
3 15
3 4
5 11
10 2
3 3
8 6
7 11
2 3
10 4
1 3
12 1
2 5
11 9
11 6
11 10
8 15
1 5
9 14
4 11
1 6
10 7
7 6
11 4
8 4
1 11
18 3 2
14 8
2 14
13 13
9 12
14 12
5 6
8 1
10 5
8 6
8 9
6 6
7 5
12 11
6 11
13 5
1 10
7 6
14 5
6 15
2 4
11 1
1 6 4
14 14
13 9
9 3
10 12
7 5
8 13
9 14
1 9 8
4 9...

output:

7
1 2 3 4 5 6 7 8 9 10 11 12 13 15 
15
1 2 
0
1 2 3 4 
0
1 2 3 4 5 6 7 8 
11
1 3 
8
2 3 1 
0
1 2 3 4 5 6 7 8 9 10 11 12 
1
1 2 3 4 5 6 7 
8
1 2 3 
1
1 2 3 4 5 6 7 8 
7
1 2 
10
1 2 3 
1
1 2 3 4 5 6 7 8 10 11 12 
0
1 
1
1 2 
0
1 2 3 
7
1 2 3 4 6 
2
2 4 5 6 7 
4
1 2 3 4 5 6 
1
1 
1
1 2 3 4 5 6 
16
2 5 ...

result:

wrong answer Participant states the answer to be 21 but is actually 20 (test case 338)