# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
162719 | HellAngel | Mousetrap (CEOI17_mousetrap) | C++14 | 420 ms | 92152 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 <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 7;
int FastIn()
{
char c;
while(true)
{
c = getchar();
if(c >= '0' && c <= '9') break;
}
int ans = c- '0';
while(true)
{
c = getchar();
if(c > '9' || c < '0') return ans;
ans = ans * 10 + c - '0';
}
}
int n, m, t, cnt, sum, dp[maxn], cur[maxn];
vector<int> st;
bool found;
vector<int> vt[maxn], path, gau[maxn];
void DFS(int u, int p)
{
if(u == t)
{
path.push_back(u);
found = true;
return;
}
for(auto v: vt[u])
{
if(v == p) continue;
DFS(v, u);
if(found)
{
path.push_back(u);
break;
}
}
}
void Solve(int u, int p)
{
vector<int> cac = {};
int sum = -1;
for(auto v: vt[u])
{
if(v == p) continue;
Solve(v, u);
sum++;
cac.push_back(dp[v]);
}
sort(cac.begin(), cac.end());
if(cac.size())
{
cac.pop_back();
if(cac.size() == 0) dp[u] = 1;
else dp[u] = sum + cac.back() + 1;
}
else dp[u] = 0;
}
bool Check(int x)
{
st = {};
for(int i = 0; i + 1 < path.size(); i++)
{
cur[i + 1] = (int)gau[i + 1].size() - 1;
int u = path[i];
for(auto v: vt[u])
{
if(v == path[i + 1]) continue;
if(i > 0 && v == path[i - 1]) continue;
if(dp[v] > x) st.push_back(i + 1);
}
}
int cnt = path.size() - 1;
sort(st.begin(), st.end(), greater<int>());
for(int i = 1; i <= cnt; i++)
{
if(st.empty()) return true;
cur[st.back()]--;
st.pop_back();
if(cur[i] >= 0 && gau[i][cur[i]] > x) return false;
}
return true;
}
int32_t main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
if(fopen("test.inp", "r")) freopen("test.inp", "r", stdin), freopen("test.out", "w", stdout);
cin >> n >> m >> t;
for(int i = 1; i < n; i++)
{
int u, v;
cin >> u >> v;
vt[u].push_back(v);
vt[v].push_back(u);
}
DFS(m, m);
reverse(path.begin(), path.end());
for(int i = 0; i + 1 < path.size(); i++)
{
gau[i + 1] = {};
int u = path[i];
for(auto v: vt[u])
{
if(v == path[i + 1]) continue;
if(i > 0 && v == path[i - 1]) continue;
Solve(v, u);
sum++;
gau[i + 1].push_back(dp[v]);
}
sort(gau[i + 1].begin(), gau[i + 1].end());
}
int l = 0;
int r = 1e6;
while(l <= r)
{
int mid = l + r >> 1;
if(Check(mid)) r = mid - 1;
else l = mid + 1;
}
cout << sum + l;
}
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... |