This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "prize.h"
#include <bits/stdc++.h>
using namespace std;
#define REP(a,b,c) for(int a=int(b); a<int(c); a++)
#define REV(a,b,c) for(int a=int(c-1); a>=int(b); a--)
#define RE(a,b) REP(a,0,b)
#define FOR(a,b) for(auto& a:b)
#define pb push_back
#define fi first
#define se second
#define all(a) a.begin(), a.end()
typedef long long ll;
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef vector<ii> vii;
const int INF=1e9;
const int MX=1e5;
map<int, vi> mem;
map<int, map<int, set<int>>> bst;
vi Ask(int i) {
if(mem.count(i)) return mem[i];
vi ret = ask(i);
return mem[i] = ret;
}
int find_best(int n) {
int sq = ceil(sqrt(n))+2;
int mn = min(sq*2+2, n);
int sm = 0;
RE(i,mn) {
vi res = Ask(i);
sm = max(sm, res[0]+res[1]);
}
vi g; g.assign(n,-1);
vi J;
RE(i,n) J.pb(i);
RE(i,sm) {
if(g[i] != -1) continue;
int lb=0, ub=n-1;
if(i) lb=g[i-1]+1;
while(lb != ub) {
int mid=(lb+ub+1)/2;
vi res = Ask(mid);
if(res[0] + res[1] == sm) {
if(res[0] > i) ub=mid-1;
else lb=mid+1;
if(lb == ub) g[i] = lb;
} else {
int j = J[mid];
vi update;
while(1) {
res = Ask(j);
if(res[0] + res[1] == sm) {
if(res[0] == i) {
lb = ub = j+1;
}
break;
}
update.pb(j);
if(j == 0) {
lb = ub = 0;
break;
}
j = J[j-1];
}
FOR(k,update) J[k] = j;
if(lb == ub) {
REP(k,lb,mid+1) {
g[i+k-lb] = k;
}
if(mid == n-1) break;
res = Ask(++mid);
while(res[0]+res[1] != sm) {
g[i+mid-lb] = mid;
if(mid == n-1) break;
res = Ask(++mid);
}
} else {
res = Ask(j);
if(res[0] > i) ub=j-1;
else lb=mid+1;
if(lb == ub) g[i] = lb;
}
}
}
}
RE(i,sm) {
vi res = Ask(g[i]);
if(res[0]+res[1] == 0) return g[i];
}
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |