Submission #828826

#TimeUsernameProblemLanguageResultExecution timeMemory
828826teeslaRailway (BOI17_railway)C++14
100 / 100
170 ms26528 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int,int> ii; int n,m,k; vector<vector<ii>> adj; // viz e qual aresta vector<vector<int>> sparse; vector<int> tin,tout; vector<int> node, res; // guarda a soma; int t = 0; void dfs(int x, int ant){ t++; tin[x] = t; for(auto [a,b] : adj[x]){ if(a == ant) continue; sparse[0][a] = x; dfs(a,x); } tout[x] = t; return; } void build(){ for(int i=1; i<25; i++) for(int j = 0; j<n; j++){ sparse[i][j] = sparse[i-1][sparse[i-1][j]]; } return; } bool anc(int a, int b){// a é pai de b if(tin[a] <= tin[b] and tout[a] >= tout[b]) return true; return false; } int lca(int a,int b){ if(anc(a,b)) return a; if(anc(b,a)) return b; for(int i=24; i>=0; i--){ int novo = sparse[i][a]; if(anc(novo, b)) continue; a = novo; } return sparse[0][a]; } bool cmp(int a, int b){ if(tout[a] != tout[b]) return tout[a] < tout[b]; else return tin[a] > tin[b]; } int dfs2(int x, int ant, int aresta){ int sum = node[x]; for(auto [a,b]: adj[x]){ if(a == ant) continue; sum += dfs2(a,x,b); } if(sum >= k) res.push_back(aresta); return sum; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n>> m >> k; adj.resize(n); tin.resize(n+3), tout.resize(n+3); node.assign(n, 0); sparse.assign(25, vector<int>(n,0)); for(int i=0; i<n-1; i++){ int a,b; cin >> a >> b; a--; b--; adj[a].push_back({b, i+1}); adj[b].push_back({a,i+1}); } dfs(0,0); build(); for(int i=0; i<m; i++){ int s; cin >> s; vector<int> v(s); int paiComum = -1; for(int j=0; j<s; j++){ cin >> v[j]; v[j]--; if(paiComum == -1) paiComum = v[j]; else{paiComum = lca(paiComum, v[j]);} } //cout <<"lca "<< paiComum << endl; sort(v.begin(), v.end(),cmp); for(int j= 0; j< s; j++){ if(j == 0){ node[v[j]] += 1; node[paiComum] -= 1; } else{ int ant = v[j-1]; if(anc(v[j], ant)) continue; else{ node[v[j]] += 1; int outro = lca(v[j], ant); node[outro]-=1; // cout << v[j] << endl; } } } } dfs2(0,0,0); sort(res.begin(), res.end()); cout << res.size()<< endl; for(int i=0; i<res.size(); i++){ if(i) cout <<' '; cout << res[i]; } cout << endl; }

Compilation message (stderr)

railway.cpp: In function 'void dfs(int, int)':
railway.cpp:17:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   17 |     for(auto [a,b] : adj[x]){
      |              ^
railway.cpp: In function 'int dfs2(int, int, int)':
railway.cpp:66:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   66 |     for(auto [a,b]: adj[x]){
      |              ^
railway.cpp: In function 'int main()':
railway.cpp:148:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  148 |     for(int i=0; i<res.size(); 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...