답안 #403398

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
403398 2021-05-13T06:47:42 Z lyc 족보 (KOI18_family) C++14
0 / 100
1 ms 1356 KB
#include <bits/stdc++.h>
using namespace std;

#define TRACE(x) cerr << #x << " :: " << x << endl
#define _ << " " <<
#define SZ(x) (int)(x).size()
#define ALL(x) (x).begin(),(x).end()
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define RFOR(i,a,b) for (int i=(a);i>=(b);--i)

//const int mxN = 3e5+5;
//const int mxK = 3e5+5;
const int mxN = 5005;
const int mxK = 5005;

int K;

struct Tree {
    int N;
    vector<int> g[mxN];
    int pa[mxN][14];
    int _lca[mxK][mxK];
    int dep[mxN];

    void read() {
        FOR(i,1,N){
            int P; cin >> P;
            g[P].push_back(i);
        }
    }

    void dfs(int u) {
        for (int& v : g[u]) {
            pa[v][0] = u;
            dep[v] = dep[u]+1;
            dfs(v);
        }
    }

    int lca(int a, int b) {
        if (dep[a] < dep[b]) swap(a,b);
        RFOR(k,13,0) if (pa[a][k] != -1 && dep[pa[a][k]] >= dep[b]) {
            a = pa[a][k];
        }
        if (a == b) return a;
        RFOR(k,13,0) if (pa[a][k] != pa[b][k]) {
            a = pa[a][k], b = pa[b][k];
        }
        return pa[a][0];
    }

    void run() {
        memset(pa,-1,sizeof pa);
        dep[0] = 0;
        dfs(0);

        FOR(i,1,N){
            FOR(j,i+1,N){
                _lca[i][j] = _lca[j][i] = dep[lca(i,j)];
            }
        }
    }

    int cmp(int i, int j, int k) {
        if (_lca[i][j] == _lca[j][k]) return 0;
        return _lca[i][j] < _lca[j][k] ? -1 : 1;
    }
} A, B;

bool chk(int i, int j, int k) {
    int x = A.cmp(i,j,k), y = B.cmp(i,j,k);
    if (x == 0 || y == 0) return 0;
    return ((x < 0) ^ (y < 0));
}

int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

    cin >> A.N >> B.N >> K;
    A.read();
    B.read();

    A.run();
    B.run();

    bool die = 0;
    FOR(i,1,K){
        FOR(j,i+1,K){
            FOR(k,j+1,K){
                die |= chk(i,j,k);
                die |= chk(i,k,j);
                die |= chk(j,i,k);
            }
        }
    }

    cout << (die ? "NO" : "YES") << '\n';
}

# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1100 KB Output is correct
2 Incorrect 1 ms 1356 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1100 KB Output is correct
2 Incorrect 1 ms 1356 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1100 KB Output is correct
2 Incorrect 1 ms 1356 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1100 KB Output is correct
2 Incorrect 1 ms 1356 KB Output isn't correct
3 Halted 0 ms 0 KB -