Submission #1355446

#TimeUsernameProblemLanguageResultExecution timeMemory
1355446kasamchiVoltage 2 (JOI26_voltage)C++20
100 / 100
47 ms948 KiB
#include "voltage.h"
#include <bits/stdc++.h>
using namespace std;

bool solve(int N, int M) {
    queue<int> quu;
    vector<bool> vis(N);
    for (int i = 0; i < N; i++) {
        vector<int> x(N, 1), y(N, 1);
        x[i] = 0;
        if (query(x, y) == 0) {
            quu.push(i);
        }
    }

    while (!quu.empty()) {
        int u = quu.front();
        quu.pop();
        if (vis[u]) {
            continue;
        }
        vis[u] = true;

        vector<int> cands;
        for (int i = 0; i < N; i++) {
            if (!vis[i]) {
                cands.push_back(i);
            }
        }

        while (true) {
            int ll = 0, rr = cands.size() + 1;
            while (ll + 1 < rr) {
                int mm = ll + (rr - ll) / 2;
                vector<int> x(N, 1), y(N, 1);
                for (int i = 0; i < mm; i++) {
                    x[cands[i]] = y[cands[i]] = 0;
                }
                for (int i = 0; i < N; i++) {
                    if (vis[i]) {
                        x[i] = y[i] = 0;
                    }
                }
                x[u] = 1;
                if (query(x, y) == 0) {
                    ll = mm;
                } else {
                    rr = mm;
                }
            }
            if (rr < cands.size() + 1) {
                int v = cands[rr - 1];
                answer(u, v), cands.erase(cands.begin() + rr - 1), M--;

                vector<int> x(N, 1), y(N, 1);
                for (int i = 0; i < N; i++) {
                    if (vis[i]) {
                        x[i] = y[i] = 0;
                    }
                }
                x[v] = 0;
                if (query(x, y) == 0) {
                    quu.push(v);
                }
            } else {
                break;
            }
        }
    }
    return (M == 0);
}
#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...