Submission #768837

#TimeUsernameProblemLanguageResultExecution timeMemory
768837borisAngelovJousting tournament (IOI12_tournament)C++17
0 / 100
93 ms3048 KiB
#include <iostream> using namespace std; const int maxn = 100005; int n, q; int my_rank; int a[maxn]; pair<int, int> queries[maxn]; int tree[4 * maxn]; int lazy[4 * maxn]; void build(int node, int l, int r) { if (l == r) { tree[node] = 1; return; } int mid = (l + r) / 2; build(2 * node, l, mid); build(2 * node + 1, mid + 1, r); tree[node] = tree[2 * node] + tree[2 * node + 1]; } void push_lazy(int node, int l, int r) { if (lazy[node] == 0) { return; } tree[node] = 0; if (l != r) { lazy[2 * node] = 1; lazy[2 * node + 1] = 1; } lazy[node] = 0; } void update(int node, int l, int r, int ql, int qr) { push_lazy(node, l, r); if (l > qr || r < ql) { return; } if (ql <= l && r <= qr) { lazy[node] = 1; push_lazy(node, l, r); return; } int mid = (l + r) / 2; update(2 * node, l, mid, ql, qr); update(2 * node + 1, mid + 1, r, ql, qr); tree[node] = tree[2 * node] + tree[2 * node + 1]; } int query(int node, int l, int r, int ql, int qr) { push_lazy(node, l, r); if (l > qr || r < ql) { return 0; } if (ql <= l && r <= qr) { return tree[node]; } int mid = (l + r) / 2; return query(2 * node, l, mid, ql, qr) + query(2 * node + 1, mid + 1, r, ql, qr); } int tree2[4 * maxn]; void build2(int node, int l, int r) { if (l == r) { tree2[node] = a[l]; return; } int mid = (l + r) / 2; build2(2 * node, l, mid); build2(2 * node + 1, mid + 1, r); tree2[node] = max(tree[2 * node], tree[2 * node + 1]); } int query2(int node, int l, int r, int ql, int qr) { if (l > qr || r < ql) { return -1; } if (ql <= l && r <= qr) { return tree2[node]; } int mid = (l + r) / 2; return max(query2(2 * node, l, mid, ql, qr), query2(2 * node + 1, mid + 1, r, ql, qr)); } int intervals[maxn]; int GetBestPosition(int N, int C, int R, int *K, int *S, int *E) { n = N; q = C; if (n == 1) { return 0; } my_rank = R + 1; for (int i = 0; i < n - 1; ++i) { a[i + 1] = K[i] + 1; } for (int i = 0; i < q; ++i) { queries[i + 1] = make_pair(S[i] + 1, E[i] + 1); } build(1, 1, n); build2(1, 1, n - 1); for (int i = 1; i <= q; ++i) { int ql, qr; int l = 1; int r = n; while (l <= r) { int mid = (l + r) / 2; if (query(1, 1, n, 1, mid) < queries[i].first) { l = mid + 1; } else { r = mid - 1; } } ql = l; l = 1; r = n; while (l <= r) { int mid = (l + r) / 2; if (query(1, 1, n, 1, mid) <= queries[i].second) { l = mid + 1; } else { r = mid - 1; } } qr = r; if (my_rank > query2(1, 1, n - 1, l, r - 1)) { ++intervals[l]; --intervals[r + 1]; } if (l < r) { update(1, 1, n, l + 1, r); } } int best = 0; for (int i = 1; i <= n; ++i) { intervals[i] += intervals[i - 1]; best = max(best, intervals[i]); } for (int i = 1; i <= n; ++i) { if (intervals[i] == best) { return i - 1; } } return -1; }

Compilation message (stderr)

tournament.cpp: In function 'int GetBestPosition(int, int, int, int*, int*, int*)':
tournament.cpp:159:13: warning: variable 'ql' set but not used [-Wunused-but-set-variable]
  159 |         int ql, qr;
      |             ^~
tournament.cpp:159:17: warning: variable 'qr' set but not used [-Wunused-but-set-variable]
  159 |         int ql, qr;
      |                 ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...