Submission #423277

#TimeUsernameProblemLanguageResultExecution timeMemory
423277KerimUnique Cities (JOI19_ho_t5)C++17
100 / 100
543 ms34156 KiB
#include "bits/stdc++.h" #define MAXN 200009 #define INF 1000000007 #define mp(x,y) make_pair(x,y) #define all(v) v.begin(),v.end() #define pb(x) push_back(x) #define wr cout<<"----------------"<<endl; #define ppb() pop_back() #define tr(ii,c) for(__typeof((c).begin()) ii=(c).begin();ii!=(c).end();ii++) #define ff first #define ss second #define my_little_dodge 46 #define debug(x) cerr<< #x <<" = "<< x<<endl; using namespace std; typedef long long ll; typedef pair<int,int> PII; template<class T>bool umin(T& a,T b){if(a>b){a=b;return 1;}return 0;} template<class T>bool umax(T& a,T b){if(a<b){a=b;return 1;}return 0;} vector<int>adj[MAXN]; int arr[MAXN],n,m,lvl[MAXN],height[MAXN]; void dfs0(int nd,int pr=0){ lvl[nd]=lvl[pr]+1; for(auto to:adj[nd]) if(to!=pr) dfs0(to,nd); } void dfs1(int nd,int pr=0){ height[nd]=0; for(auto to:adj[nd]) if(to!=pr){ dfs1(to,nd); umax(height[nd],height[to]+1); } } bool cmp(int x,int y){ return (height[x]>height[y]); } int ans[MAXN],cur,cnt[MAXN]; vector<int>S; void upd(int nd,int d){ while(!S.empty() and lvl[nd]-lvl[S.back()]<=d) cur-=(--cnt[arr[S.back()]]==0),S.ppb(); } void dfs2(int nd,int pr){ sort(all(adj[nd]),cmp); if(adj[nd].size()>1){ if(adj[nd].size()>=3) upd(nd,height[adj[nd][2]]+1); S.pb(nd); cur+=(cnt[arr[nd]]++==0); dfs2(adj[nd][1],nd); if(!S.empty() and S.back()==nd) cur-=(--cnt[arr[nd]]==0),S.ppb(); upd(nd,height[adj[nd][1]]+1); for(int i=2;i<int(adj[nd].size());i++){ int to=adj[nd][i]; S.pb(nd); cur+=(cnt[arr[nd]]++==0); dfs2(to,nd); if(!S.empty() and S.back()==nd) cur-=(--cnt[arr[nd]]==0),S.ppb(); } } umax(ans[nd],cur); } int main(){ //freopen("file.in", "r", stdin); scanf("%d%d",&n,&m); for(int i=1;i<n;i++){ int u,v; scanf("%d%d",&u,&v); adj[u].pb(v); adj[v].pb(u); } for(int i=1;i<=n;i++) scanf("%d",arr+i); dfs0(1); for(int i=0;i<2;i++){ int mx=0,who=0; for(int j=1;j<=n;j++) if(umax(mx,lvl[j])) who=j; dfs1(who); dfs0(who); S.pb(who); cur+=(cnt[arr[who]]++==0); dfs2(adj[who][0],who); } for(int i=1;i<=n;i++)printf("%d\n",ans[i]); return 0; }

Compilation message (stderr)

joi2019_ho_t5.cpp: In function 'int main()':
joi2019_ho_t5.cpp:69:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |     scanf("%d%d",&n,&m);
      |     ~~~~~^~~~~~~~~~~~~~
joi2019_ho_t5.cpp:72:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   72 |   scanf("%d%d",&u,&v);
      |   ~~~~~^~~~~~~~~~~~~~
joi2019_ho_t5.cpp:77:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   77 |   scanf("%d",arr+i);
      |   ~~~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...