답안 #702827

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
702827 2023-02-25T08:31:07 Z ecxx popa (BOI18_popa) C++17
37 / 100
767 ms 432 KB
#include <bits/stdc++.h>
#include "popa.h"

using namespace std;

int solve(int n,int* lc,int* rc) {

    vector<int> lp(1001, -1), rp(1001, -1), lupa(1001, -1), rupa(1001, -1), lch(1001, -1), rch(1001, -1);

    for (int i = 0; i < n; i++) {

        // find lp and rp !!

        int lo, hi, mid;

        lo=0;hi=i;

        while (lo < hi) {
            // accept 1s, reject 0s
            mid = (lo+hi)>>1;

            if (query(mid, i, i, i)) {
                hi = mid;
            } else { // =0
                lo = mid+1;
            }

        }

        lp[i] = lo-1;

        lo=i;hi=n-1;

        while (lo < hi) {
            // accept 1s, reject 0s
            mid = (lo+hi+1)>>1;

            if (query(i, mid, i, i)) {
                lo = mid;
            } else { // =0
                hi = mid-1;
            }

        }

        rp[i] = lo+1;
        
    }

    int ROOT;
    int pa;

    for (int i = 0; i < n; i++) if (lp[i]==-1 && rp[i]==n) {ROOT=i;}

    for (int i = 0; i < n; i++) {
        if (lp[i]==-1 && rp[i]==n && i != ROOT) {
            rupa[i] = ROOT;
            continue;
        }
        if (lp[i]==-1) {
            rupa[i] = rp[i];
            continue;
        }
        if (rp[i]==n) {
            lupa[i] = lp[i];
            continue;
        }

        // compare the two, i guess

        if (rp[lp[i]] == rp[i]) { // go to the left lol
            lupa[i] = lp[i];
        } else {
            rupa[i] = rp[i];           
        }

    }

    for (int i = 0 ; i < n; i++) { // process left-parent in this order
        if (lupa[i]+1) {
            pa = lupa[i];
            while (rch[pa]+1) pa = rch[pa];
            rch[pa] = i;
        }
    }
    for (int i = n-1 ; i >= 0; i--) { // process right-parent in this order
        if (rupa[i]+1) {
            pa = rupa[i];
            while (lch[pa]+1) pa = lch[pa];
            lch[pa] = i;
        }
    }

    for (int i = 0; i < n; i++) {lc[i] = lch[i]; rc[i] = rch[i];}
    
    return ROOT;

}

Compilation message

popa.cpp: In function 'int solve(int, int*, int*)':
popa.cpp:96:12: warning: 'ROOT' may be used uninitialized in this function [-Wmaybe-uninitialized]
   96 |     return ROOT;
      |            ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 57 ms 208 KB Output is correct
2 Correct 44 ms 208 KB Output is correct
3 Correct 22 ms 208 KB Output is correct
4 Correct 56 ms 208 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 522 ms 308 KB Output is correct
2 Correct 767 ms 312 KB Output is correct
3 Correct 473 ms 432 KB Output is correct
4 Runtime error 105 ms 308 KB Execution killed with signal 13
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 16 ms 208 KB too many queries
2 Halted 0 ms 0 KB -