Submission #1370425

#TimeUsernameProblemLanguageResultExecution timeMemory
1370425pcheloveksVoltage 2 (JOI26_voltage)C++20
10 / 100
31 ms680 KiB
#include "voltage.h"

#include <bits/stdc++.h>

using namespace std;

bool checkIsLeaf(int val, int n, vector < int >& s) {
    vector < int > a(n, 1), b(n, 0);

    for(auto x: s) {
        a[x] = 0;
    }
    a[val] = 0;

    int tmp = query(a, b);

    return (query(a, b) == 0);
}

bool solve(int N, int M) {
    vector < int > s;
    vector < bool > inSet(N, false);

    vector < pair < int, int > > res;

    vector < int > tmp;
    for(int i = 0; i < N; i++) {
        if(checkIsLeaf(i, N, s)) {
            tmp.push_back(i); 
            inSet[i] = true;
        }
    }

    s = tmp;

    while(s.size() != N) {
        vector < int > a;
        for(int i = 0; i < N; i++) if(!inSet[i]) a.push_back(i);

        int L = -1, R = a.size() + 1;
        while(R - L > 1) {
            int mid = (L + R) >> 1;

            vector < int > v1(N, 0), v2(N, 0);
            for(int i = 0; i < mid; i++) {
                v1[a[i]] = 1; v2[a[i]] = 1;
            }
            for(int i = mid; i < a.size(); i++) {
                v1[a[i]] = 0; v2[a[i]] = 0;
            }

            for(auto x: s) {
                v1[x] = 0;
                v2[x] = 1;
            }

            if(query(v1, v2) == 0) R = mid;
            else L = mid;
        }

        if(R == a.size() + 1) {
            return false;
        }

        int x = a[R - 1];

        if(checkIsLeaf(x, N, s)) {

            vector < int > prev(N, 1);
            vector < int > curr(N, 1);

            for(auto x: s) {
                prev[x] = 0;
                curr[x] = 0;
            }
            prev[x] = 0; curr[x] = 0;

            for(int j = s.size() - 1; j >= 0; j--) {
                curr[s[j]] = 1;

                if(query(curr, prev) == -1) {
                    res.push_back({s[j], x});
                }
                prev = curr;
            }

            s.push_back(x);
            inSet[x] = true;
        }
        else return false;
    }

    for(auto x: res) answer(x.first, x.second);

    return true;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...