Submission #1154924

#TimeUsernameProblemLanguageResultExecution timeMemory
1154924pemguimnThrough Another Maze Darkly (CCO21_day1problem3)C++20
0 / 25
9094 ms30144 KiB
#include <bits/stdc++.h> #define int long long #define pii pair<int, int> using namespace std; const int N = 2e5 + 5, MOD = 1e9 + 7; int n, q; vector<pii> adj[N]; int p[N], pt[N], eid[N], vid[N], ans[N], timedfs = 0, ee = 0, s = 0; vector<int> tid[N]; template <typename T> struct Fenwick { int n; std::vector<T> a; Fenwick(int n_ = 0) { init(n_); } void init(int n_) { n = n_; a.assign(n + 5, T{}); } void upd(int x, const T &v) { for (int i = x; i <= n; i += i & -i) { a[i] = a[i] + v; } } T get(int x) { T ans{}; for (int i = x; i > 0; i -= i & -i) { ans = ans + a[i]; } return ans; } T get(int l, int r) { return get(r) - get(l - 1); } int kth(const T &k) { int x = 0; T cur{}; for (int i = 20; i >= 0; i--) { if (x + (1 << i) <= n && cur + a[x + (1 << i)] < k) { x += (1 << i); cur = cur + a[x]; } } return x + 1; } }; Fenwick<int> bit; bool vis[N]; vector<int> nxt; void dfs(int i, int pre){ for(auto &[x, id] : adj[i]){ if(x == pre) continue; id = ++ee; p[x] = i, dfs(x, i); } } void dfs2(int i){ for(int j = (pt[i] + 1) % adj[i].size(); ; j = (j + 1) % adj[i].size()){ if(j == pt[i] && i > 1) break; int x = adj[i][j].first; vid[++timedfs] = x, eid[timedfs] = adj[i][j].second; dfs2(x); vid[++timedfs] = i, eid[timedfs] = adj[i][j].second; if(j == pt[i] && i == 1) break; } } void dfs3(int i){ while(true){ pt[i] = (pt[i] + 1) % adj[i].size(); int j = pt[i], x = adj[i][j].first, ee = adj[i][j].second; if(vis[ee]) break; if(x == p[i]){ nxt.push_back(i); break; } bit.upd(tid[ee][0], 1); bit.upd(tid[ee][1], 1); s += 2; dfs3(x); vis[ee] = true; } } void solve(){ cin >> n >> q; for(int i = 1; i <= n; i++){ int sz; cin >> sz; for(int j = 0; j < sz; j++){ int x; cin >> x; adj[i].push_back({x, 0}); } } dfs(1, 1); for(int i = 2; i <= n; i++){ for(int j = 0; j < (int) adj[i].size(); j++){ if(adj[i][j].first == p[i]) pt[i] = j; } } dfs2(1); bit.init(timedfs); memset(pt, 0, sizeof pt); vector<pii> b; for(int i = 1; i <= q; i++){ int x; cin >> x; b.push_back({x, i}); } sort(b.begin(), b.end()); for(int i = 1; i <= timedfs; i++) tid[eid[i]].push_back(i); queue<int> qu; qu.push(1); int total = 0, qid = 0; while(s < timedfs){ nxt.clear(); int last = total; while(!qu.empty()){ dfs3(qu.front()); qu.pop(); } for(int x : nxt){ qu.push(x); } total += s; while(qid < b.size() && b[qid].first <= total){ ans[b[qid++].second] = vid[bit.kth(b[qid].first - last)]; } } while(qid < b.size()){ ans[b[qid].second] = vid[(b[qid].first - total - 1) % timedfs + 1]; } for(int i = 1; i <= q; i++) cout << ans[i] << '\n'; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); #define task "MAZE" if(fopen(task ".inp", "r")){ freopen(task ".inp", "r", stdin); freopen(task ".out", "w", stdout); } solve(); }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:150:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  150 |         freopen(task ".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:151:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  151 |         freopen(task ".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...