제출 #713829

#제출 시각아이디문제언어결과실행 시간메모리
713829PixelCat통행료 (IOI18_highway)C++14
5 / 100
17 ms5072 KiB
#ifdef NYAOWO
#include "grader.cpp"
#endif
#include "highway.h"

#include <bits/stdc++.h>
#define For(i, a, b) for(int i = a; i <= b; i++)
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define sz(x) ((int)x.size())
#define eb emplace_back
using namespace std;
using LL = long long;
using pii = pair<int, int>;

const int MAXN = 90010;

vector<int> adj[MAXN];
int d[MAXN];
int eid[MAXN];

void dfs(int n, int p, int dep) {
    d[n] = dep;
    for(auto &i:adj[n]) if(i != p) {
        dfs(i, n, dep + 1);
    }
}

int query(const vector<int> &v, int M) {
    vector<int> w(M, 0);
    for(auto &i:v) w[eid[i]] = 1;
    return ask(w);
}

int solve(int N, int M, vector<int> &cand, int dist) {
    int m = sz(cand);
    if(m == 1) return cand[0];
    int mi = m / 2;
    vector<int> v1(cand.begin(), cand.begin() + mi);
    vector<int> v2(cand.begin() + mi, cand.end());
    if(query(v1, M) > dist) return solve(N, M, v1, dist);
    return solve(N, M, v2, dist);
}

void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) {
    cerr << A << " " << B << "\n";
    int M = U.size();
    assert(M == N - 1);
    int dist = ask(vector<int>(M, 0));
    assert(dist % A == 0);

    For(i, 0, M - 1) {
        adj[U[i]].eb(V[i]);
        adj[V[i]].eb(U[i]);
    }
    dfs(0, 0, 0);
    For(i, 0, M - 1) {
        if(d[U[i]] < d[V[i]]) eid[V[i]] = i;
        else eid[U[i]] = i;
    }

    For(i, 1, N - 1) {
        if(d[i] == dist / A) {
            if(query(vector<int>(1, i), M) > dist) {
                answer(0, i);
                return;
            }
        }
    }
    For(i, 0, 1000) query(vector<int>(1, 2), M);

    return;

    vector<int> cand;
    For(i, 0, N - 1) if(d[i] == dist / A) cand.eb(i);
    answer(0, solve(N, M, cand, dist));

    // for (int j = 0; j < 50; ++j) {
    //     std::vector<int> w(M);
    //     for (int i = 0; i < M; ++i) {
    //         w[i] = 0;
    //     }
    //     long long toll = ask(w);
    // }
    // answer(0, N - 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...