Submission #521608

#TimeUsernameProblemLanguageResultExecution timeMemory
521608eecsMeetings 2 (JOI21_meetings2)C++17
100 / 100
468 ms218644 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 200010; int n, tot, sz[maxn], ans[maxn], fa[maxn], rt[maxn], dep[maxn]; vector<int> G[maxn]; struct node { int l, r, tag, val, ans, mx; node() { tag = val = ans = mx = -1000000; } } t[maxn * 40]; #define mid (l + r >> 1) void maintain(int k) { t[k].mx = max(t[t[k].l].mx, t[t[k].r].mx); } void pushdown(int k) { if (t[k].tag == -1000000) return; int ls = t[k].l, rs = t[k].r; if (ls) { t[ls].tag = max(t[ls].tag, t[k].tag); t[ls].ans = max(t[ls].ans, t[ls].val + t[ls].tag); } if (rs) { t[rs].tag = max(t[rs].tag, t[k].tag); t[rs].ans = max(t[rs].ans, t[rs].val + t[rs].tag); } t[k].tag = -1000000; } void modify1(int &k, int l, int r, int p, int v) { if (!k) k = ++tot; if (l == r) { t[k].mx = t[k].val = max(t[k].mx, v); t[k].tag = -1000000; return; } pushdown(k); if (mid >= p) modify1(t[k].l, l, mid, p, v); else modify1(t[k].r, mid + 1, r, p, v); maintain(k); } void modify2(int &k, int l, int r, int p, int v) { if (!k) k = ++tot; if (l == r) { t[k].ans = max(t[k].ans, v); return; } pushdown(k); if (mid >= p) modify2(t[k].l, l, mid, p, v); else modify2(t[k].r, mid + 1, r, p, v); maintain(k); } int qmax(int k, int l, int r, int ql, int qr) { if (!k || l >= ql && r <= qr) return t[k].mx; pushdown(k); int ans = -1000000; if (mid >= ql) ans = qmax(t[k].l, l, mid, ql, qr); if (mid < qr) ans = max(ans, qmax(t[k].r, mid + 1, r, ql, qr)); return ans; } void update(int k, int l, int r, int ql, int qr, int v) { if (!k) return; if (l >= ql && r <= qr) { t[k].tag = max(t[k].tag, v); t[k].ans = max(t[k].ans, t[k].val + t[k].tag); return; } pushdown(k); if (mid >= ql) update(t[k].l, l, mid, ql, qr, v); if (mid < qr) update(t[k].r, mid + 1, r, ql, qr, v); maintain(k); } int merge(int k1, int k2, int l, int r, int mx1, int mx2, int val) { if (!k1 && !k2) return 0; if (!k2) { t[k1].tag = max(t[k1].tag, mx2 + val); t[k1].ans = max(t[k1].ans, t[k1].val + t[k1].tag); return k1; } if (!k1) { t[k2].tag = max(t[k2].tag, mx1 + val); t[k2].ans = max(t[k2].ans, t[k2].val + t[k2].tag); return k2; } if (l == r) { t[k1].ans = max({t[k1].ans, t[k2].ans, t[k1].val + max(mx2, t[k2].val) + val, t[k2].val + max(mx1, t[k1].val) + val}); t[k1].val = t[k1].mx = max(t[k1].val, t[k2].val); t[k1].tag = -1000000; return k1; } pushdown(k1), pushdown(k2); t[k1].l = merge(t[k1].l, t[k2].l, l, mid, max(mx1, t[t[k1].r].mx), max(mx2, t[t[k2].r].mx), val); t[k1].r = merge(t[k1].r, t[k2].r, mid + 1, r, mx1, mx2, val); maintain(k1); return k1; } void dfs(int k, int l, int r) { if (!k) return; if (l == r) { ans[l] = max(ans[l], t[k].ans + 1); return; } pushdown(k); dfs(t[k].l, l, mid), dfs(t[k].r, mid + 1, r); } int main() { scanf("%d", &n); for (int i = 1, u, v; i < n; i++) { scanf("%d %d", &u, &v); G[u].push_back(v), G[v].push_back(u); } function<void(int)> dfs1 = [&](int v) { sz[v] = 1; for (int u : G[v]) if (u ^ fa[v]) { dep[u] = dep[v] + 1; fa[u] = v, dfs1(u), sz[v] += sz[u]; } }; function<void(int)> dfs2 = [&](int v) { for (int u : G[v]) if (u ^ fa[v]) { dfs2(u); rt[v] = merge(rt[v], rt[u], 1, n, -1000000, -1000000, -2 * dep[v]); } modify1(rt[v], 1, n, sz[v], dep[v]); if (v > 1) { int t = n - sz[v]; update(rt[v], 1, n, 1, t, -dep[fa[v]]); modify2(rt[v], 1, n, t, qmax(rt[v], 1, n, t, n) - dep[fa[v]]); } }; dfs1(1), dfs2(1), dfs(rt[1], 1, n); for (int i = n - 1; i; i--) { ans[i] = max(ans[i], ans[i + 1]); } for (int i = 1; i <= n; i++) { if (i & 1) puts("1"); else printf("%d\n", max(1, ans[i >> 1])); } return 0; }

Compilation message (stderr)

meetings2.cpp: In function 'void modify1(int&, int, int, int, int)':
meetings2.cpp:12:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   12 | #define mid (l + r >> 1)
      |              ~~^~~
meetings2.cpp:38:6: note: in expansion of macro 'mid'
   38 |  if (mid >= p) modify1(t[k].l, l, mid, p, v);
      |      ^~~
meetings2.cpp:12:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   12 | #define mid (l + r >> 1)
      |              ~~^~~
meetings2.cpp:38:35: note: in expansion of macro 'mid'
   38 |  if (mid >= p) modify1(t[k].l, l, mid, p, v);
      |                                   ^~~
meetings2.cpp:12:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   12 | #define mid (l + r >> 1)
      |              ~~^~~
meetings2.cpp:39:23: note: in expansion of macro 'mid'
   39 |  else modify1(t[k].r, mid + 1, r, p, v);
      |                       ^~~
meetings2.cpp: In function 'void modify2(int&, int, int, int, int)':
meetings2.cpp:12:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   12 | #define mid (l + r >> 1)
      |              ~~^~~
meetings2.cpp:47:6: note: in expansion of macro 'mid'
   47 |  if (mid >= p) modify2(t[k].l, l, mid, p, v);
      |      ^~~
meetings2.cpp:12:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   12 | #define mid (l + r >> 1)
      |              ~~^~~
meetings2.cpp:47:35: note: in expansion of macro 'mid'
   47 |  if (mid >= p) modify2(t[k].l, l, mid, p, v);
      |                                   ^~~
meetings2.cpp:12:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   12 | #define mid (l + r >> 1)
      |              ~~^~~
meetings2.cpp:48:23: note: in expansion of macro 'mid'
   48 |  else modify2(t[k].r, mid + 1, r, p, v);
      |                       ^~~
meetings2.cpp: In function 'int qmax(int, int, int, int, int)':
meetings2.cpp:53:20: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   53 |  if (!k || l >= ql && r <= qr) return t[k].mx;
      |            ~~~~~~~~^~~~~~~~~~
meetings2.cpp:12:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   12 | #define mid (l + r >> 1)
      |              ~~^~~
meetings2.cpp:56:6: note: in expansion of macro 'mid'
   56 |  if (mid >= ql) ans = qmax(t[k].l, l, mid, ql, qr);
      |      ^~~
meetings2.cpp:12:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   12 | #define mid (l + r >> 1)
      |              ~~^~~
meetings2.cpp:56:39: note: in expansion of macro 'mid'
   56 |  if (mid >= ql) ans = qmax(t[k].l, l, mid, ql, qr);
      |                                       ^~~
meetings2.cpp:12:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   12 | #define mid (l + r >> 1)
      |              ~~^~~
meetings2.cpp:57:6: note: in expansion of macro 'mid'
   57 |  if (mid < qr) ans = max(ans, qmax(t[k].r, mid + 1, r, ql, qr));
      |      ^~~
meetings2.cpp:12:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   12 | #define mid (l + r >> 1)
      |              ~~^~~
meetings2.cpp:57:44: note: in expansion of macro 'mid'
   57 |  if (mid < qr) ans = max(ans, qmax(t[k].r, mid + 1, r, ql, qr));
      |                                            ^~~
meetings2.cpp: In function 'void update(int, int, int, int, int, int)':
meetings2.cpp:12:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   12 | #define mid (l + r >> 1)
      |              ~~^~~
meetings2.cpp:68:6: note: in expansion of macro 'mid'
   68 |  if (mid >= ql) update(t[k].l, l, mid, ql, qr, v);
      |      ^~~
meetings2.cpp:12:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   12 | #define mid (l + r >> 1)
      |              ~~^~~
meetings2.cpp:68:35: note: in expansion of macro 'mid'
   68 |  if (mid >= ql) update(t[k].l, l, mid, ql, qr, v);
      |                                   ^~~
meetings2.cpp:12:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   12 | #define mid (l + r >> 1)
      |              ~~^~~
meetings2.cpp:69:6: note: in expansion of macro 'mid'
   69 |  if (mid < qr) update(t[k].r, mid + 1, r, ql, qr, v);
      |      ^~~
meetings2.cpp:12:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   12 | #define mid (l + r >> 1)
      |              ~~^~~
meetings2.cpp:69:31: note: in expansion of macro 'mid'
   69 |  if (mid < qr) update(t[k].r, mid + 1, r, ql, qr, v);
      |                               ^~~
meetings2.cpp: In function 'int merge(int, int, int, int, int, int, int)':
meetings2.cpp:12:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   12 | #define mid (l + r >> 1)
      |              ~~^~~
meetings2.cpp:92:39: note: in expansion of macro 'mid'
   92 |  t[k1].l = merge(t[k1].l, t[k2].l, l, mid, max(mx1, t[t[k1].r].mx), max(mx2,
      |                                       ^~~
meetings2.cpp:12:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   12 | #define mid (l + r >> 1)
      |              ~~^~~
meetings2.cpp:94:36: note: in expansion of macro 'mid'
   94 |  t[k1].r = merge(t[k1].r, t[k2].r, mid + 1, r, mx1, mx2, val);
      |                                    ^~~
meetings2.cpp: In function 'void dfs(int, int, int)':
meetings2.cpp:12:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   12 | #define mid (l + r >> 1)
      |              ~~^~~
meetings2.cpp:102:17: note: in expansion of macro 'mid'
  102 |  dfs(t[k].l, l, mid), dfs(t[k].r, mid + 1, r);
      |                 ^~~
meetings2.cpp:12:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   12 | #define mid (l + r >> 1)
      |              ~~^~~
meetings2.cpp:102:35: note: in expansion of macro 'mid'
  102 |  dfs(t[k].l, l, mid), dfs(t[k].r, mid + 1, r);
      |                                   ^~~
meetings2.cpp: In function 'int main()':
meetings2.cpp:106:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  106 |  scanf("%d", &n);
      |  ~~~~~^~~~~~~~~~
meetings2.cpp:108:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  108 |   scanf("%d %d", &u, &v);
      |   ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...