답안 #867920

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
867920 2023-10-29T19:26:14 Z borisAngelov 사육제 (CEOI14_carnival) C++17
0 / 100
15 ms 464 KB
#include <bits/stdc++.h>

using namespace std;

const int maxn = 1005;

int n;

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

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

    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 (sz[x] < sz[y])
        {
            par[x] = y;
            sz[y] += sz[x];
        }
        else
        {
            par[y] = x;
            sz[x] += sz[y];
        }
    }
};

DSU dsu;

int query(const vector<int>& indexes)
{
    cout << indexes.size() << " ";

    for (int i = 0; i < indexes.size(); ++i)
    {
        cout << indexes[i] << ' ';
    }

    cout << endl;

    int answer;

    cin >> answer;

    return answer;
}

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

int main()
{
    fastIO();

    cin >> n;

    dsu.build(n);

    for (int i = 1; i <= n; ++i)
    {
        vector<int> indexes;

        for (int j = 1; j <= i - 1; ++j)
        {
            indexes.push_back(j);
        }

        int diffWithout = (indexes.empty() ? 0 : query(indexes));

        indexes.push_back(i);

        int diffWith = query(indexes);

        if (diffWith == diffWithout) // => i is not a root
        {
            int l = 1;
            int r = i - 1;

            while (l <= r)
            {
                int mid = (l + r) / 2;

                vector<int> preffix;

                for (int j = 1; j <= mid; ++j)
                {
                    preffix.push_back(j);
                }

                diffWithout = query(preffix);

                preffix.push_back(i);

                diffWith = query(preffix);

                if (diffWith == diffWithout)
                {
                    r = mid - 1;
                }
                else
                {
                    l = mid + 1;
                }
            }

            dsu.connect(l, i);
        }
    }

    cout << 0 << " ";

    for (int i = 1; i <= n; ++i)
    {
        if (dsu.root(i) > n)
        {
            return 1;
        }

        cout << dsu.root(i) << ' ';
    }

    cout << endl;

    return 0;
}

Compilation message

carnival.cpp: In function 'int query(const std::vector<int>&)':
carnival.cpp:62:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |     for (int i = 0; i < indexes.size(); ++i)
      |                     ~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 9 ms 456 KB Integer 19 violates the range [1, 11]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 12 ms 344 KB Integer 6 violates the range [1, 5]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 456 KB Output is correct
2 Incorrect 9 ms 460 KB Integer 11 violates the range [1, 8]
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 10 ms 464 KB Integer 5 violates the range [1, 4]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 452 KB Output is correct
2 Incorrect 9 ms 460 KB Integer 20 violates the range [1, 17]
3 Halted 0 ms 0 KB -