제출 #447770

#제출 시각아이디문제언어결과실행 시간메모리
447770MilosMilutinovicWerewolf (IOI18_werewolf)C++14
0 / 100
4057 ms524292 KiB
#include <bits/stdc++.h> using namespace std; typedef vector<int> vi; int n, m, q; int mx[800005]; int mn[800005]; vi adj[200005], order; void dfs_ord(int u, int p) { order.push_back(u); for (int v : adj[u]) { if (v != p) dfs_ord(v, u); } } void Build(int node, int l, int r) { if (l == r) { mx[node] = order[l]; mn[node] = order[l]; return; } int mid = l + r >> 1; Build(node * 2, l, mid); Build(node * 2 + 1, mid + 1, r); mx[node] = max(mx[node * 2], mx[node * 2 + 1]); mn[node] = min(mn[node * 2], mn[node * 2 + 1]); } int GetMax(int node, int l, int r, int ll, int rr) { if (l > r || l > rr || r < ll) return 0; if (ll <= l && r <= rr) return mx[node]; int mid = l + r >> 1; return max(GetMax(node * 2, l, mid, ll, rr), GetMax(node * 2 + 1, mid + 1, r, ll, rr)); } int GetMin(int node, int l, int r, int ll, int rr) { if (l > r || l > rr || r < ll) return 1e9; if (ll <= l && r <= rr) return mn[node]; int mid = l + r >> 1; return min(GetMin(node * 2, l, mid, ll, rr), GetMin(node * 2 + 1, mid + 1, r, ll, rr)); } bool check(pair<int, int> X, pair<int, int> Y) { if (X.first <= Y.first && Y.second <= X.second) return true; if (Y.first <= X.first && X.second <= Y.second) return true; if (X.first <= Y.second && Y.first <= X.first) return true; if (Y.first <= X.second && X.first <= Y.first) return true; return false; } vi check_validity(int N, vi X, vi Y, vi S, vi E, vi L, vi R) { n = N, m = X.size(), q = S.size(); for (int i = 0; i < m; i++) { adj[X[i]].push_back(Y[i]); adj[Y[i]].push_back(X[i]); } int st = 0; for (int i = 0; i < n; i++) { if (adj[i].size() == 1) st = i; } dfs_ord(st, -1); Build(1, 0, n - 1); vi res(q); for (int i = 0; i < q; i++) { pair<int, int> X = {S[i], S[i]}, Y = {E[i], E[i]}; { int bot = 0, top = S[i] - 1; while (bot <= top) { int mid = bot + top >> 1; if (GetMin(1, 0, n - 1, mid, S[i] - 1) >= L[i]) { X.first = mid; top = mid - 1; } else bot = mid + 1; } } { int bot = S[i] + 1, top = n - 1; while (bot <= top) { int mid = bot + top >> 1; if (GetMin(1, 0, n - 1, S[i] + 1, mid) >= L[i]) { X.second = mid; bot = mid + 1; } else top = mid - 1; } } { int bot = 0, top = E[i] - 1; while (bot <= top) { int mid = bot + top >> 1; if (GetMax(1, 0, n - 1, mid, E[i] - 1) <= R[i]) { Y.first = mid; top = mid - 1; } else bot = mid + 1; } } { int bot = E[i] + 1, top = n - 1; while (bot <= top) { int mid = bot + top >> 1; if (GetMax(1, 0, n - 1, E[i] + 1, mid) <= R[i]) { Y.second = mid; bot = mid + 1; } else top = mid - 1; } } res[i] = (check(X, Y) ? 1 : 0); } return res; }

컴파일 시 표준 에러 (stderr) 메시지

werewolf.cpp: In function 'void Build(int, int, int)':
werewolf.cpp:24:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   24 |     int mid = l + r >> 1;
      |               ~~^~~
werewolf.cpp: In function 'int GetMax(int, int, int, int, int)':
werewolf.cpp:34:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   34 |     int mid = l + r >> 1;
      |               ~~^~~
werewolf.cpp: In function 'int GetMin(int, int, int, int, int)':
werewolf.cpp:41:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   41 |     int mid = l + r >> 1;
      |               ~~^~~
werewolf.cpp: In function 'vi check_validity(int, vi, vi, vi, vi, vi, vi)':
werewolf.cpp:71:31: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   71 |                 int mid = bot + top >> 1;
      |                           ~~~~^~~~~
werewolf.cpp:81:31: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   81 |                 int mid = bot + top >> 1;
      |                           ~~~~^~~~~
werewolf.cpp:91:31: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   91 |                 int mid = bot + top >> 1;
      |                           ~~~~^~~~~
werewolf.cpp:101:31: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  101 |                 int mid = bot + top >> 1;
      |                           ~~~~^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...