Submission #62746

#TimeUsernameProblemLanguageResultExecution timeMemory
62746leejseo족보 (KOI18_family)C++11
44 / 100
3088 ms184520 KiB
#include <bits/stdc++.h> using namespace std; // Make WA AC typedef vector<int> vi; typedef vector<vi> vvi; int N1, N2, K, p1, p2; vi par1, par2, rk1, rk2; vvi adj1, adj2; vvi L1, L2; bool cutted = false; void input(){ scanf("%d%d%d", &N1, &N2, &K); par1.resize(N1+1); par2.resize(N2+1); par1[0] = 0, par2[0] = 0; L1.resize(K+1); L2.resize(K+1); adj1.resize(N1+1); adj2.resize(N2+1); rk1.resize(N1+1); rk2.resize(N2+1); for (int i=0; i<=K; i++){ L1[i].resize(K+1); L2[i].resize(K+1); } for (int i=0; i<=N1; i++) rk1[i] = 0; for (int j=0; j<=N2; j++) rk2[j] = 0; for (int i=1; i<=N1; i++){ scanf("%d", &par1[i]); adj1[par1[i]].push_back(i); if (1 <= par1[i] && par1[i] <= K){ cutted = true; return; } if (par1[i] == 0){ if (p1 != 0 || (1 <= i && i <= K)){ cutted = true; return; } p1 = i; } } for (int i=1; i<=N2; i++){ scanf("%d", &par2[i]); adj2[par2[i]].push_back(i); if (1 <= par2[i] && par2[i] <= K){ cutted = true; return; } if (par2[i] == 0){ if (p2 != 0 || (1 <= i && i <= K)){ cutted = true; return; } p2 = i; } } if (p1 == 0 || p2 == 0){ cutted = true; return; } } void DFS(int i, int par, vvi&adj, vi&rk){ rk[i] = rk[par] + 1; for (auto &v : adj[i]){ DFS(v, i, adj, rk); } } int LCA(int i, int j, vi&par, vi&rk){ if (rk[j] > rk[i]) swap(i, j); //rk[i] >= rk[j] while (rk[i] > rk[j]){ i = par[i]; } while (i != j){ i = par[i]; j = par[j]; } return rk[i]; } void solve(){ for (int i=1; i<=K; i++){ for (int j=1; j<=i; j++){ int l1 = LCA(i, j, par1, rk1); int l2 = LCA(i, j, par2, rk2); L1[i][j] = l1; L1[j][i] = l1; L2[i][j] = l2; L2[j][i] = l2; } } for (int i=1; i<=K; i++){ for (int j=1; j<=K; j++){ for (int k=1; k<j; k++){ if (L1[i][j] < L1[i][k] && L2[i][k] < L2[i][j]){ cutted = true; return; } if (L2[i][j] < L2[i][k] && L1[i][k] < L1[i][j]){ cutted = true; return; } } } } } int main(void){ input(); if (cutted){ printf("NO\n"); return 0; } DFS(p1, 0, adj1, rk1); DFS(p2, 0, adj2, rk2); solve(); if (cutted){ printf("NO\n"); return 0; } printf("YES\n"); return 0; }

Compilation message (stderr)

family.cpp: In function 'void input()':
family.cpp:16:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d", &N1, &N2, &K);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
family.cpp:33:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &par1[i]);
     ~~~~~^~~~~~~~~~~~~~~~
family.cpp:48:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &par2[i]);
     ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...