Submission #1370437

#TimeUsernameProblemLanguageResultExecution timeMemory
1370437pcheloveksVoltage 2 (JOI26_voltage)C++20
10 / 100
27 ms676 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;

    int nigga = 1;
    while(s.size() != N) {
        bool flag = false;
        for(int i = 0; i < N; i++) {
            if(inSet[i]) continue;
            if(checkIsLeaf(i, N, s)) {
                flag = true;

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

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

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

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

                s.push_back(i);
                inSet[i] = true;
            }
        }

        if(!flag) {
            cout << N / 0 << endl;
            return false;
        } 
    }

    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;
}

Compilation message (stderr)

voltage.cpp: In function 'bool solve(int, int)':
voltage.cpp:58:23: warning: division by zero [-Wdiv-by-zero]
   58 |             cout << N / 0 << endl;
      |                     ~~^~~
#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...