답안 #522676

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

using namespace std;
typedef long long ll;

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

int ask(int x, int y){return Ask(min(x, y), max(x, y), Place);}
void answer(int x, int y){Answer(min(x, y), max(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=0;j<m;j++) Place[ans[j]] = 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;
        }
        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);
    fill(visited, visited+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);

    C.push_back(0);
    for (int i=1;i<N;i++){
        solve(C, a[i]);
        C.push_back(a[i]);
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 10 ms 460 KB Output is correct
3 Correct 9 ms 460 KB Output is correct
4 Correct 21 ms 460 KB Output is correct
5 Correct 40 ms 580 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 443 ms 608 KB Output is correct
2 Correct 232 ms 580 KB Output is correct
3 Correct 241 ms 692 KB Output is correct
4 Correct 436 ms 648 KB Output is correct
5 Correct 439 ms 580 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 277 ms 584 KB Output is correct
2 Correct 288 ms 680 KB Output is correct
3 Correct 322 ms 540 KB Output is correct
4 Correct 313 ms 704 KB Output is correct
5 Correct 331 ms 584 KB Output is correct
6 Correct 288 ms 592 KB Output is correct
7 Correct 326 ms 580 KB Output is correct
8 Correct 283 ms 552 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 141 ms 528 KB Output is correct
2 Correct 330 ms 680 KB Output is correct
3 Correct 306 ms 548 KB Output is correct
4 Correct 355 ms 804 KB Output is correct
5 Correct 298 ms 580 KB Output is correct
6 Correct 367 ms 588 KB Output is correct
7 Correct 345 ms 640 KB Output is correct
8 Correct 333 ms 544 KB Output is correct
9 Correct 313 ms 592 KB Output is correct
10 Correct 370 ms 592 KB Output is correct
11 Correct 329 ms 708 KB Output is correct
12 Correct 332 ms 548 KB Output is correct
13 Correct 329 ms 692 KB Output is correct
14 Correct 342 ms 496 KB Output is correct
15 Correct 312 ms 548 KB Output is correct
16 Correct 314 ms 568 KB Output is correct
17 Correct 414 ms 600 KB Output is correct
18 Correct 345 ms 596 KB Output is correct
19 Correct 368 ms 576 KB Output is correct
20 Correct 313 ms 528 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 384 ms 604 KB Output is correct
2 Correct 399 ms 604 KB Output is correct
3 Correct 312 ms 600 KB Output is correct
4 Correct 358 ms 712 KB Output is correct
5 Correct 365 ms 548 KB Output is correct
6 Correct 440 ms 852 KB Output is correct
7 Correct 379 ms 704 KB Output is correct
8 Correct 369 ms 612 KB Output is correct
9 Correct 366 ms 620 KB Output is correct
10 Correct 348 ms 860 KB Output is correct
11 Correct 328 ms 556 KB Output is correct
12 Correct 361 ms 568 KB Output is correct
13 Correct 319 ms 580 KB Output is correct
14 Correct 376 ms 632 KB Output is correct
15 Correct 372 ms 732 KB Output is correct
16 Correct 291 ms 540 KB Output is correct
17 Correct 439 ms 644 KB Output is correct
18 Correct 321 ms 596 KB Output is correct