Submission #846659

# Submission time Handle Problem Language Result Execution time Memory
846659 2023-09-08T08:29:45 Z vjudge1 Torrent (COI16_torrent) C++17
100 / 100
441 ms 37060 KB
#include<bits/stdc++.h>
using namespace std;

const int N=3e5+5;
int n,a,b;
vector<int> g[N],vt[N],res;
int dp[N];
bool ck[N];
pair<int,int> p;

bool kt(int u,int v)
{
    if(u==p.first && v==p.second)
        return false;
    if(u==p.second && v==p.first)
        return false;
    return true;
}

void dis(int u)
{
    ck[u]=true;
    if(u==b){
        dp[b]=1;
        res.push_back(b);
        return;
    }
    for(auto v:g[u]){
        if(!ck[v]){
            dis(v);
            dp[u]|=dp[v];
        }
    }
    if(dp[u])
        res.push_back(u);

}

void dfs(int u)
{
    vt[u].clear();
    dp[u]=1;
    for(auto v:g[u]){
        if(dp[v]==0 && kt(u,v)){
            dfs(v);
            vt[u].push_back(dp[v]);
        }
    }
    sort(vt[u].begin(),vt[u].end(),greater<int>());
    for(int i=0;i<vt[u].size();i++)
        dp[u]=max(dp[u],vt[u][i]+1+i);
}

int main()
{
    int now,ans=1e9;
    cin>>n>>a>>b;
    int x,y;
    for(int i=1;i<n;i++){
        cin>>x>>y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    dis(a);
    if(n<=1000){
        for(int i=0;i<res.size()-1;i++){
            p={res[i],res[i+1]};
            memset(dp,0,sizeof(dp));
            dfs(a),dfs(b);
            now=max(dp[a]-1,dp[b]-1);
            ans=min(ans,now);
        }
        cout<<ans;
        return 0;
    }

    int lef=0,rig=res.size()-2,mid;
    while(lef<=rig){
        mid=(lef+rig)/2;
        memset(dp,0,sizeof(dp));
        p={res[mid],res[mid+1]};
        dfs(a),dfs(b);
        if(dp[a]>dp[b])
            rig=mid-1;
        else
            lef=mid+1;
        now=max(dp[a]-1,dp[b]-1);
        ans=min(ans,now);
    }
    cout<<ans;
}

Compilation message

torrent.cpp: In function 'void dfs(int)':
torrent.cpp:50:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |     for(int i=0;i<vt[u].size();i++)
      |                 ~^~~~~~~~~~~~~
torrent.cpp: In function 'int main()':
torrent.cpp:66:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |         for(int i=0;i<res.size()-1;i++){
      |                     ~^~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 7 ms 15708 KB Output is correct
2 Correct 7 ms 15960 KB Output is correct
3 Correct 9 ms 15708 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 423 ms 31468 KB Output is correct
2 Correct 441 ms 32808 KB Output is correct
3 Correct 392 ms 34544 KB Output is correct
4 Correct 369 ms 34260 KB Output is correct
5 Correct 387 ms 31724 KB Output is correct
6 Correct 350 ms 32084 KB Output is correct
7 Correct 340 ms 37060 KB Output is correct