Submission #619334

#TimeUsernameProblemLanguageResultExecution timeMemory
619334Sergio_2357The Big Prize (IOI17_prize)C++17
20 / 100
225 ms2456 KiB
#include "prize.h" #include <bits/stdc++.h> using namespace std; typedef vector<int> vi; struct SegTree { int n; vi v; void update(int i, int val) { int p = i + n; v[p] = val; while (p /= 2) v[p] = v[2 * p] + v[2 * p + 1]; } int query(int i, int l, int h, int ql, int qh) { if (h <= ql || qh <= l) return 0; if (l <= ql && qh <= h) return v[i]; int m = (h - l) / 2 + l; return query(2 * i, l, m, ql, qh) + query(2 * i + 1, m, h, ql, qh); } int query(int l, int h) { return query(1, 0, n, l, h); } SegTree() { } SegTree(int sz) { n = 1; while (n < sz) n *= 2; v = vi(2 * n + 1, 0); } }; int n; SegTree st; set<int> nl; map<int, vi> qr; int llc = 0; int res = -1; vi ask2(int i) { //cout << i << endl; if (qr.count(i)) return qr[i]; qr[i] = ask(i); return qr[i]; } int cask(int i) { int p1, p2; p1 = p2 = i; while (nl.count(p1)) p1--; while (nl.count(p2)) p2++; if (p1 < 0) i = p2; else if (p2 >= n) i = p1; else if (abs(i - p1) < abs(i - p2)) i = p1; else i = p2; auto p = ask2(i); if (p[0] + p[1] == 0) res = i; if (p[0] + p[1] < llc) { nl.insert(i); st.update(i, 1); return 2; } int l = p[0] - st.query(0, i); int r = p[1] - st.query(i, n); return l < r; } int find_best(int n_) { n = n_; st = SegTree(n + 1); for (int i = 0; i < min(n, 500); i++) { auto p = ask2(i); llc = max(llc, p[0] + p[1]); //if (p[0] + p[1] == 0) // return i; } int marp = 100000; while (res == -1 && marp--) { int l = 0; int h = n - 1; bool found = false; int ps = nl.size(); while (l < h - 4) { int m = (h - l) / 2 + l; int r = cask(m); if (r == 2) { if (nl.size() == ps) res = -2; found = true; break; } if (r) l = m - 1; else h = m + 1; } if (!found) for (int i = l; i <= h; i++) cask(i); //if (nl.size() == ps) // res = -2; } return res; }

Compilation message (stderr)

prize.cpp: In function 'int find_best(int)':
prize.cpp:106:31: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  106 |                 if (nl.size() == ps)
      |                     ~~~~~~~~~~^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...