Submission #950046

#TimeUsernameProblemLanguageResultExecution timeMemory
950046quanlt206Gap (APIO16_gap)C++17
33.27 / 100
77 ms15920 KiB
#include "gap.h" #include<bits/stdc++.h> #define X first #define Y second #define all(x) begin(x), end(x) #define FOR(i, a, b) for(int i = (a); i <= (b); i++) #define FORD(i, b, a) for(int i = (b); i >= (a); i--) #define REP(i, a, b) for (int i = (a); i < (b); i++) #define mxx max_element #define mnn min_element #define SQR(x) (1LL * (x) * (x)) #define MASK(i) (1LL << (i)) #define Point Vector #define left Left #define right Right #define div Div using namespace std; typedef long long ll; typedef unsigned long long ull; typedef double db; typedef long double ld; typedef pair<db, db> pdb; typedef pair<ld, ld> pld; typedef pair<int, int> pii; typedef pair<int, pii> piii; typedef pair<ll, ll> pll; typedef pair<ll, pll> plll; typedef pair<ll, int> pli; typedef pair<ll, pii> plii; template<class A, class B> bool maximize(A& x, B y) { if (x < y) return x = y, true; else return false; } template<class A, class B> bool minimize(A& x, B y) { if (x > y) return x = y, true; else return false; } /* END OF TEMPLATE */ const int N = 1e5 + 7; ll a[N], b[N]; int n; int cntQuery = 0; ll sub1(int n) { int l = 1, r = n; ll s = 0, t = 1e18; while (l <= r) { ll* mn = new ll(); ll* mx = new ll(); MinMax(s, t, mn, mx); a[l] = *mn; a[r] = *mx; l++; r--; s = *mn + 1; t = *mx - 1; } ll res = 0; REP(i, 1, n) maximize(res, a[i + 1] - a[i]); return res; } ll findGap(int T, int n) { if (T == 1 || n <= 7) return sub1(n); a[0] = -1; ll res = 0; int i = 1; ll* mn = new ll(); ll* mx = new ll(); MinMax(0, 1e18, mn, mx); ll Max = *mx; while (i <= n) { if (a[i - 1] == Max) break; // cout<<i<<" "<<cntQuery<<"\n"; // cerr<<i<<" "<<a[i]<<endl; // check a[i - 1] + 1 == a[i] ll* mn = new ll(); ll* mx = new ll(); MinMax(a[i - 1] + 1, a[i - 1] + 1, mn, mx); if (*mn != -1) { a[i] = a[i - 1] + 1; maximize(res, 1); i++; continue; } ll last = a[i - 1]; if (res > 0) { // check a[i - 1] + res >= a[i] ll *mn = new ll(); ll *mx = new ll(); MinMax(last, last + res, mn, mx); // cout<<i<<" "<<last<<" "<<last + res<<" "<<*mx<<"\n"; if (*mx > last) { a[i] = *mx; if (i > 1) maximize(res, a[i] - a[i - 1]); i++; continue; } } ll v = 0; FORD(i, 60, 0) { ll *mn = new ll(); ll *mx = new ll(); MinMax(last + 1, last + v + MASK(i), mn, mx); if (*mn == -1) v+=MASK(i); } a[i] = last + v + 1; if (i > 1) maximize(res, a[i] - a[i - 1]); i++; } return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...