제출 #801689

#제출 시각아이디문제언어결과실행 시간메모리
801689manizareMergers (JOI19_mergers)C++14
100 / 100
1960 ms210976 KiB
#include <bits/stdc++.h>  
#define pii pair <int,int>  
#define F first  
#define S second  
#define all(a) a.begin(),a.end()  
#define pb push_back 
using namespace std ;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int maxn = 5e5 + 10 , inf  = 1e9 , mod = 1e9 + 7 , lg = 21 ;  
int dp[maxn][lg+1] , d[maxn] , dis[maxn]  , c[maxn] , mark[maxn]  , sm[maxn]  ;
vector <int> G[maxn] , vec[maxn] ; 
map <pii ,int>mp ;

int up(int v ,int d){
  for(int i =0 ; i < lg ; i++){
    if(d>>i&1)v = dp[v][i] ; 
  }
  return v; 
}
int lca(int v ,int u){
  if(dis[v] < dis[u])swap(v ,u) ;
  v = up(v , dis[v] - dis[u]) ;
  for(int i = lg-1 ; i >= 0 ; i--){
    if(dp[v][i] != dp[u][i]){
      v = dp[v][i] ;
      u = dp[u][i] ; 
    }
  }
  if(v == u)return v; 
  return dp[v][0] ;
} 

void dfs1(int v ,int p = 0){
  dp[v][0] = p ;
  for(int i = 1; i < lg ; i++)dp[v][i] = dp[dp[v][i-1]][i-1] ; 
  for(int i= 0; i <G[v].size() ; i++){
    int u = G[v][i] ; 
    if(u == p)continue ; 
    dis[u] = dis[v] + 1 ;
    dfs1(u,v) ; 
  }
}

void dfs2(int v ,int p = 0){
  for(int i =0 ; i < G[v].size() ; i++){
    int u = G[v][i] ; 
    if(u == p)continue ;
    dfs2(u , v) ;
    sm[v]+=sm[u];
  }
  if(sm[v] == 0){
    mp[{v,p}] = mp[{p,v}] = 1; 
  }
}
void dfs3(int v , int p  , int cr ){
  c[v]= cr ;mark[v] = 1; 
  for(int i =0 ; i < G[v].size() ; i++){
    int u = G[v][i] ;
    if(u ==p  || mp[{v,u}] == 1)continue ;
    dfs3(u , v , cr) ; 
  }
}

signed main(){ 
  ios::sync_with_stdio(0);cin.tie(0);cout.tie(0) ;
  int n , k ; cin >> n >> k ; 
  for(int i = 1; i < n ; i++){
    int v ,u  ;
    cin >> v >> u ;
    G[v].pb(u) ;G[u].pb(v) ; 
  }
  dfs1(1) ; 
  for(int i =1 ;i <= n; i++){
    int x ; cin >> x; 
    vec[x].pb(i) ; 
  }
  for(int i = 1; i <= k ; i++){
    int v = vec[i][0] ;
    for(int j = 1 ; j < vec[i].size() ; j++){
      v= lca(v , vec[i][j]) ;  
    }
    for(int j =0 ; j < vec[i].size() ; j++){
      sm[vec[i][j]]++;
      sm[v]--;
    }
  }
  dfs2(1) ;
  int cnt = 1 ; 
  for(int i = 1 ;i <= n ; i++){
    if(mark[i] == 0){
      dfs3(i , 0 , cnt); cnt++ ;
    }
  }
  for(int i = 1; i <= n;  i++){
    for(int j =0 ; j < G[i].size() ; j++){
      int u=  G[i][j] ;
      if(c[u]!=c[i]){
        d[c[u]]++;
      }
    }
  }
  int ans =0 ;
  for(int i = 1; i < cnt ; i++){
    if(d[i]==1)ans++; 
  }
  cout << (ans+1)/2 ;
} 
/* 


*/

컴파일 시 표준 에러 (stderr) 메시지

mergers.cpp: In function 'void dfs1(int, int)':
mergers.cpp:36:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |   for(int i= 0; i <G[v].size() ; i++){
      |                 ~~^~~~~~~~~~~~
mergers.cpp: In function 'void dfs2(int, int)':
mergers.cpp:45:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |   for(int i =0 ; i < G[v].size() ; i++){
      |                  ~~^~~~~~~~~~~~~
mergers.cpp: In function 'void dfs3(int, int, int)':
mergers.cpp:57:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |   for(int i =0 ; i < G[v].size() ; i++){
      |                  ~~^~~~~~~~~~~~~
mergers.cpp: In function 'int main()':
mergers.cpp:79:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   79 |     for(int j = 1 ; j < vec[i].size() ; j++){
      |                     ~~^~~~~~~~~~~~~~~
mergers.cpp:82:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |     for(int j =0 ; j < vec[i].size() ; j++){
      |                    ~~^~~~~~~~~~~~~~~
mergers.cpp:95:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   95 |     for(int j =0 ; j < G[i].size() ; j++){
      |                    ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...