제출 #1067386

#제출 시각아이디문제언어결과실행 시간메모리
1067386Ignut커다란 상품 (IOI17_prize)C++17
20 / 100
3093 ms16024 KiB
// Ignut #include <bits/stdc++.h> using namespace std; using ll = long long; vector<int> ask(int i); int Q = 0; struct SegmentTree { vector<int> t; void Init(int n) { t.assign(4 * n, 0); } void Add(int v, int l, int r, int pos) { t[v] ++; if (l == r) return; int mid = l + (r - l) / 2; if (pos <= mid) Add(v * 2, l, mid, pos); else Add(v * 2 + 1, mid + 1, r, pos); } int Sum(int v, int l, int r, int ql, int qr) { if (l > qr || ql > r) return 0; if (l >= ql && r <= qr) return t[v]; int mid = l + (r - l) / 2; return Sum(v * 2, l, mid, ql, qr) + Sum(v * 2 + 1, mid + 1, r, ql, qr); } }; int n; map<int, SegmentTree> mp; void Inc(int lvl, int pos) { if (!mp.count(lvl)) { mp[lvl].Init(n); } mp[lvl].Add(1, 0, n - 1, pos); } int Get(int lvl, int l, int r) { if (!mp.count(lvl)) return 0; return mp[lvl].Sum(1, 0, n - 1, l, r); } int find_best(int nn) { n = nn; int L = -1; while (L < n - 1) { int lo = L + 1, hi = n - 1; while (lo < hi) { int mid = lo + (hi - lo) / 2; Q ++; if (Q == 10000) { Q /= 0; } vector<int> vec = ask(mid); if (vec[0] + vec[1] == 0) return mid; int lvl = vec[0] + vec[1]; int comp = 0; for (auto [a, b] : mp) if (a < lvl) comp += Get(a, 0, mid - 1); Inc(lvl, mid); if (vec[0] > comp) hi = mid - 1; else { lo = mid + 1; } } // cout << "lo = " << lo << '\n'; Q ++; if (Q == 10000) { Q /= 0; } vector<int> vec = ask(lo); if (vec[0] + vec[1] == 0) return lo; int lvl = vec[0] + vec[1]; Inc(lvl, lo); L = lo; } return n - 1; } /* 8 3 2 3 1 3 3 2 3 */

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

prize.cpp: In function 'int find_best(int)':
prize.cpp:60:7: warning: division by zero [-Wdiv-by-zero]
   60 |     Q /= 0;
      |     ~~^~~~
prize.cpp:78:6: warning: division by zero [-Wdiv-by-zero]
   78 |    Q /= 0;
      |    ~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...