제출 #794810

#제출 시각아이디문제언어결과실행 시간메모리
794810fatemetmhr커다란 상품 (IOI17_prize)C++17
98.23 / 100
44 ms2980 KiB
// ~ Be Name Khoda ~ // #include "prize.h" #include <bits/stdc++.h> //#pragma GCC optimize ("O3") //#pragma GCC target("avx2") //#pragma GCC optimize("unroll-loops,Ofast") using namespace std; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); typedef long long ll; #define pb push_back #define mp make_pair #define all(x) x.begin(), x.end() #define fi first #define se second const int maxn = 1e6 + 10; const int maxn5 = 5e5 + 10; const int maxnt = 1.2e6 + 10; const int maxn3 = 1e3 + 10; const int mod = 1e9 + 7; const ll inf = 1e18; pair <int, int> ans[maxn5]; bool mark[maxn5]; int mx = 0, done = 0, dim = -1, cnt = 0, per[maxn5]; pair <int, int> assk(int id){ if(cnt > 10000) exit(0); if(!mark[id]){ vector <int> x = ask(id); cnt++; mark[id] = true; ans[id].fi = x[0]; ans[id].se = x[1]; } mx = max(mx, ans[id].fi + ans[id].se); if(ans[id].fi + ans[id].se == 0) dim = id; return ans[id]; } /* int check(int l, int r){ l = lower_bound(all(good), l) - good.begin(); r = lower_bound(all(good), r) - good.begin(); return r - l; } */ void solve(int l, int r, int x){ if(dim != -1 || x == 0 || r <= l) return; if(r - l <= 2 * x){ done += x; int found = 0; for(int i = l; i < r; i++) per[i] = i; shuffle(per + l, per + r, rng); for(int i = l; i < r && found < x; i++){ assk(per[i]); if(ans[per[i]].fi + ans[per[i]].se != mx) found++; if(dim != -1) return; } return; } /* int w = check(l, r); if(w != x){ cout << l << ' ' << r << ' ' << x << ' ' << w << ' ' << endl; exit(0); } */ int mid = (l + r) >> 1; int ptl = mid, ptr = mid + 1; mid = -1; int found = 0; //cout << "entering " << l << ' ' << r << ' ' << x << ' ' << cnt << ' ' << done << ' ' << dim << endl; while((ptl >= l || ptr < r) && found < x){ ////cout << "now " << ptl << ' ' << ptr << endl; if(ptl >= l){ assk(ptl); if(dim != -1) return; if(ans[ptl].fi + ans[ptl].se == mx){ ptr--; mid = ptl; break; } else found++; } if(found == x) break; if(ptr < r){ assk(ptr); if(dim != -1) return; if(ans[ptr].fi + ans[ptr].se == mx){ ptl = max(ptl, l); mid = ptr; break; } else found++; } if(ptl >= l) ptl--; if(ptr < r) ptr++; } //cout << "done with " << cnt << ' ' << done << ' ' << found << endl; //cout << "solving " << l << ' ' << r << ' ' << x << ' ' << found << ' ' << ptl << ' ' << ptr << ' ' << mid << ' ' << ans[mid].fi << endl; if(found == x){ done += found; for(int i = l; i < r; i++) if(mark[i] && ans[i].fi + ans[i].se == 0) dim = i; return; } //if(mid == -1){ // cout << l << ' ' << r << ' ' << x << ' ' << found << ' ' << done << ' ' << ptl << ' ' << ptr << endl; //} assert(mid != -1); int keep = 0, keepdone = done; if(ptl > l){ int lef = ans[mid].fi - done; for(int i = ptl; i < mid; i++) if(mark[i] && ans[i].fi + ans[i].se != mx) lef--; keep = lef; solve(l, ptl, lef); if(dim != -1) return; } if(ptr + 1 < r){ int rig = x - keep; for(int i = ptl; i <= min(r - 1, ptr); i++) if(mark[i] && ans[i].fi + ans[i].se != mx){ rig--; done++; } //if(rig < 0){ // cout << "WAAA " << rig << ' ' << l << ' ' << r << ' ' << ptl << ' ' << mid << ' ' << ptr << ' ' << x << ' ' << keep << ' ' << keepdone << ' ' << ans[mid].fi << endl; //} //cout << "in " << rig << endl; solve(ptr + 1, r, rig); } } int find_best(int n){ //* int tt = 450; while(tt--) assk(rng() % n); //*/ //mx = 1; if(dim != -1) return dim; solve(0, n, mx); //assert(dim != -1); //cout << cnt << endl; return dim; }

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

prize.cpp: In function 'void solve(int, int, int)':
prize.cpp:135:16: warning: unused variable 'keepdone' [-Wunused-variable]
  135 |  int keep = 0, keepdone = done;
      |                ^~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...