Submission #1283333

#TimeUsernameProblemLanguageResultExecution timeMemory
1283333diep38Papričice (COCI20_papricice)C++20
110 / 110
201 ms26492 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define pb push_back #define irs insert #define ed "\n" #define fi first #define se second #define pi pair<int,int> #define pii pair<int,pair<int,int>> #define fis(i,a,b) for(int i=a;i<=b;++i) #define fl(i,a,b) for(int i=a;i>=b;--i) const int mod=1e9+7; const int Mdem=998244353; const int LOG=19; const int base=31; #define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define gay(a) freopen(a".inp","r",stdin),freopen(a".out","w",stdout) template <class T> bool minimize(T &a, const T &b) { if(a > b) {a = b; return 1;} return 0; } template <class T> bool maximize(T &a, const T &b) { if(a < b) {a = b; return 1;} return 0; } void add(int &a, int b) { a += b; if (a >= mod) a -= mod; } void sub(int &a, int b) { a -= b; if (a < 0) a += mod; } vector<int> adj[200005]; int sta[200005],fin[200005]; int n; int par[200005]; int cnt=0; int S[200005]; void dfs(int u) { sta[u]=++cnt; for(int v:adj[u]){ if(v==par[u]) continue; par[v]=u; dfs(v); } fin[u]=cnt; S[u]=fin[u]-sta[u]+1; } bool check(int u,int v) // ktra u co phai to ten v hay khong { return (sta[u]<=sta[v] && sta[v]<=fin[u]); } set<int> tt,ntt; int ans=1e9; void dfs1(int u){ if(u!=1) tt.irs(S[u]); for(int v:adj[u]){ if(v==par[u]) continue; par[v]=u; auto lower=tt.lower_bound((n+S[v])/2); if(lower!=tt.end()){ int x=*lower; ans=min(ans, max({S[v],x-S[v],n-x }) - min({S[v],x-S[v],n-x }) ); } if(lower!=tt.begin()){ --lower; int xx=*lower; ans=min(ans, max({S[v],xx-S[v],n-xx }) - min({S[v],xx-S[v],n-xx}) ); } auto lower1=ntt.lower_bound((n-S[v])/2); if(lower1!=ntt.end()){ int x1=*lower1; ans=min(ans, max({S[v],x1,n-x1-S[v]}) - min({S[v],x1,n-x1-S[v]}) ); } if(lower1!=ntt.begin()){ --lower1; int x2=*lower1; ans=min(ans, max({S[v],x2,n-x2-S[v]}) - min({S[v],x2,n-x2-S[v]}) ); } dfs1(v); } tt.erase(S[u]); ntt.irs(S[u]); } signed main(){ fast; cin>>n; fis(i,1,n-1) { int x,y; cin>>x>>y; adj[x].pb(y); adj[y].pb(x); } for(int i=1;i<=n;++i) sort(adj[i].begin(),adj[i].end()); dfs(1); memset(par,0,sizeof par); dfs1(1); cout<<ans; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...