제출 #1236337

#제출 시각아이디문제언어결과실행 시간메모리
1236337hamanp87Unique Cities (JOI19_ho_t5)C++17
100 / 100
201 ms35356 KiB
#include<bits/stdc++.h> using namespace std; //#pragma GCC optimize("03,unroll-loops") //#pragma GCC target("avx2") //#pragma GCC target("sse4") #define all(v) v.begin(),v.end() #define F first #define S second #define pub push_back #define pob pop_back #define puf push_front #define pof pop_front //#define randi uniform_int_distribution<long long> #define damoon(v) v.resize(unique(all(v))-v.begin()) //mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); //randi dist(0,10000000000000000); typedef pair<int,int> pii; typedef pair<long long,long long> pll; typedef pair<int,bool> pib; typedef pair<long long,bool> plb; typedef pair<int,pii> pip; typedef pair<pii,int> ppi; typedef vector<int> veci; typedef vector<long long> vecl; typedef vector<bool> vecb; typedef vector<pii> vecp; typedef set<int> seti; typedef set<long long> setl; typedef set<pii> setp; typedef map<int,int> mapii; typedef map<long long,long long> mapll; typedef map<int,bool> mapib; typedef map<long long,bool> maplb; const int inf=1e9,mod=1e9+7,neginf=-1e9,N=1e6; const double PI=acos(-1); int dnt; veci col,ans,cnt,st,crd,crh; vector<veci> adj; void dfs1(int u,int par) { crd[u]=(par==0)?0:crd[par]+1; crh[u]=1; for(int v:adj[u]) { if(v==par) continue; dfs1(v,u); crh[u]=max(crh[u],crh[v]+1); } } void POP() { int u=st.back(); int c=col[u]; cnt[c]--; if(cnt[c]==0) dnt--; st.pob(); } void PUSH(int u) { st.pub(u); int c=col[u]; if(cnt[c]==0) dnt++; cnt[c]++; } bool cmp(int a,int b) { return crh[a]>crh[b]; } void dfs2(int u,int par) { if(par!=0 and adj[u].size()==1) { ans[u]=max(ans[u],dnt); return; } sort(all(adj[u]),cmp); while(adj[u].size()>2 and st.size() and (crd[u]-crd[st.back()]<=crh[adj[u][2]])) POP(); PUSH(u); int ind=par!=0?1:0; dfs2(adj[u][ind],u); while(st.size() and (crd[u]-crd[st.back()]<=crh[adj[u][ind]])) POP(); ans[u]=max(ans[u],dnt); for(int i=ind+1;i<adj[u].size();i++) { while(st.size() and crd[st.back()]>=crd[u]) POP(); PUSH(u); dfs2(adj[u][i],u); } } void solve() { int n,m; cin>>n>>m; adj.resize(n+1); for(int i=1;i<n;i++) { int u,v; cin>>u>>v; adj[u].pub(v); adj[v].pub(u); } col.resize(n+1); veci ogc; for(int i=1;i<=n;i++) { cin>>col[i]; ogc.pub(col[i]); } sort(all(ogc)); ogc.erase(unique(all(ogc)),ogc.end()); int mci=ogc.size(); for(int i=1;i<=n;i++) col[i]=lower_bound(all(ogc),col[i])-ogc.begin()+1; veci dep1(n+1,-1); queue<int> q; q.push(1); dep1[1]=0; int L=1; while(q.size()) { int u=q.front(); q.pop(); if(dep1[u]>dep1[L]) L=u; for(int v:adj[u]) { if(dep1[v]==-1) { dep1[v]=dep1[u]+1; q.push(v); } } } veci depl(n+1,-1); q.push(L); depl[L]=0; int R=L; while(q.size()) { int u=q.front(); q.pop(); if(depl[u]>depl[R]) R=u; for(int v:adj[u]) { if(depl[v]==-1) { depl[v]=depl[u]+1; q.push(v); } } } ans.assign(n+1,0); cnt.assign(mci+1,0); dnt=0; st.clear(); crd.assign(n+1,0); crh.assign(n+1,0); veci roots={L,R}; for(int r:roots) { st.clear(); dnt=0; fill(all(cnt),0); crd.assign(n+1,0); crh.assign(n+1,0); dfs1(r,0); dfs2(r,0); } for(int i=1;i<=n;i++) cout<<ans[i]<<"\n"; } int main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(false); //ifstream fin("in.txt"); //ofstream fout("out.txt"); int t=1; //cin>>t; while(t--) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...