제출 #260397

#제출 시각아이디문제언어결과실행 시간메모리
260397aggu_01000101커다란 상품 (IOI17_prize)C++14
0 / 100
6 ms2804 KiB
#include <iostream> #include <assert.h> #include "prize.h" #include <algorithm> #include <vector> #include <set> #include <string> #include <queue> #include <map> #include <bits/stdc++.h> #define initrand mt19937 mt_rand(time(0)); #define rand mt_rand() //#define int long long #define INF 10000000000000000 #define MOD 1000000007 using namespace std; initrand; /*vector<int> ask(int x){ cout<<"QUERY AT "<<x<<endl; vector<int> tr = {0, 0}; cin>>tr[0]>>tr[1]; return tr; }*/ int get(int l, int r){ return (((rand%(r-l+1))) + l); } signed find_best(signed n){ vector<int> v; for(int i =1 ;i<=n;i++) v.push_back(i); bool found = false; map<int, int> first; map<int, int> last; int ans = -1; int q = 0; while(!found){ int tq = get(0, v.size() - 1); signed ta = v[tq]; //we will ask this vector<int> qq = ask(ta-1); q++; assert(q<=10000); if(qq[0] == qq[1] && qq[1]==0){ ans = ta; found = true; continue; } if(first[qq[0]] != 0){ auto it = upper_bound(v.begin(), v.end(), first[qq[0]]); auto it1 = lower_bound(v.begin(), v.end(), ta); v.erase(it, it1); first[qq[0]] = min(first[qq[0]], ta); } else first[qq[0]] = ta; if(last[qq[1]] != 0){ auto it = lower_bound(v.begin(), v.end(), ta); auto it1 = lower_bound(v.begin(), v.end(), last[qq[1]]); v.erase(it, it1); last[qq[1]] = max(last[qq[1]], ta); } else last[qq[1]] = ta; auto it = lower_bound(v.begin(), v.end(), ta); while((*it) == ta) { //cout << "We should be erasing " << (*it) << endl; v.erase(it); it = lower_bound(v.begin(), v.end(), ta); } /*cout<<"Remaining array: "<<endl; for(int j: v){ cout<<j<<" "; } cout<<endl;*/ } return (ans-1); } /*signed main(){ signed n; cin>>n; int ans = find_best(n); cout<<"Final answer: "<<ans<<endl; }*/ /* 11 12 0 1 3 0 2 4 2 3 5 3 4 4 4 5 6 0 6 3 6 7 2 6 8 5 8 9 6 8 10 7 */ /* 3 3 0 1 1 1 2 1 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...