답안 #522670

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
522670 2022-02-05T11:23:39 Z qwerasdfzxcl Park (JOI17_park) C++14
67 / 100
391 ms 684 KB
#include "park.h"
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

static int Place[1400];
int a[2020];

int ask(int x, int y){return Ask(min(x, y), max(x, y), Place);}

void answer(int x, int y){
    if (x>y) swap(x, y);
    Answer(x, y);
}

void _sort(int n){
    vector<int> ans = {0};

    for (int i=1;i<n;i++){
        fill(Place, Place+1400, 1);

        int l = 1, r = (int)ans.size()-1, idx = 0;
        while(l<=r){
            int m = (l+r)>>1;
            for (int j=m;j<(int)ans.size();j++) Place[ans[j]] = 0;

            if (ask(0, i)) r = m-1;
            else l = m+1, idx = m;

            for (int j=m;j<(int)ans.size();j++) Place[ans[j]] = 1;
        }
        ans.insert(ans.begin()+idx+1, i);
    }
    for (int i=0;i<n;i++) a[i] = ans[i];
}

vector<int> adj[1400], C, W;
int visited[1400];

void dfs(int s){
    if (visited[s]) return;
    visited[s] = 1;
    W.push_back(s);
    for (auto &v:adj[s]) if (Place[v]){
        dfs(v);
    }
}

void solve(vector<int> V, int x){
    fill(Place, Place+1400, 0);
    fill(visited, visited+1400, 0);
    Place[x] = 1;
    for (auto &v:V) Place[v] = 1;

    if (!ask(x, V[0])) return;

    W.clear();
    dfs(V[0]);
    int l = 0, r = (int)V.size()-1, idx = (int)V.size()-1;
    while(l<=r){
        int m = (l+r)>>1;
        for (int i=0;i<=m;i++) Place[W[i]] = 1;
        for (int i=m+1;i<(int)V.size();i++) Place[W[i]] = 0;

        if (ask(W[0], x)) idx = m, r = m-1;
        else l = m+1;
    }
    answer(W[idx], x);
    adj[W[idx]].push_back(x);
    adj[x].push_back(W[idx]);

    fill(Place, Place+1400, 0);
    for (auto &v:V) Place[v] = 1;
    Place[W[idx]] = 0;

    vector<int> N;
    for (auto &v:adj[W[idx]]) if (Place[v]) N.push_back(v);

    vector<vector<int>> nxt_comp;
    for (auto &nxt:N){
        W.clear();
        dfs(nxt);
        if (!W.empty()) nxt_comp.push_back(W);
    }

    for (auto &nV:nxt_comp){
        solve(nV, x);
    }
}

void Detect(int T, int N) {
    for (int i=1;i<N;i++) a[i] = i;
    _sort(N);

    //printf("A = ");
    //for (int i=0;i<N;i++) printf("%d ", a[i]);
    //printf("\n");

    C.push_back(0);
    for (int i=1;i<N;i++){
        solve(C, a[i]);
        C.push_back(a[i]);
    }
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 332 KB Wrong Answer[6]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 378 ms 572 KB Output is correct
2 Correct 173 ms 476 KB Output is correct
3 Correct 184 ms 564 KB Output is correct
4 Correct 391 ms 460 KB Output is correct
5 Correct 357 ms 612 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 244 ms 636 KB Output is correct
2 Correct 251 ms 424 KB Output is correct
3 Correct 274 ms 432 KB Output is correct
4 Correct 278 ms 680 KB Output is correct
5 Correct 265 ms 432 KB Output is correct
6 Correct 261 ms 516 KB Output is correct
7 Correct 255 ms 544 KB Output is correct
8 Correct 255 ms 452 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 108 ms 412 KB Output is correct
2 Correct 254 ms 604 KB Output is correct
3 Correct 263 ms 452 KB Output is correct
4 Correct 269 ms 412 KB Output is correct
5 Correct 253 ms 452 KB Output is correct
6 Correct 335 ms 460 KB Output is correct
7 Correct 300 ms 684 KB Output is correct
8 Correct 277 ms 428 KB Output is correct
9 Correct 250 ms 428 KB Output is correct
10 Correct 323 ms 576 KB Output is correct
11 Correct 274 ms 540 KB Output is correct
12 Correct 274 ms 492 KB Output is correct
13 Correct 302 ms 552 KB Output is correct
14 Correct 289 ms 536 KB Output is correct
15 Correct 258 ms 512 KB Output is correct
16 Correct 306 ms 424 KB Output is correct
17 Correct 353 ms 672 KB Output is correct
18 Correct 328 ms 500 KB Output is correct
19 Correct 300 ms 460 KB Output is correct
20 Correct 280 ms 540 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 283 ms 444 KB Wrong Answer[6]
2 Halted 0 ms 0 KB -