Submission #1160853

#TimeUsernameProblemLanguageResultExecution timeMemory
1160853sleepntsheepDrivers (BOI24_drivers)C++20
0 / 100
8 ms15688 KiB
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> const int N = 555555; struct edge { int w, v, u; bool operator<(const edge &o) const { return w < o.w; } }; std::vector<int> g[N]; int n, m, u, l, ds[N], when[N], par[N]; edge *e; void input() { scanf("%d%d%d", &n, &m, &u); e = new edge[m]; for (int i = 0; i < m; ++i) scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w); std::sort(e, e + m); } int ds_find(int i) { if (ds[i] < 0) return i; return ds[i] = ds_find(ds[i]); } struct { void build() { memset(ds, -1, sizeof ds); l = n; for (auto *ed = e; ed < e + m; ++ed) { auto [w, v, u] = *ed; v = ds_find(v); u = ds_find(u); if (u == v) continue; ++l; par[l] = l; ds[v] = ds[u] = l; par[v] = par[u] = l; g[l].push_back(u); g[l].push_back(v); when[l] = w; } } } krt; struct { int tin[N], head[N], sz[N], timer, dep[N]; void dfs(int u) { sz[u] = 1; for (int i = 0; i < g[u].size(); ++i) { dfs(g[u][i]); sz[u] += sz[g[u][i]]; if (sz[g[u][i]] > sz[g[u][0]]) std::swap(g[u][0], g[u][i]); } } void hld(int u, int hd) { tin[u] = timer++; head[u] = hd; for (auto v : g[u]) dep[v] = dep[u] + 1, hld(v, v == g[u][0] ? hd : v); } int lca(int u, int v) { if (dep[u] < dep[v]) return lca(v, u); while (head[u] != head[v]) { if (dep[head[u]] < dep[head[v]]) std::swap(u, v); u = par[head[u]]; } return tin[u] > tin[v] ? v : u; } void build() { dfs(l); hld(l, l); } } lca; struct { void query() { int a, b, c; scanf("%d%d%d", &a, &b, &c); if (ds_find(a) == ds_find(b)) { int x = lca.lca(a, b); if (when[x] <= c) puts("TAIP"); else puts("NE"); } else puts("NE"); } void queries() { while (u--) query(); } } miku; int main() { input(); krt.build(); lca.build(); miku.queries(); return 0; }

Compilation message (stderr)

Main.cpp: In function 'void input()':
Main.cpp:20:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   20 |         scanf("%d%d%d", &n, &m, &u);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
Main.cpp:23:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   23 |                 scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);
      |                 ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp: In member function 'void<unnamed struct>::query()':
Main.cpp:97:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   97 |                 scanf("%d%d%d", &a, &b, &c);
      |                 ~~~~~^~~~~~~~~~~~~~~~~~~~~~
#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...