답안 #1032137

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1032137 2024-07-23T12:25:13 Z borisAngelov Pictionary (COCI18_pictionary) C++17
126 / 140
108 ms 48472 KB
#include <bits/stdc++.h>

using namespace std;

const int maxn = 100005;

int n, m, k;
pair<int, int> queries[maxn];
int answers[maxn];

struct DSU
{
    int par[maxn];
    int dep[maxn];

    void init(int n)
    {
        for (int i = 1; i <= n; ++i)
        {
            dep[i] = 1;
            par[i] = i;
        }
    }

    int root(int node)
    {
        if (node == par[node]) return node;
        return par[node] = root(par[node]);
    }

    void connect(int x, int y)
    {
        x = root(x);
        y = root(y);

        if (x == y) return;

        if (dep[x] < dep[y]) swap(x, y);

        par[y] = x;

        if (dep[x] == dep[y]) ++dep[x];
    }

    bool areConnected(int x, int y)
    {
        return root(x) == root(y);
    }
};

DSU dsu;
vector<int> tree[4 * maxn];

struct ParallelNode
{
    int node;
    int l;
    int r;
    int level;
};

void fastIO()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

int main()
{
    fastIO();

    cin >> n >> m >> k;

    for (int i = 1; i <= k; ++i)
    {
        cin >> queries[i].first >> queries[i].second;
    }

    for (int i = 1; i <= k; ++i)
    {
        tree[1].push_back(i);
        answers[i] = m;
    }

    int prvLevel = -1;
    int ptrLevel = 0;
    queue<ParallelNode> q;
    q.push({1, 1, m, 1});

    while (!q.empty())
    {
        ParallelNode curr = q.front();
        q.pop();

        if (prvLevel != curr.level)
        {
            prvLevel = curr.level;
            dsu.init(n);
            ptrLevel = 0;
        }

        int mid = (curr.l + curr.r) / 2;

        for (int i = ptrLevel + 1; i <= mid; ++i)
        {
            int gcd = m - i + 1;

            for (int nodeNum = gcd; nodeNum + gcd <= n; nodeNum += gcd)
            {
                dsu.connect(nodeNum, nodeNum + gcd);
            }
        }

        ptrLevel = mid;

        int node = curr.node;

        for (int i = 0; i < tree[node].size(); ++i)
        {
            int idx = tree[node][i];

            //cout << mid << " :: " << queries[idx].first << " " << queries[idx].second << " :: " << dsu.areConnected(queries[idx].first, queries[idx].second) << endl;

            if (dsu.areConnected(queries[idx].first, queries[idx].second) == true)
            {
                answers[idx] = min(answers[idx], mid);
                tree[2 * node].push_back(idx);
            }
            else
            {
                tree[2 * node + 1].push_back(idx);
            }
        }

        if (curr.l == curr.r) continue;

        if (!tree[2 * node].empty())
        {
            q.push({2 * node, curr.l, mid, curr.level + 1});
        }

        if (!tree[2 * node + 1].empty())
        {
            q.push({2 * node + 1, mid + 1, curr.r, curr.level + 1});
        }
    }

    for (int i = 1; i <= k; ++i)
    {
        cout << answers[i] << "\n";
    }

    return 0;
}

Compilation message

pictionary.cpp: In function 'int main()':
pictionary.cpp:119:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  119 |         for (int i = 0; i < tree[node].size(); ++i)
      |                         ~~^~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 10072 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 11100 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 14684 KB Output is correct
2 Correct 21 ms 14108 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 31 ms 16804 KB Output is correct
2 Correct 35 ms 15884 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 34 ms 15432 KB Output is correct
2 Correct 32 ms 14940 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 41 ms 16212 KB Output is correct
2 Correct 35 ms 14552 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 57 ms 19028 KB Output is correct
2 Correct 47 ms 16124 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 44 ms 16604 KB Output is correct
2 Correct 75 ms 20940 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 86 ms 23196 KB Output is correct
2 Correct 102 ms 21204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 108 ms 48472 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -