Submission #566123

# Submission time Handle Problem Language Result Execution time Memory
566123 2022-05-21T20:48:15 Z piOOE ICC (CEOI16_icc) C++17
61 / 100
186 ms 612 KB
#include "icc.h"
#include <bits/stdc++.h>

using namespace std;

#define all(x) begin(x), end(x)
#define sz(x) ((int)size(x))
#define trace(x) cout << #x << ": " << (x) << endl;

typedef long long ll;

mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());

int ask(vector<int> a, vector<int> b) {
    for (int &x: a) ++x;
    for (int &y: b) ++y;
    return query(sz(a), sz(b), a.data(), b.data());
}

vector<int> p;

int get(int a) {
    return a == p[a] ? a : p[a] = get(p[a]);
}

bool mrg(int a, int b) {
    a = get(a), b = get(b);
    if (a == b) {
        return false;
    }
    p[b] = a;
    return true;
}

void run(int n) {
    p.resize(n);
    iota(all(p), 0);
    for (int cnt = 1; cnt < n; ++cnt) {
        vector<int> v;
        for (int i = 0; i < n; ++i) {
            if (p[i] == i) v.push_back(i);
        }
        while (true) {
            vector<int> aa, bb, a, b;
            for (int i = 0; i < sz(v); ++i) {
                if ((rnd() & 1) == (i & 1)) aa.push_back(v[i]);
                else bb.push_back(v[i]);
            }
            for (int x: aa) {
                for (int i = 0; i < n; ++i)
                    if (get(i) == x)
                        a.push_back(i);
            }

            for (int x: bb) {
                for (int i = 0; i < n; ++i)
                    if (get(i) == x)
                        b.push_back(i);
            }

            if (!a.empty() && !b.empty() && ask(a, b)) {
                int l = -1, r = sz(a) - 1;
                while (l + 1 < r) {
                    vector<int> cc;
                    int m = (l + r) >> 1;
                    for (int i = 0; i <= m; ++i) cc.push_back(a[i]);
                    if (!ask(cc, b)) l = m;
                    else r = m;
                }
                int v1 = a[r];
                l = -1, r = sz(b) - 1;
                while (l + 1 < r) {
                    vector<int> cc;
                    int m = (l + r) >> 1;
                    for (int i = 0; i <= m; ++i) cc.push_back(b[i]);
                    if (!ask(a, cc)) l = m;
                    else r = m;
                }
                int v2 = b[r];
                mrg(v1, v2);
                setRoad(v1 + 1, v2 + 1);
                break;
            }
        }
    }
}
# Verdict Execution time Memory Grader output
1 Correct 5 ms 468 KB Ok! 102 queries used.
2 Correct 5 ms 468 KB Ok! 105 queries used.
# Verdict Execution time Memory Grader output
1 Correct 32 ms 480 KB Ok! 552 queries used.
2 Correct 51 ms 476 KB Ok! 884 queries used.
3 Correct 47 ms 476 KB Ok! 829 queries used.
# Verdict Execution time Memory Grader output
1 Correct 140 ms 504 KB Ok! 1578 queries used.
2 Correct 186 ms 496 KB Ok! 2166 queries used.
3 Correct 140 ms 500 KB Ok! 1728 queries used.
4 Correct 150 ms 468 KB Ok! 1763 queries used.
# Verdict Execution time Memory Grader output
1 Correct 142 ms 468 KB Ok! 1679 queries used.
2 Correct 137 ms 484 KB Ok! 1705 queries used.
3 Correct 156 ms 484 KB Ok! 1864 queries used.
4 Correct 138 ms 468 KB Ok! 1674 queries used.
# Verdict Execution time Memory Grader output
1 Incorrect 170 ms 592 KB Too many queries! 1942 out of 1775
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 160 ms 612 KB Too many queries! 1909 out of 1625
2 Halted 0 ms 0 KB -