Submission #1357893

#TimeUsernameProblemLanguageResultExecution timeMemory
1357893altern23The Big Prize (IOI17_prize)C++20
0 / 100
31 ms21380 KiB
#include "prize.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long

ll N;

vector <vector<int>> dp(200005, {-1, -1});

ll sum(ll idx) {
      if (dp[idx][0] == -1) dp[idx] = ask(idx);
      return dp[idx][0]+dp[idx][1]; 
}

map<ll, pair<ll, ll>> mp[200005];

ll dnc(ll l, ll r) {
      if (l > r) return -1;
      ll mid = (l+r)/2;
      if (!sum(mid)) return mid;
      auto it = mp[sum(mid)].upper_bound(mid);
      bool lf = 1, rg = 1;
      if (it != mp[sum(mid)].begin()) {
            --it;
            if (!((*it).second.second-dp[mid][0])) {
                  lf = 0;
            }
            ++it;
      }
      if (it != mp[sum(mid)].end()) {
            if (!((*it).second.second-dp[mid][0])) {
                  rg = 0;
            }
      }
      mp[sum(mid)][mid] = {dp[mid][0], dp[mid][1]};
      ll ret = -1;
      if (lf) ret = max(ret, dnc(l, mid-1));
      if (rg) ret = max(ret, dnc(mid+1, r));
      return ret;
}

int find_best(int n) {
      N = n;
      return dnc(0, N-1);      
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...