Submission #153757

#TimeUsernameProblemLanguageResultExecution timeMemory
153757tutisCats or Dogs (JOI18_catdog)C++17
100 / 100
2481 ms36472 KiB
/*input 3 1 2 1 2 3 1 3 1 2 */ #pragma GCC optimize("O3") #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; const int maxn = 101010; vector<ll>adj[maxn]; ll pa[maxn], sz[maxn]; void dfs(ll i, ll p) { if (p != 0) adj[i].erase(find(adj[i].begin(), adj[i].end(), p)); pa[i] = p; sz[i] = 1; pair<ll, ll>mx = { -1, -1}; for (ll t = 0; t < (ll)adj[i].size(); t++) { ll j = adj[i][t]; dfs(j, i); sz[i] += sz[j]; mx = max(mx, {sz[j], t}); } if (mx.second != -1) swap(adj[i][0], adj[i][mx.second]); } ll timer = 1; ll nr[maxn], head[maxn], tail[maxn]; void hld(ll i, ll h) { nr[i] = timer++; head[i] = h; tail[h] = i; for (ll t = 0; t < (ll)adj[i].size(); t++) { ll j = adj[i][t]; hld(j, t == 0 ? h : j); } } struct line { ll cc = 0, cd = maxn, dd = 0, dc = maxn; line() {} }; line merge(line a, line b) { line c; c.cc = min({a.cc + b.cc, a.cc + b.dc + 1, a.cd + b.cc + 1, a.cd + b.dc}); c.cd = min({a.cc + b.cd, a.cc + b.dd + 1, a.cd + b.cd + 1, a.cd + b.dd}); c.dd = min({a.dc + b.cd, a.dc + b.dd + 1, a.dd + b.cd + 1, a.dd + b.dd}); c.dc = min({a.dc + b.cc, a.dc + b.dc + 1, a.dd + b.cc + 1, a.dd + b.dc}); return c; } struct ST { line X; ll l, r; ST *left, *right; ST(ll l, ll r): l(l), r(r) { if (l < r) { left = new ST(l, (l + r) / 2); right = new ST((l + r) / 2 + 1, r); X = merge(left->X, right->X); } } line get(ll x, ll y) { if (x <= l && r <= y) return X; if (r < x || y < l) return line(); return merge(left->get(x, y), right->get(x, y)); } void set(ll x, ll w, int c) { if (l == r) { if (c) X.cc = w; else X.dd = w; } else { if (x <= (l + r) / 2) left->set(x, w, c); else right->set(x, w, c); X = merge(left->X, right->X); } } } medis(0, 101010); void initialize(int N, vector<int> A, vector<int> B) { for (int i = 0; i < N - 1; i++) { adj[A[i]].push_back(B[i]); adj[B[i]].push_back(A[i]); } dfs(1, 0); hld(1, 1); } ll C[maxn], D[maxn], V[maxn]; void fix(ll v) { while (true) { ll w = head[v]; line X = medis.get(nr[w], nr[tail[w]]); C[pa[w]] -= min({X.cd, X.cc, X.dc + 1, X.dd + 1}); D[pa[w]] -= min({X.cd + 1, X.cc + 1, X.dc, X.dd}); medis.set(nr[v], maxn, 0); medis.set(nr[v], maxn, 1); if (V[v] != 1) medis.set(nr[v], C[v], 1); if (V[v] != -1) medis.set(nr[v], D[v], 0); X = medis.get(nr[w], nr[tail[w]]); C[pa[w]] += min({X.cd, X.cc, X.dc + 1, X.dd + 1}); D[pa[w]] += min({X.cd + 1, X.cc + 1, X.dc, X.dd}); if (v == 1)break; if (v != w) v = w; else v = pa[v]; } } int cat(int v) { V[v] = -1; fix(v); return min(C[0], D[0]); } int dog(int v) { V[v] = 1; fix(v); return min(C[0], D[0]); } int neighbor(int v) { V[v] = 0; fix(v); return min(C[0], D[0]); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...