제출 #1157226

#제출 시각아이디문제언어결과실행 시간메모리
1157226arwakhattabPictionary (COCI18_pictionary)C++20
140 / 140
125 ms9156 KiB
#include <bits/stdc++.h>
#define all(x) begin(x), end(x)
using namespace std;
using ll = long long;
const char nl = '\n', sp = ' ';

struct DSU {
    int n;
    vector<int> par, size;

    DSU() {
    }

    DSU(int n) : n(n) {
        par.assign(n, 0);
        size.assign(n, 1);
        iota(begin(par), end(par), 0);
    }

    int find(int v) {
        return (v == par[v] ? v : par[v] = find(par[v]));
    }

    bool is_connected(int a, int b) {
        return find(a) == find(b);
    }

    bool unite(int a, int b) {
        a = find(a), b = find(b);
        if (a == b) return false;
        if (size[a] < size[b]) swap(a, b);
        par[b] = a;
        size[a] += size[b];
        return true;
    }

    int sz(int v) {
        return size[find(v)];
    }
};

void solve() {
    int n, m, q;
    cin >> n >> m >> q;
    vector<array<int, 2> > qs(q);
    for (int i = 0; i < q; i++) {
        cin >> qs[i][0] >> qs[i][1];
        qs[i][0]--, qs[i][1]--;
    }

    vector<vector<array<int, 3> > > chk(m);
    int mid = (m - 1) >> 1;
    for (int i = 0; i < q; i++) {
        chk[mid].push_back({0, m - 1, i});
    }

    vector<int> ans(q, -1);
    for (int i = 0; i < 20; i++) {
        DSU dsu(n);
        for (int j = 0; j < m; j++) {
            int val = m - j;
            for (int k = 2 * val; k <= n; k += val) {
                dsu.unite(k - val - 1, k - 1);
            }
            for (auto [l, r, idx]: chk[j]) {
                auto [x, y] = qs[idx];
                int _l, _r;
                if (dsu.is_connected(x, y)) {
                    ans[idx] = j;
                    _l = l, _r = j - 1;
                } else {
                    _l = j + 1, _r = r;
                }
                if (_l > _r) continue;
                int nmid = (_l + _r) >> 1;
                chk[nmid].push_back({_l, _r, idx});
            }
            vector<array<int, 3> >().swap(chk[j]);
        }
    }

    for (auto &i: ans) cout << i + 1 << nl;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int t = 1;
    //cin >> t;
    while (t--) {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...