답안 #522925

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
522925 2022-02-06T13:00:44 Z qwerasdfzxcl Park (JOI17_park) C++14
50 / 100
471 ms 1448 KB
#include "park.h"
#include <bits/stdc++.h>
 
using namespace std;
typedef long long ll;
 
static int Place[1400];
int a[1400], Qcnt;
 
int ask(int x, int y){assert(++Qcnt<=30000); 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 12 ms 460 KB Output is correct
3 Correct 9 ms 372 KB Output is correct
4 Correct 26 ms 520 KB Output is correct
5 Correct 45 ms 500 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 416 ms 596 KB Output is correct
2 Correct 232 ms 576 KB Output is correct
3 Correct 287 ms 700 KB Output is correct
4 Correct 414 ms 644 KB Output is correct
5 Correct 471 ms 620 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 283 ms 576 KB Output is correct
2 Correct 319 ms 580 KB Output is correct
3 Correct 305 ms 572 KB Output is correct
4 Runtime error 336 ms 1100 KB Execution killed with signal 6
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 132 ms 536 KB Output is correct
2 Correct 312 ms 536 KB Output is correct
3 Correct 324 ms 584 KB Output is correct
4 Correct 322 ms 572 KB Output is correct
5 Correct 311 ms 560 KB Output is correct
6 Correct 350 ms 568 KB Output is correct
7 Correct 360 ms 700 KB Output is correct
8 Correct 311 ms 536 KB Output is correct
9 Correct 318 ms 580 KB Output is correct
10 Correct 361 ms 580 KB Output is correct
11 Correct 337 ms 604 KB Output is correct
12 Correct 326 ms 688 KB Output is correct
13 Correct 341 ms 552 KB Output is correct
14 Correct 350 ms 948 KB Output is correct
15 Correct 329 ms 556 KB Output is correct
16 Correct 320 ms 584 KB Output is correct
17 Correct 438 ms 588 KB Output is correct
18 Correct 353 ms 836 KB Output is correct
19 Correct 358 ms 576 KB Output is correct
20 Correct 331 ms 544 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 384 ms 612 KB Output is correct
2 Runtime error 397 ms 1448 KB Execution killed with signal 6
3 Halted 0 ms 0 KB -