Submission #1319980

#TimeUsernameProblemLanguageResultExecution timeMemory
1319980JuanJLUnique Cities (JOI19_ho_t5)C++20
0 / 100
510 ms339968 KiB
#include <bits/stdc++.h> #define fst first #define snd second #define pb push_back #define SZ(x) (int)x.size() #define ALL(x) x.begin(),x.end() #define forn(i,a,b) for(int i = a; i<b; i++) #define mset(a,v) memset(a,v,sizeof(a)) #define FIN ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); using namespace std; typedef int ll; const int MAXN = 200000+5; ll n,m; vector<ll> adj[MAXN]; ll dist1[MAXN]; ll dist2[MAXN]; ll len1[MAXN]; ll len2[MAXN]; ll eti[MAXN]; void dfs(ll nd, ll p,ll dis, ll t){ if(t==1){ dist1[nd]=dis; len1[nd]=1; }else{ dist2[nd]=dis; len2[nd]=1; } for(auto i:adj[nd]) if(i!=p){ dfs(i,nd,dis+1,t); if(t==1) len1[nd]=max(len1[nd],len1[i]+1); else len2[nd]=max(len2[nd],len2[i]+1); } } bool cmp1(ll a, ll b){ return len1[a]>len1[b]; } bool cmp2(ll a, ll b){ return len2[a]>len2[b]; } ll res1[MAXN]; stack<pair<ll,ll>> pila1; vector<pair<ll,ll>> er1[MAXN]; void ndfs1(ll nd, ll p, ll dis){ ll mlen = max(((SZ(adj[nd])>0 && adj[nd][0]!=p)?len1[adj[nd][0]]:0),((SZ(adj[nd])>1 && adj[nd][1]!=p)?len1[adj[nd][1]]:0)); while(!pila1.empty() && pila1.top().fst>=dis-mlen){ er1[nd].pb(pila1.top()); pila1.pop(); } /*cout<<nd<<" "<<p<<": "; stack<pair<ll,ll>> rare = pila1; while(!rare.empty()) cout<<rare.top().snd<<" ", rare.pop(); cout<<'\n';*/ res1[nd]=SZ(pila1); while(!er1[nd].empty()){ pila1.push(er1[nd].back()); er1[nd].pop_back(); } mlen=0; for(auto i:adj[nd]) if(i!=p){ for(auto j:adj[nd]) if(j!=p && j!=i) mlen=max(mlen,len1[j]); while(!pila1.empty() && pila1.top().fst>=dis-mlen){ er1[nd].pb(pila1.top()); pila1.pop(); } pila1.push({dis,nd}); ndfs1(i,nd,dis+1); pila1.pop(); while(!er1[nd].empty()){ pila1.push(er1[nd].back()); er1[nd].pop_back(); } } } ll res2[MAXN]; stack<pair<ll,ll>> pila2; vector<pair<ll,ll>> er2[MAXN]; void ndfs2(ll nd, ll p, ll dis){ ll mlen = max(((SZ(adj[nd])>0 && adj[nd][0]!=p)?len2[adj[nd][0]]:0),((SZ(adj[nd])>1 && adj[nd][1]!=p)?len2[adj[nd][1]]:0)); while(!pila2.empty() && pila2.top().fst>=dis-mlen){ er2[nd].pb(pila2.top()); pila2.pop(); } /*cout<<nd<<" "<<p<<": "; stack<pair<ll,ll>> rare = pila2; while(!rare.empty()) cout<<rare.top().snd<<" ", rare.pop(); cout<<'\n';*/ res2[nd]=SZ(pila2); while(!er2[nd].empty()){ pila2.push(er2[nd].back()); er2[nd].pop_back(); } mlen=0; for(auto i:adj[nd]) if(i!=p){ for(auto j:adj[nd]) if(j!=p && j!=i) mlen=max(mlen,len2[j]); while(!pila2.empty() && pila2.top().fst>=dis-mlen){ er2[nd].pb(pila2.top()); pila2.pop(); } pila2.push({dis,nd}); ndfs2(i,nd,dis+1); pila2.pop(); while(!er2[nd].empty()){ pila2.push(er2[nd].back()); er2[nd].pop_back(); } } } int main(){ cin>>n>>m; ll u,v; forn(i,0,n-1){ cin>>u>>v; u--; v--; adj[u].pb(v); adj[v].pb(u); } forn(i,0,n) cin>>eti[i]; dfs(0,-1,0,1); pair<ll,ll> d1 = {-1,0}; forn(i,0,n) d1=max(d1,{dist1[i],i}); dfs(d1.snd,-1,0,1); pair<ll,ll> d2 = {-1,0}; forn(i,0,n) d2=max(d2,{dist1[i],i}); dfs(d2.snd,-1,0,2); forn(i,0,n){ sort(ALL(adj[i]),cmp1); } /*cout<<d1.snd<<" "<<d2.snd<<'\n'; cout<<"arranca el real process\n";*/ ndfs1(d1.snd,-1,0); forn(i,0,n){ sort(ALL(adj[i]),cmp2); } //cout<<"---------------------------------------\n"; ndfs2(d2.snd,-1,0); forn(i,0,n){ if(dist1[i]>dist2[i]) cout<<res1[i]<<'\n'; else cout<<res2[i]<<'\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...