제출 #613998

#제출 시각아이디문제언어결과실행 시간메모리
613998fvogel499통행료 (IOI18_highway)C++17
0 / 100
297 ms1172 KiB
#include "highway.h"
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define vi vector<int>
#define pii pair<int, int>
#define f first
#define s second
#define sz(x) (int)((x).size())

const int siz = 1e6+40;
int nbE;

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

int caller(vector<int> where) {
    vector<signed> u(nbE, 0);
    for (int i : where) {
        u[i] = 1; // se heavy
    }
    int r = ask(u);
    return r;
}

int twoP(vector<int> part, vector<signed> edgeX, vector<signed> edgeY) {
    set<int> se;
    for (int i : part) {
        se.insert(i);
    }
    vi where;
    for (int i = 0; i < nbE; i++) {
        int u = se.count(edgeX[i]);
        int v = se.count(edgeY[i]);
        if ((u^v) == 1) {
            where.push_back(i);
        }
    }
    return caller(where);
}

void find_pair(const signed n, std::vector<signed> edgeX, std::vector<signed> edgeY, signed aK, signed bK) {
    nbE = sz(edgeX);
    int distVert = caller({});
    vi part [2];
    while (1) {
        part[0] = part[1] = {};
        for (int i = 0; i < n; i++) {
            if (rng()%2) {
                part[0].push_back(i);
            } else {
                part[1].push_back(i);
            }
        }
        int r = twoP(part[0], edgeX, edgeY);
        if (r%2 != distVert%2) {
            break;
        }
    }
    for (int i = 0; i < 2; i++) {
        while (sz(part[i]) != 1) {
            assert(!part[i].empty());
            vi lp, rp;
            for (int j : part[i]) {
                if (sz(lp) <= sz(rp)) {
                    lp.push_back(j);
                } else {
                    rp.push_back(j);
                }
            }
            int r = twoP(lp, edgeX, edgeY);
            if (r%2 != distVert%2) {
                part[i] = lp;
            } else {
                part[i] = rp;
            }
        }
    }
    int ansX = part[0][0];
    int ansY = part[1][0];
    answer(ansX, ansY);
}
#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...