记录编号 585495 评测结果 AAAAAAAAAAAAAAA
题目名称 [USACO19 DEC Gold]Milk Visits 最终得分 100
用户昵称 Gravataryrtiop 是否通过 通过
代码语言 C++ 运行时间 2.375 s
提交时间 2023-12-14 20:07:31 内存使用 9.48 MiB
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. #define pb emplace_back
  3. #define fir first
  4. #define sec second
  5.  
  6. using i64 = long long;
  7. using tup = std::tuple<int, int, int, int>;
  8. using pii = std::pair<int, int>;
  9.  
  10. constexpr int maxn = 1e5 + 5;
  11. int n, m, a[maxn], dfn[maxn], rev[maxn], dfc, top[maxn], siz[maxn], dep[maxn], fa[maxn], son[maxn], buc[maxn], ans[maxn];
  12. std::vector<int> G[maxn];
  13. std::vector<std::tuple<int, int, int, int>> qry;
  14.  
  15. void dfs1(int u, int ff) {
  16. siz[u] = 1; dep[u] = dep[fa[u] = ff] + 1;
  17. for (auto& v : G[u]) {
  18. if (v == ff) continue ;
  19. dfs1(v, u); siz[u] += siz[v];
  20. if (siz[v] > siz[son[u]]) son[u] = v;
  21. }
  22. return ;
  23. }
  24.  
  25. void dfs2(int u, int tp) {
  26. top[rev[dfn[u] = ++dfc] = u] = tp;
  27. if (!son[u]) return ;
  28. dfs2(son[u], tp);
  29. for (auto& v : G[u])
  30. if (v != fa[u] && v != son[u]) dfs2(v, v);
  31. return ;
  32. }
  33.  
  34. void forw(int u, int v, int w, int id) {
  35. while (top[u] != top[v]) {
  36. if (dep[top[u]] < dep[top[v]]) std::swap(u, v);
  37. qry.pb(w, id, dfn[top[u]] - 1, -1);
  38. qry.pb(w, id, dfn[u], 1);
  39. u = fa[top[u]];
  40. }
  41. if (dep[u] > dep[v]) std::swap(u, v);
  42. qry.pb(w, id, dfn[u] - 1, -1);
  43. qry.pb(w, id, dfn[v], 1);
  44. return ;
  45. }
  46.  
  47. int main() {
  48. freopen("_milkvisits.in", "r", stdin);
  49. freopen("_milkvisits.out", "w", stdout);
  50. scanf("%d %d", &n, &m);
  51. for (int i = 1; i <= n; ++i)
  52. scanf("%d", &a[i]);
  53. for (int i = 1; i < n; ++i) {
  54. int u, v; scanf("%d %d", &u, &v);
  55. G[u].pb(v); G[v].pb(u);
  56. }
  57. dfs1(1, 0); dfs2(1, 0);
  58. for (int i = 1; i <= m; ++i) {
  59. int u, v, t; scanf("%d %d %d", &u, &v, &t);
  60. forw(u, v, t, i);
  61. }
  62. int j = 1;
  63. std::sort(qry.begin(), qry.end(), [&](const tup& lhs, const tup& rhs) {
  64. return std::get<2>(lhs) < std::get<2>(rhs);
  65. });
  66. for (auto& p : qry) {
  67. int w, id, x, v; std::tie(w, id, x, v) = p;
  68. for (; j <= x; ++j) ++buc[a[rev[j]]];
  69. ans[id] += v * buc[w];
  70. }
  71. for (int i = 1; i <= m; ++i)
  72. printf("%d", ans[i] > 0);
  73. return 0;
  74. }