제출 #593041

#제출 시각아이디문제언어결과실행 시간메모리
593041Tekor커다란 상품 (IOI17_prize)C++17
20 / 100
87 ms5276 KiB
#include "prize.h" #include <bits/stdc++.h> using namespace std; #define pii pair <int,int> #define mp make_pair #define f first #define s second #define pb push_back #define en '\n' const int N = 2e5 + 10; int k,mx,kol; vector <int> was[N]; bool u[N]; vector <pii> q; /* 8 3 2 3 1 3 3 2 3 */ vector <int> Ask(int x) { if(u[x])return was[x]; u[x] = 1; was[x] = ask(x); return was[x]; } int fin(int L,int R) { if(L > R)return -1; int l = L,r = R; int mid = (l + r) / 2; //cout << l << " " << r << " " << mid << endl; kol++; assert(kol <= 10000); vector <int> resp = Ask(mid); if(resp[0] + resp[1] == 0)return mid; if(resp[0] + resp[1] != mx)q.pb(mp(mid,resp[0] + resp[1])); int x = resp[0]; for(auto to : q) { if(to.f < mid && to.s > resp[0] + resp[1])x--; } if(x != 0) { int val = fin(L,mid - 1); if(val != -1)return val; } int y = resp[1]; for(auto to : q) { if(to.f > mid && to.s > resp[0] + resp[1])y++; } if(y != 0) { int val = fin(mid + 1,R); return val; } return -1; } int find_best(int pp) { k = pp; int m = (k - 1) / 2; for(int i = 0;i < min(500,k);i++) { vector <int> rep = ask(i); mx = max(mx,rep[0] + rep[1]); } // mx = 3; //cout << k << " "; //cout << m << endl; kol++; vector <int> tt = Ask(m); if(tt[0] + tt[1] != mx)q.pb(mp(m,tt[0] + tt[1])); if(tt[0] + tt[1] == 0)return m; if(tt[0] != 0) { int val = fin(0,m - 1); if(val != -1)return val; } return fin(m + 1,k - 1); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...