제출 #1350540

#제출 시각아이디문제언어결과실행 시간메모리
1350540tvgkVoltage 2 (JOI26_voltage)C++20
100 / 100
35 ms980 KiB
#include<bits/stdc++.h>
#include "voltage.h"
using namespace std;
#define task "a"
#define se second
#define fi first
#define ll long long
#define ii pair<ll, ll>
const long mxN = 2e5 + 7;

int n, m;
bool tt[mxN];

bool Leaf(int j)
{
    vector<int> v;
    for (int i = 0; i < n; i++)
        v.push_back(tt[i]);

    vector<int> u = v;
    u[j] = 0;
    return !query(u, v);
}

bool exist(int j, vector<int> t)
{
    vector<int> u(n, 0), v(n, 0);

    for (int j : t)
        u[j] = v[j] = 1;
    v[j] = 1;

//    cerr << "QUERY: " << j << "\n";
//    for (int i : u)
//        cerr << i << " ";
//    cerr << '\n';
//    for (int i : v)
//        cerr << i << " ";
//    cerr << '\n';

    return query(u, v);
}

bool solve(int N, int M)
{
    n = N;
    m = M;

    for (int i = 0; i < n; i++)
        tt[i] = 1;

    vector<int> topo;
    for (int i = 0; i < n; i++)
    {
        if (Leaf(i))
            topo.push_back(i);
    }

//    cerr << "TOPO: ";
//    for (int i : topo)
//        cerr << i << " ";
//    cerr << '\n';

    vector<ii> ans;
    while (topo.size())
    {
        int j = topo.back();
        topo.pop_back();
        tt[j] = 0;

        vector<int> rem;
        for (int i = 0; i < n; i++)
        {
            if (tt[i])
                rem.push_back(i);
        }

//        cerr << "REM: ";
//        for (int i : rem)
//            cerr << i << " ";
//        cerr << '\n';

        int stt = 0;
        vector<int> w;
        while (exist(j, w))
        {
            int l = 0, r = rem.size() - 1, res = 0;
            while (l <= r)
            {
                int mid = (l + r) / 2;

                vector<int> tmp;
                for (int u = 0; u < rem.size(); u++)
                {
                    if (u < stt || mid < u)
                        tmp.push_back(rem[u]);
                }

                if (exist(j, tmp))
                {
                    res = mid;
                    r = mid - 1;
                }
                else
                    l = mid + 1;
            }

            //cerr << "EDGE " << j << " " << rem[res] << '\n';

            w.push_back(rem[res]);
            ans.push_back({j, rem[res]});
            if (Leaf(rem[res]))
                topo.push_back(rem[res]);

            stt = res + 1;

            //break;
        }
    }

    if (ans.size() != m)
        return 0;

    for (ii i : ans)
        answer(i.fi, i.se);
    return 1;
}
#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...