Submission #439942

#TimeUsernameProblemLanguageResultExecution timeMemory
439942prvocisloJousting tournament (IOI12_tournament)C++17
100 / 100
203 ms15504 KiB
#include <bits/stdc++.h> typedef long long ll; using namespace std; #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; #define ordered_set tree<pair<int, int>, null_type,less<pair<int, int>>, rb_tree_tag,tree_order_statistics_node_update> struct node { int d, l, r, maxi, maxlast, i; node(int D = -1, int L = -1, int R = -1, int MAXI = -1, int MAXLAST = -1, int I = -1): d(D), l(L), r(R), maxi(MAXI), maxlast(MAXLAST), i(I) {} }; void upd(node &a, const node &b) { if (b.d > a.d || (a.d == b.d && b.i < a.i)) a.d = b.d, a.i = b.i; } int GetBestPosition(int n, int m, int nw, int *k, int *l, int *r) { ordered_set s; vector<node> v; for (int i = 0; i < n - 1; i++) v.push_back(node(0, i, i, k[i], 0, i)), s.insert({i, i}); node best; best.i = 0; for (int i = 0; i < m; i++) { node now; int len = r[i] - l[i] + 1; for (int j = 0; j < len; j++) { auto it = s.find_by_order(l[i]); node nj = v[it->second]; now.maxi = max(now.maxi, nj.maxi); if (j == 0) now.l = nj.l; if (j == len-1) now.r = nj.r, now.maxlast = max(now.maxlast, nj.maxlast); else now.maxlast = max(now.maxlast, nj.maxi); upd(now, nj); s.erase(it); } now.d++; if (now.maxlast < nw) upd(best, now); v.push_back(now); s.insert({now.l, v.size() - 1}); } return best.i; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...