(UPD: 2024-12-04 14:48 UTC) Judge is not working due to Cloudflare incident. (URL) We can do nothing about it, sorry. After the incident is resolved, we will grade all submissions.

Submission #1122146

#TimeUsernameProblemLanguageResultExecution timeMemory
1122146vjudge1Rigged Roads (NOI19_riggedroads)C++17
100 / 100
270 ms53076 KiB
#include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(...) 42 #endif #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); } const int N = 3e5 + 5; int n, m; int head[N], pr[N], pos[N], tin[N], sz[N], ind[N], res[N], s[4 * N]; bool inside[N], vis[N]; pair<int, int> dat[N]; vector<pair<int, int>> g[N]; void dfs(int u) { sz[u] = 1; for (auto x : g[u]) { int v, id; tie(v, id) = x; g[v].erase(find(g[v].begin(), g[v].end(), make_pair(u, id))); pr[v] = u; ind[v] = id; dfs(v); sz[u] += sz[v]; } } int order; void hld(int u, int h) { head[u] = h; pos[tin[u] = ++order] = u; if (sz[u] > 1) { auto x = (*max_element(g[u].begin(), g[u].end(), [&](auto x, auto y) { return sz[x.first] < sz[y.first]; })).first; hld(x, h); for (auto v : g[u]) { if (v.first ^ x) { hld(v.first, v.first); } } } } void bld(int id = 1, int l = 1, int r = n) { if (l == r) { s[id] = ind[pos[l]]; return; } int m = (l + r) / 2; bld(id * 2, l, m); bld(id * 2 + 1, m + 1, r); s[id] = min(s[id * 2], s[id * 2 + 1]); } void upd(int i, int id = 1, int l = 1, int r = n) { if (l == r) { s[id] = N; return; } int m = (l + r) / 2; i <= m ? upd(i, id * 2, l, m) : upd(i, id * 2 + 1, m + 1, r); s[id] = min(s[id * 2], s[id * 2 + 1]); } int qry(int u, int v, int id = 1, int l = 1, int r = n) { if (u <= l && r <= v) { return s[id]; } int m = (l + r) / 2; if (v <= m) { return qry(u, v, id * 2, l, m); } if (m < u) { return qry(u, v, id * 2 + 1, m + 1, r); } return min(qry(u, v, id * 2, l, m), qry(u, v, id * 2 + 1, m + 1, r)); } int get(int u, int v) { int res = N; for (; head[u] ^ head[v]; u = pr[head[u]]) { if (sz[head[u]] > sz[head[v]]) { swap(u, v); } res = min(res, qry(tin[head[u]], tin[u])); } if (tin[u] > tin[v]) { swap(u, v); } if (tin[u] + 1 <= tin[v]) { res = min(res, qry(tin[u] + 1, tin[v])); } return res; } int ans; void DFS(int id) { vis[id] = 1; int u, v; tie(u, v) = dat[id]; if (!inside[id]) { int nxt = N; while ((nxt = get(u, v)) ^ N) { DFS(nxt); } } else { upd(max(tin[u], tin[v])); } res[id] = ++ans; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); file("A"); cin >> n >> m; for (int i = 1; i <= m; ++i) { int u, v; cin >> u >> v; dat[i] = {u, v}; } for (int i = 1; i < n; ++i) { int j; cin >> j; inside[j] = 1; int u, v; tie(u, v) = dat[j]; g[u].push_back({v, j}); g[v].push_back({u, j}); } ind[1] = N; dfs(1); hld(1, 1); bld(); for (int i = 1; i <= m; ++i) { if (!vis[i]) { DFS(i); } cout << res[i] << " "; } return 0; }

Compilation message (stderr)

riggedroads.cpp: In function 'int main()':
riggedroads.cpp:11:57: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   11 | #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
      |                                                  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
riggedroads.cpp:123:3: note: in expansion of macro 'file'
  123 |   file("A");
      |   ^~~~
riggedroads.cpp:11:90: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   11 | #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
      |                                                                                   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
riggedroads.cpp:123:3: note: in expansion of macro 'file'
  123 |   file("A");
      |   ^~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...