# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
103718 | E869120 | Mousetrap (CEOI17_mousetrap) | C++14 | 7 ms | 1280 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#pragma warning (disable: 4996)
const int MAX_N = (1 << 12);
int N, A, B, E[MAX_N], F[MAX_N], dist[MAX_N], dp[MAX_N][22], val[MAX_N], pl[MAX_N]; bool used[MAX_N];
vector<int>X[MAX_N], Z[MAX_N], lis[MAX_N];
void dfs1(int pos, int dep) {
used[pos] = true; dist[pos] = dep;
for (int i = 0; i < X[pos].size(); i++) {
if (used[X[pos][i]] == true) continue;
dp[X[pos][i]][0] = pos;
dfs1(X[pos][i], dep + 1);
}
}
int prevs(int pos, int x) {
for (int i = 21; i >= 0; i--) {
if (x >= (1 << i)) { pos = dp[pos][i]; x -= (1 << i); }
}
return pos;
}
int lca(int u, int v) {
if (dist[u] > dist[v]) swap(u, v);
v = prevs(v, dist[v] - dist[u]);
if (u == v) return u;
for (int i = 21; i >= 0; i--) {
if (dp[u][i] != dp[v][i]) {
u = dp[u][i];
v = dp[v][i];
}
}
return dp[u][0];
}
int ret[MAX_N];
int dfs2(int pos) {
used[pos] = true;
if (X[pos].size() <= 1) {
return 0;
}
if (X[pos].size() == 2) {
return 1;
}
vector<int>vec;
for (int i = 0; i < Z[pos].size(); i++) {
if (used[Z[pos][i]] == true) continue;
vec.push_back(dfs2(Z[pos][i]));
}
sort(vec.begin(), vec.end());
int V = vec[vec.size() - 2];
return V + vec.size();
}
int main() {
scanf("%d%d%d", &N, &A, &B);
for (int i = 1; i <= N - 1; i++) {
scanf("%d%d", &E[i], &F[i]);
X[E[i]].push_back(F[i]);
X[F[i]].push_back(E[i]);
}
dfs1(B, 0);
for (int i = 0; i < 21; i++) {
for (int j = 1; j <= N; j++) dp[j][i + 1] = dp[dp[j][i]][i];
}
for (int i = 1; i <= N; i++) {
int v = lca(A, i);
val[i] = dist[v];
if (v == i) pl[dist[v]] = i;
else lis[dist[v]].push_back(i);
}
int FinalAns = 0;
for (int i = 1; i <= N; i++) used[i] = false;
for (int i = 0; i < dist[A]; i++) {
for (int j = 0; j < lis[i].size(); j++) {
int u = lis[i][j], v = dp[u][0];
Z[u].push_back(v);
Z[v].push_back(u);
}
int rem = dfs2(pl[i]);
if (Z[pl[i]].size() == 1) rem = 1;
if (Z[pl[i]].size() <= 0) rem = 0;
FinalAns += rem;
}
cout << FinalAns << endl;
return 0;
}
Compilation message (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... |