Submission #972689

#TimeUsernameProblemLanguageResultExecution timeMemory
972689vladiliusWerewolf (IOI18_werewolf)C++17
100 / 100
504 ms97692 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; #define pb push_back #define ff first #define ss second struct ST{ vector<int> t; int n; ST(int ns){ n = ns; t.resize(4 * n); } int get(int v, int tl, int tr, int& l, int& r){ if (l > tr || r < tl) return 0; if (l <= tl && tr <= r) return t[v]; int tm = (tl + tr) / 2, vv = 2 * v; return max(get(vv, tl, tm, l, r), get(vv + 1, tm + 1, tr, l, r)); } int get(int l, int r){ return get(1, 1, n, l, r); } void upd(int v, int tl, int tr, int& p, int& k){ if (tl == tr){ t[v] = k; return; } int tm = (tl + tr) / 2, vv = 2 * v; if (p <= tm){ upd(vv, tl, tm, p, k); } else { upd(vv + 1, tm + 1, tr, p, k); } t[v] = max(t[vv], t[vv + 1]); } void upd(int x, int y){ upd(1, 1, n, x, y); } }; struct dsu{ vector<vector<int>> g; vector<int> p; int n; dsu(int ns){ n = ns; p.resize(n + 1); for (int i = 1; i <= n; i++){ p[i] = i; } tin.resize(n + 1); tout.resize(n + 1); g.resize(n + 1); } int get(int v){ if (p[v] != v){ p[v] = get(p[v]); } return p[v]; } void unite(int x, int y){ x = get(x); y = get(y); if (x == y) return; p[y] = x; g[x].pb(y); } vector<int> all = {0}, tin, tout; int timer = 0; void dfs(int v, int pr){ all.pb(v); tin[v] = ++timer; for (int i: g[v]){ if (i == pr) continue; dfs(i, v); } tout[v] = timer; } }; vector<int> check_validity(int n, vector<int> x, vector<int> y, vector<int> s, vector<int> e, vector<int> l, vector<int> r){ int m = (int) x.size(), q = (int) s.size(); vector<int> g[n + 1]; for (int i = 0; i < m; i++){ x[i]++; y[i]++; g[x[i]].pb(y[i]); g[y[i]].pb(x[i]); } for (int i = 0; i < q; i++){ s[i]++; e[i]++; l[i]++; r[i]++; } vector<int> d[n + 1], p1(q); for (int i = 0; i < q; i++){ d[l[i]].pb(i); } dsu T1(n); for (int i = n; i > 0; i--){ for (int j: g[i]){ if (j > i){ T1.unite(i, j); } } for (int j: d[i]){ p1[j] = T1.get(s[j]); } } for (int i = 1; i <= n; i++) d[i].clear(); for (int i = 0; i < q; i++){ d[r[i]].pb(i); } vector<int> p2(q); dsu T2(n); for (int i = 1; i <= n; i++){ for (int j: g[i]){ if (j < i){ T2.unite(i, j); } } for (int j: d[i]){ p2[j] = T2.get(e[j]); } } T1.dfs(1, 0); T2.dfs(n, 0); // Точки vector<int> u(n + 1), v(n + 1); for (int i = 1; i <= n; i++){ u[T1.all[i]] = i; v[T2.all[i]] = i; } vector<int> st[n + 1]; for (int i = 1; i <= n; i++){ st[u[i]].pb(v[i]); } pair<pii, pii> rect[q]; for (int i = 0; i < q; i++){ rect[i] = {{T1.tin[p1[i]], T1.tout[p1[i]]}, {T2.tin[p2[i]], T2.tout[p2[i]]}}; } vector<int> end[n + 1]; for (int i = 0; i < q; i++){ end[rect[i].ff.ss].pb(i); } vector<int> out(q); ST T(n); for (int i = 1; i <= n; i++){ for (int j: st[i]){ T.upd(j, i); } for (int j: end[i]){ out[j] = (T.get(rect[j].ss.ff, rect[j].ss.ss) >= rect[j].ff.ff); } } return out; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...