Submission #1005136

#TimeUsernameProblemLanguageResultExecution timeMemory
1005136vjudge1Railway (BOI17_railway)C++17
100 / 100
55 ms40644 KiB
#pragma GCC optimize("-O3") #include<bits/stdc++.h> #include<ext/pb_ds/assoc_container.hpp> #include<ext/pb_ds/tree_policy.hpp> #define ll long long #define ld long double #define vl vector<ll> #define vi vector<int> #define pii pair<int, int> #define pll pair<ll, ll> #define all(v) v.begin(), v.end() #define rall(v) v.rbegin(), v.rend() #define pb push_back #define p_b pop_back #define f first #define s second using namespace std; using namespace __gnu_pbds; typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; const ll sz = 1e5+5; vl g[sz]; ll vis[sz], lev[sz], intime[sz], p[30][sz], dist[sz], tin = 1; void dfs(ll node) { vis[node] = 1; intime[node] = tin++; for(auto u : g[node]) { if(vis[u]) continue; lev[u] = lev[node] + 1; p[0][u] = node; dfs(u); } } ll jump(ll x, ll k) { for(ll i = 0; i < 27; i++) { if((k >> i) & 1) x = p[i][x]; } return x; } ll lca(ll x, ll y) { if(lev[x] > lev[y]) swap(x, y); ll d = lev[y] - lev[x]; y = jump(y, d); if(x == y) return x; else { for(ll i = 26; i >= 0; i--) { if(p[i][x] != p[i][y]) { x = p[i][x]; y = p[i][y]; } } return p[0][x]; } } void dfs2(ll node) { vis[node] = 1; for(auto u : g[node]) { if(vis[u]) continue; dfs2(u); dist[node] += dist[u]; } } void solve() { ll n, m, k, i, j; cin >> n >> m >> k; vector<pll>edges; for(i = 1; i <= n - 1; i++) { ll x, y; cin >> x >> y; edges.pb({x, y}); g[x].pb(y); g[y].pb(x); } dfs(1); for(i = 1; i < 27; i++) { for(j = 1; j <= n; j++) p[i][j] = p[i-1][p[i-1][j]]; } for(i = 1; i <= m; i++) { ll s; cin >> s; vector<pll>vect; for(j = 1; j <= s; j++) { ll x; cin >> x; vect.pb({intime[x], x}); } sort(all(vect)); vect.pb({vect[0].f, vect[0].s}); for(j = 0; j < s; j++) { ll x = vect[j].s, y = vect[j+1].s; ll a = lca(x, y); dist[x]++; dist[y]++; dist[a] -= 2; } } for(i = 1; i <= n; i++) vis[i] = 0; dfs2(1); vl f; for(i = 0; i < edges.size(); i++) { ll x = edges[i].f, y = edges[i].s; if(p[0][x] != y) swap(x, y); if(dist[x] >= 2 * k) f.pb(i+1); } cout << f.size() << "\n"; for(auto u : f) cout << u << ' '; cout << "\n"; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll tests = 1; //cin >> tests; while(tests--) { solve(); } }

Compilation message (stderr)

railway.cpp: In function 'void solve()':
railway.cpp:122:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  122 |     for(i = 0; i < edges.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...