제출 #633103

#제출 시각아이디문제언어결과실행 시간메모리
633103no_nameeRailway (BOI17_railway)C++14
100 / 100
288 ms58984 KiB
#include<bits/stdc++.h> #define down '\n' #define lli long long int #define ulli unsigned long long int #define ld long double using namespace std; const int maxn = 1e5+100; const int LOGG = 19; int n,m,k, high[maxn], lca[maxn][LOGG]; bool check[maxn]; vector<int> adj[maxn], removee[maxn] , ans; map< pair<int,int> , int > save; set<int> save2[maxn]; void dfs( int u, int p) { lca[u][0] = p; high[u] = high[p] + 1; for( int i = 1; i < LOGG ; i ++ ) lca[u][i] = lca[ lca[u][i-1] ][i-1]; for( int v : adj[u] ) { if( v != p ) dfs( v,u ); } } void dfs2( int u , int p ) { for( int v : adj[u] ) { if( v != p ) { dfs2( v, u ); if( save2[v].size() > save2[u].size() ) save2[u].swap( save2[v] ); save2[u].insert( save2[v].begin() , save2[v].end() ); save2[v].clear(); } } for( int v : removee[u] )save2[u].erase(v); if( save2[u].size() >= k) check[u] = true; } int find_lca( int u, int v ) { if( high[u] < high[v] ) swap(u,v); int differ = high[u] - high[v]; for( int i = LOGG - 1; i >= 0; i -- ) { if( ((differ>>i)&1) ) u = lca[u][i]; } if( u == v ) return u; for( int i = LOGG- 1; i >= 0 ; i -- ) { if( lca[u][i] != lca[v][i] ) { u = lca[u][i]; v = lca[v][i]; } } return lca[u][0]; } void read() { cin >> n >> m >> k; int u,v; for( int i = 1; i < n; i ++ ) { cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); save[ {u,v} ] = save[ {v,u} ] = i; } dfs(1,1); } void solve() { int s,lowest_common_ancestor, vertex; for( int idx = 1; idx <= m ; idx ++ ) { cin >> s >> vertex; lowest_common_ancestor = vertex; save2[vertex].insert(idx); for( int i = 1; i < s; i ++ ) { cin >> vertex; save2[vertex].insert(idx); lowest_common_ancestor = find_lca( lowest_common_ancestor, vertex ); } removee[lowest_common_ancestor].push_back( idx ); } dfs2(1,1); for( int i = 2; i <= n; i ++ ) { if( check[i] ) ans.push_back( save[ {i, lca[i][0] } ] ); } sort( ans.begin() , ans.end() ); cout << ans.size() << down; for( int vertex : ans ) cout << vertex <<" "; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); read(); solve(); return 0; }

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

railway.cpp: In function 'void dfs2(int, int)':
railway.cpp:40:25: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   40 |     if( save2[u].size() >= k) check[u] = true;
      |         ~~~~~~~~~~~~~~~~^~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...