# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
846665 |
2023-09-08T08:38:13 Z |
vjudge1 |
Torrent (COI16_torrent) |
C++17 |
|
588 ms |
27192 KB |
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
const int ar=3e5+5;
const ll mod=1e9+7;
int n,a,b;
vector<int> ad[ar];
vector<pair<int,int>> ed;
bool d[ar];
int p[ar];
void dfs(int u)
{
d[u]=true;
for (auto v:ad[u])
{
if (!d[v])
{
p[v]=u;
dfs(v);
}
}
}
int dp[2][ar];
bool ok[ar];
void solve(int u,int pa,int type)
{
vector<int> child;
for (auto v:ad[u])
{
if (v!=pa && !ok[v])
{
solve(v,u,type);
child.push_back(dp[type][v]);
}
}
sort(child.begin(),child.end(),greater<int>());
for (int i=0;i<child.size();i++)
{
dp[type][u]=max(dp[type][u],child[i]+i+1);
}
//child.clear();
}
int ans=1e9;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>a>>b;
for (int i=1;i<n;i++)
{
int u,v;
cin>>u>>v;
ad[u].push_back(v);
ad[v].push_back(u);
}
dfs(a);
int cur=b;
while(cur!=a)
{
ed.push_back({cur,p[cur]});
cur=p[cur];
}
int l=0;
int r=ed.size()-1;
while(l<=r)
{
memset(dp,0,sizeof dp);
int m=l+r>>1;
ok[ed[m].fi]=true;
solve(a,0,0);
ok[ed[m].fi]=false;
ok[ed[m].se]=true;
solve(b,0,1);
ok[ed[m].se]=false;
if (dp[0][a]>=dp[1][b])
{
ans=min(ans,dp[0][a]);
l=m+1;
}
else r=m-1;
//ok[ed[m].fi]=ok[ed[m].se]=false;
}
l=0;
r=ed.size()-1;
while(l<=r)
{
memset(dp,0,sizeof dp);
int m=l+r>>1;
ok[ed[m].fi]=true;
solve(a,0,0);
ok[ed[m].fi]=false;
ok[ed[m].se]=true;
solve(b,0,1);
ok[ed[m].se]=false;
if (dp[0][a]<=dp[1][b])
{
ans=min(ans,dp[1][b]);
r=m-1;
}
else l=m+1;
//ok[ed[m].fi]=ok[ed[m].se]=false;
}
cout<<ans;
}
Compilation message
torrent.cpp: In function 'void solve(int, int, int)':
torrent.cpp:40:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
40 | for (int i=0;i<child.size();i++)
| ~^~~~~~~~~~~~~
torrent.cpp: In function 'int main()':
torrent.cpp:71:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
71 | int m=l+r>>1;
| ~^~
torrent.cpp:91:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
91 | int m=l+r>>1;
| ~^~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
4 ms |
11356 KB |
Output is correct |
2 |
Correct |
3 ms |
11356 KB |
Output is correct |
3 |
Correct |
4 ms |
11356 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
500 ms |
23544 KB |
Output is correct |
2 |
Correct |
588 ms |
25260 KB |
Output is correct |
3 |
Correct |
451 ms |
26824 KB |
Output is correct |
4 |
Correct |
473 ms |
26308 KB |
Output is correct |
5 |
Correct |
498 ms |
23100 KB |
Output is correct |
6 |
Correct |
457 ms |
23604 KB |
Output is correct |
7 |
Correct |
461 ms |
27192 KB |
Output is correct |