Submission #428265

#TimeUsernameProblemLanguageResultExecution timeMemory
428265juggernautCapital City (JOI20_capital_city)C++17
100 / 100
696 ms128096 KiB
#include<bits/stdc++.h> #define fr first #define sc second using namespace std; void usaco(string s){freopen((s+".in").c_str(),"r",stdin);freopen((s+".out").c_str(),"w",stdout);} typedef long long ll; #define USING_ORDERED_SET 0 #if USING_ORDERED_SET #include<bits/extc++.h> using namespace __gnu_pbds; template<class T>using ordered_set=tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>; #endif template<class T>void umax(T &a,T b){if(a<b)a=b;} template<class T>void umin(T &a,T b){if(b<a)a=b;} #ifdef IOI2021SG #define printl(args...)printf(args) #else #define printl(args...)((void)0) #endif int n,k; int tin[200005],tout[200005],timer,up[200005][18]; vector<int>g[200005],color[200005],g1[200005],g2[200005],gr[200005]; int mn[200005][18]; int mx[200005][18]; int a[200005]; void dfs(int v,int p){ tin[v]=++timer; up[v][0]=p; mn[v][0]=::a[v]; mx[v][0]=::a[v]; for(int i=1;i<18;i++){ up[v][i]=up[up[v][i-1]][i-1]; mn[v][i]=min(mn[v][i-1],mn[up[v][i-1]][i-1]); mx[v][i]=max(mx[v][i-1],mx[up[v][i-1]][i-1]); } for(int to:g[v])if(to!=p)dfs(to,v); tout[v]=++timer; } bool upper(int a,int b){ return tin[a]<=tin[b]&&tout[a]>=tout[b]; } int lca(int a,int b){ if(upper(a,b))return a; if(upper(b,a))return b; for(int i=17;i>=0;i--)if(!upper(up[a][i],b))a=up[a][i]; return up[a][0]; } int lca(vector<int>&vec){ int l=vec[0]; for(int i=1;i<(int)vec.size();i++)l=lca(l,vec[i]); return l; } unordered_map<int,bool>vs[200005]; vector<pair<int,int>>edges; void add_edge(int a,int b){ if(a^b){ if(vs[a][b])return; vs[a][b]=true; edges.emplace_back(a,b); g1[a].push_back(b); gr[b].push_back(a); } } void add(int v,int a,int l){ for(int i=17;i>=0;i--) if(mx[a][i]==mn[a][i])a=up[a][i]; if(upper(a,l)&&a!=l)return; add_edge(v,::a[a]); } int cnt=0; bool vis[200005]; int last; int sz[200005]; int id[200005]; bool used[200005]; vector<int>order; void run(int v){ used[v]=true; for(int to:g1[v])if(!used[to])run(to); order.push_back(v); } void runner(int v){ used[v]=true; sz[last]++; id[v]=last; for(int to:gr[v])if(!used[to])runner(to); } int dp[200005]; int goo(int v){ if(~dp[v])return dp[v]; dp[v]=sz[v]; for(int to:g2[v])dp[v]+=goo(to); return dp[v]; } int main(){ memset(dp,-1,sizeof dp); scanf("%d%d",&n,&k); for(int i=1;i<n;i++){ int x,y; scanf("%d%d",&x,&y); g[x].push_back(y); g[y].push_back(x); } for(int i=1;i<=n;i++){ scanf("%d",&a[i]); color[a[i]].push_back(i); } dfs(1,1); for(int i=1;i<=k;i++){ int l=lca(color[i]); for(int j=0;j<(int)color[i].size();j++)add(i,color[i][j],l); } for(int i=1;i<=k;i++)if(!used[i])run(i); for(int i=1;i<=k;i++)used[i]=0; for(int i=1;i<=k;i++){ int v=order[k-i]; if(!used[v]){ last++; runner(v); } } for(auto to:edges)if(id[to.fr]^id[to.sc]){ g2[id[to.fr]].push_back(id[to.sc]); } int ans=k; for(int i=1;i<=last;i++)umin(ans,goo(i)); printf("%d",ans-1); }

Compilation message (stderr)

capital_city.cpp: In function 'void usaco(std::string)':
capital_city.cpp:5:29: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    5 | void usaco(string s){freopen((s+".in").c_str(),"r",stdin);freopen((s+".out").c_str(),"w",stdout);}
      |                      ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
capital_city.cpp:5:66: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    5 | void usaco(string s){freopen((s+".in").c_str(),"r",stdin);freopen((s+".out").c_str(),"w",stdout);}
      |                                                           ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
capital_city.cpp: In function 'int main()':
capital_city.cpp:99:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   99 |     scanf("%d%d",&n,&k);
      |     ~~~~~^~~~~~~~~~~~~~
capital_city.cpp:102:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  102 |         scanf("%d%d",&x,&y);
      |         ~~~~~^~~~~~~~~~~~~~
capital_city.cpp:107:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  107 |         scanf("%d",&a[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...