Submission #164311

#TimeUsernameProblemLanguageResultExecution timeMemory
164311qwerty234Werewolf (IOI18_werewolf)C++14
100 / 100
1261 ms141424 KiB
#include <bits/stdc++.h> #define ll long long #define pb push_back #define f first #define se second #define pll pair<ll, ll> #define pii pair<int, int> using namespace std; const int N = 4e5 + 123; struct query { int La, Ra, Lb, Rb, id; } qq[N]; struct qwe{ int k, id, Lb, Rb; }; vector <qwe> qe[N]; int n, m, q, S[N], E[N], L[N], R[N], Pmin[N], Pmax[N], p[N], sz[N], val[N]; int rootL[N], rootR[N], tinm[N], toutm[N], tin[N], tout[N], timer = 0, tmn[N], tmx[N]; int t[4 * N], to[N], a1[N]; vector <int> Qmin[N], Qmax[N], g[N], gmin[N], gmax[N]; void make_set() { for (int i = 0; i < n; i++) { sz[i] = 1; val[i] = p[i] = i; } } int getp(int u) { if (u == p[u]) return u; p[u] = getp(p[u]); return p[u]; } void un(int u, int v, bool is =0) { u = getp(u); v = getp(v); if (u == v) return; if (sz[u] > sz[v]) swap(u, v); p[u] = v; sz[v] += sz[u]; if (is) val[v] = max(val[v], val[u]); else val[v] = min(val[v], val[u]); } void dfsmax(int u, int p=-1) { tinm[u] = ++timer; tmx[timer] = u; for (int i = 0; i < gmax[u].size(); i++) if (gmax[u][i] != p) dfsmax(gmax[u][i], u); toutm[u] = timer; } void dfsmin(int u, int p=-1) { tin[u] = ++timer; tmn[timer] = u; for (int i = 0; i < gmin[u].size(); i++) if (gmin[u][i] != p) dfsmin(gmin[u][i], u); tout[u] = timer; } void build(int v, int tl, int tr) { t[v] = 0; if (tl == tr) return; int tm = (tl + tr)>>1; build(v * 2, tl, tm); build(v * 2 + 1, tm + 1, tr); } void upd(int v, int tl, int tr, int pos) { if (tl == tr) { t[v] = 1; return; } int tm = (tl + tr) / 2; if (pos <= tm) upd(v * 2, tl, tm, pos); else upd(v * 2 + 1, tm + 1, tr, pos); t[v] = t[v * 2] + t[v * 2 + 1]; } int get(int v, int tl, int tr, int l, int r) { if (r < tl || tr < l) return 0; int tm = (tl + tr) / 2; if (l <= tl && tr <= r) return t[v]; return get(v * 2, tl, tm, l, r) + get(v * 2 + 1, tm + 1, tr, l, r); } vector<int> check_validity(int n1, vector<int> X, vector<int> Y, vector<int> S1, vector<int> E1, vector<int> L1, vector<int> R1) { n = n1; m = X.size(); q = S1.size(); for (int i = 0; i < q; i++) { S[i] = S1[i]; E[i] = E1[i]; L[i] = L1[i]; R[i] = R1[i]; } for (int i = 0; i < q; i++) { Qmin[L[i]].pb(i); Qmax[R[i]].pb(i); } for (int i = 0; i < m; i++) { g[X[i]].pb(Y[i]); g[Y[i]].pb(X[i]); } make_set(); for (int i = n - 1; i >= 0; i--) { for (int j = 0; j < g[i].size(); j++) { if (getp(i) == getp(g[i][j]) || g[i][j] < i) continue; Pmin[val[getp(g[i][j])]] = i; un(i, g[i][j]); } for (int j = 0; j < Qmin[i].size(); j++) { int v = getp(S[Qmin[i][j]]); rootL[Qmin[i][j]] = val[v]; } } make_set(); for (int i = 0; i < n; i++) { for (int j = 0; j < g[i].size(); j++) { if (getp(i) == getp(g[i][j]) || g[i][j] > i) continue; Pmax[val[getp(g[i][j])]] = i; un(i, g[i][j], 1); } for (int j = 0; j < Qmax[i].size(); j++) { int v = getp(E[Qmax[i][j]]); rootR[Qmax[i][j]] = val[v]; } } Pmax[n - 1] = Pmin[0] = -1; for (int i = 0; i < n; i++) { if (i != 0) { gmin[i].pb(Pmin[i]); gmin[Pmin[i]].pb(i); } if (i != n - 1) { gmax[i].pb(Pmax[i]); gmax[Pmax[i]].pb(i); } } timer = 0; dfsmin(0); timer = 0; dfsmax(n - 1); for (int i = 1; i <= n; i++) a1[tmx[i]] = i; for (int i = 1; i <= n; i++) to[i] = a1[tmn[i]]; for (int i = 0; i < q; i++) { qq[i].id = i; qq[i].La = tin[rootL[i]]; qq[i].Ra = tout[rootL[i]]; qq[i].Lb = tinm[rootR[i]]; qq[i].Rb = toutm[rootR[i]]; qwe tmp; tmp.Lb = qq[i].Lb; tmp.Rb = qq[i].Rb; tmp.k = 1; tmp.id = i; qe[qq[i].Ra].pb(tmp); tmp.Lb = qq[i].Lb; tmp.Rb = qq[i].Rb; tmp.k = -1; tmp.id = i; qe[qq[i].La - 1].pb(tmp); } vector <int> ans; ans.clear(); for (int i = 0; i < q; i++) ans.pb(0); build(1, 1, n); for (int i = 1; i <= n; i++) { upd(1, 1, n, to[i]); for (int j = 0; j < qe[i].size(); j++) { qwe tmp = qe[i][j]; ans[tmp.id] += tmp.k * get(1, 1, n, tmp.Lb, tmp.Rb); } } for (int i = 0; i < q; i++) if (ans[i] != 0) ans[i] = 1; return ans; }

Compilation message (stderr)

werewolf.cpp: In function 'void dfsmax(int, int)':
werewolf.cpp:67:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < gmax[u].size(); i++)
                     ~~^~~~~~~~~~~~~~~~
werewolf.cpp: In function 'void dfsmin(int, int)':
werewolf.cpp:77:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < gmin[u].size(); i++)
                     ~~^~~~~~~~~~~~~~~~
werewolf.cpp: In function 'std::vector<int> check_validity(int, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
werewolf.cpp:138:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      for (int j = 0; j < g[i].size(); j++) {
                      ~~^~~~~~~~~~~~~
werewolf.cpp:144:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      for (int j = 0; j < Qmin[i].size(); j++) {
                      ~~^~~~~~~~~~~~~~~~
werewolf.cpp:151:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      for (int j = 0; j < g[i].size(); j++) {
                      ~~^~~~~~~~~~~~~
werewolf.cpp:157:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      for (int j = 0; j < Qmax[i].size(); j++) {
                      ~~^~~~~~~~~~~~~~~~
werewolf.cpp:201:5: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
     for (int i = 0; i < q; i++)
     ^~~
werewolf.cpp:203:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  build(1, 1, n);
  ^~~~~
werewolf.cpp:206:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      for (int j = 0; j < qe[i].size(); j++) {
                      ~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...