# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
568303 | blue | Park (JOI17_park) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "park.h"
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
using vi = vector<int>;
using vvi = vector<vi>;
using pii = pair<int, int>;
using vpii = vector<pii>;
#define sz(x) int(x.size())
int N;
const int maxN = 1400;
static int Place[maxN];
vi parent(maxN, 0);
vi inserted(maxN, 0);
vi children[maxN];
bool ask(int A, int B, int Place[])
{
return Ask(min(A, B), max(A, B), Place);
}
void answer(int a, int b)
{
Answer(min(a, b), max(a, b));
}
bool connected(int u, int v)
{
for(int i = 0; i < N; i++)
Place[i] = 0;
Place[u] = Place[v] = 1;
return ask(u, v, Place);
}
void dfs(int u, int x, int y, vi& res, vi& vis)
{
vis[u] = 1;
if(u != x && u != y)
res.push_back(u);
for(int v : children[u])
dfs(v, x, y, res, vis);
}
vi ordering(int x, int y)
{
vi vis(N, 0);
vi res;
dfs(0, x, y);
for(int i = 0; i < N; i++)
if(!vis[i])
res.push_back(i);
return res;
}
void insert_node(int u, int a)
{
if(inserted[u]) return;
// cerr << "insert node " << u << ' ' << a << '\n';
if(connected(u, a))
{
parent[u] = a;
children[a].push_back(u);
inserted[u] = 1;
return;
}
vi searchlist = ordering(u, a);
while(sz(searchlist) > 1)
{
int md = sz(searchlist)/2;
vi lft, rgt;
for(int i = 0; i < sz(searchlist); i++)
{
if(i < md)
lft.push_back(searchlist[i]);
else
rgt.push_back(searchlist[i]);
}
for(int i = 0; i < N; i++)
Place[i] = 0;
for(int f : rgt)
Place[f] = 1;
Place[u] = Place[a] = 1;
if(ask(u, a, Place))
searchlist = lft;
else
searchlist = rgt;
}
int z = searchlist[0];
insert_node(u, z);
insert_node(z, a);
}
void Detect(int T, int N_)
{
N = N_;
inserted[0] = 1;
for(int i = 1; i < N; i++)
insert_node(i, 0);
for(int i = 1; i < N; i++)
answer(i, parent[i]);
}