| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1335547 | Hisu | Reachability (NOI25_reachability) | C++20 | 6 ms | 1104 KiB |
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ed "\n"
#define int long long
const int N = 2e5 + 5;
int n, l[N], u[N], v[N];
namespace sub2 {
bool check() {
return n <= 15;
}
vector<int> adj[N];
void dfs(int u, int pa, int &res) {
res++;
for(int v : adj[u]) {
if(v == pa) continue;
dfs(v, u, res);
}
}
void backtrack(int pos) {
if(pos >= n) {
bool check = true;
for(int i = 1; i <= n; i++) {
int res = 0;
dfs(i, 0, res);
if(res != l[i]) {
check = false;
break;
}
}
if(check == true) {
cout << "YES";
exit(0);
}
return;
}
if(l[u[pos]] == l[v[pos]]) {
adj[u[pos]].push_back(v[pos]);
adj[v[pos]].push_back(u[pos]);
backtrack(pos + 1);
adj[u[pos]].pop_back();
adj[v[pos]].pop_back();
}
if(l[u[pos]] > l[v[pos]]) {
adj[u[pos]].push_back(v[pos]);
backtrack(pos + 1);
adj[u[pos]].pop_back();
}
if(l[u[pos]] < l[v[pos]]) {
adj[v[pos]].push_back(u[pos]);
backtrack(pos + 1);
adj[v[pos]].pop_back();
}
backtrack(pos + 1);
}
void solve() {
backtrack(1);
cout << "NO";
}
}
namespace sub3 {
bool check() {
for(int i = 2; i <= n; i++) if(l[i] != l[i - 1]) return false;
return true;
}
vector<int> adj[N];
int dfs(int u, int pa) {
int res = 1;
for(int v : adj[u]) {
if(v == pa) continue;
res += dfs(v, u);
}
if(res > l[1]) {
cout << "NO";
exit(0);
}
if(res == l[1]) res = 0;
return res;
}
void solve() {
// goi L = l[1] = l[2] = .. = l[n]
// n % L != 0 => NO
if(n % l[1] != 0) {
cout << "NO";
return;
}
for(int i = 1; i < n; i++) {
adj[u[i]].push_back(v[i]);
adj[v[i]].push_back(u[i]);
}
if(dfs(1, 0) > 0) {
cout << "NO";
return;
}
cout << "YES";
}
}
namespace sub4 {
bool check() {
return true;
}
vector<int> adj[N];
void solve() {
for(int i = 1; i < n; i++) {
adj[u[i]].push_back(v[i]);
adj[v[i]].push_back(u[i]);
}
for(int u = 1; u <= n; u++) {
vector<bool> dp(l[u] + 2, false);
dp[0] = true;
for(int v : adj[u]) if(l[v] < l[u]) {
for(int i = l[u]; i >= l[v]; i--) {
dp[i] = dp[i] || dp[i - l[v]];
}
}
if(dp[l[u] - 1] == false) {
cout << "NO";
return;
}
}
cout << "YES";
}
}
void solve(int iTest) {
cin >> n;
for(int i = 1; i <= n; i++) cin >> l[i];
for(int i = 1; i < n; i++) cin >> u[i] >> v[i];
if(sub2::check()) {
sub2::solve();
return;
}
if(sub3::check()) {
sub3::solve();
return;
}
if(sub4::check()) {
sub4::solve();
return;
}
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
#define TASK "main"
if(fopen(TASK ".inp", "r")) {
freopen(TASK ".inp", "r", stdin);
freopen(TASK ".out", "w", stdout);
}
else if(fopen("main.inp", "r")) {
freopen("main.inp", "r", stdin);
freopen("main.out", "w", stdout);
}
int T = 1;
// cin >> T;
for(int iTest = 1; iTest <= T; iTest++) {
solve(iTest);
}
}컴파일 시 표준 에러 (stderr) 메시지
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
