Submission #1187733

#TimeUsernameProblemLanguageResultExecution timeMemory
1187733PieArmyMousetrap (CEOI17_mousetrap)C++20
100 / 100
553 ms203960 KiB
#include<bits/stdc++.h> typedef long long ll; #define pb push_back #define fr first #define sc second #define mid ((left+right)>>1) #define endl '\n' using namespace std; int n,t,r,m; int par[1000023],spec[1000023]; int dp[1000023],ek[1000023]; vector<int>komsu[1000023]; vector<int>res[1000023]; vector<int>specs; int locs[1000023]; void dfs1(int pos){ ek[pos]=ek[par[pos]]+max(0,int(komsu[pos].size())-2+(pos==r)); if(pos==t)ek[pos]=0; for(int x:komsu[pos]){ if(x==par[pos])continue; par[x]=pos; dfs1(x); spec[pos]|=spec[x]; } if(spec[pos]){ specs.pb(pos); } } void dfs2(int pos){ for(int x:komsu[pos]){ if(x==par[pos])continue; if(spec[x])continue; dp[pos]++; dfs2(x); res[pos].pb(dp[x]); } sort(res[pos].begin(),res[pos].end(),[&](const int &x,const int &y){return x>y;}); if(dp[pos]<=1){ return; } dp[pos]+=res[pos][1]; } bool f(int x){ int used=0; for(int i=0;i<m;i++){ int pos=specs[i]; int itr=0; while(itr<res[pos].size()){ if(res[pos][itr]+ek[pos]+used>x)itr++; else break; } if(itr==res[pos].size()){ if(ek[pos]+used>x)return false; } if(itr+used>i+1)return false; used+=itr; } return true; } int main(){ ios_base::sync_with_stdio(false);cin.tie(NULL); cin>>n>>t>>r; spec[r]=1; for(int i=1;i<n;i++){ int x,y;cin>>x>>y; komsu[x].pb(y); komsu[y].pb(x); } dfs1(t); specs.pop_back(); m=specs.size(); for(int i:specs){ dfs2(i); } int l=0,r=n; while(l<r){ int m=(l+r)/2; if(f(m))r=m; else l=m+1; } cout<<l<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...