Submission #1328197

#TimeUsernameProblemLanguageResultExecution timeMemory
1328197wedonttalkanymoreGap (APIO16_gap)C++20
100 / 100
46 ms3212 KiB
#include <bits/stdc++.h>
#include "gap.h"
/*
    Chang ki si xuyen man dem
    Di lac vao trong giac mong
*/
using namespace std;
using ll = long long;

// #define int long long
#define pii pair<ll, ll>
#define fi first
#define se second

const ll inf = 1e18, mod = 1e9 + 7, block = 320, lim = 19;

pii blk[500005];

//static void my_assert(int k){ if (!k) exit(1); }
//
//static int subtask_num, N;
//static long long A[100001];
//static long long call_count;
//
//void MinMax(long long s, long long t, long long *mn, long long *mx)
//{
//	int lo = 1, hi = N, left = N+1, right = 0;
//	my_assert(s <= t && mn != NULL && mx != NULL);
//	while (lo <= hi){
//		int mid = (lo+hi)>>1;
//		if (A[mid] >= s) hi = mid - 1, left = mid;
//		else lo = mid + 1;
//	}
//	lo = 1, hi = N;
//	while (lo <= hi){
//		int mid = (lo+hi)>>1;
//		if (A[mid] <= t) lo = mid + 1, right = mid;
//		else hi = mid - 1;
//	}
//	if (left > right) *mn = *mx = -1;
//	else{
//		*mn = A[left];
//		*mx = A[right];
//	}
//	if (subtask_num == 1) call_count++;
//	else if (subtask_num == 2) call_count += right-left+2;
//}

ll findGap(int t, int n) {
    ll ans = 0;
    if (t == 1) {
        deque <ll> dq;
        int l = 1, r = n;
        ll curL = 0, curR = inf + 1;
        while(l <= r) {
            MinMax(curL + 1, curR - 1, &curL, &curR);
            l++; r--;
            dq.push_front(curL);
            dq.push_back(curR);
        }
        vector <ll> val;
        while(dq.size()) {
            val.push_back(dq.front());
            dq.pop_front();
        }
        sort(val.begin(), val.end());
        for (int i = 1; i < val.size(); i++) {
            ans = max(ans, val[i] - val[i - 1]);
        }
//        for (int i = 0; i < val.size(); i++) cout << val[i] << ' ';
    }
    else {
        ll curL = 1, curR = inf;
	    MinMax(curL, curR, &curL, &curR);
	    ll sz = max(1LL, (curR - curL + n - 2) / (n - 1)); 
	    
	    ll cur = 0;
	    for (ll i = curL + 1; i < curR; i += sz) {
	        cur++;
	        MinMax(i, min(curR - 1, i + sz - 1), &blk[cur].fi, &blk[cur].se);
	    }
	    ll last_val = curL;
	    for (int i = 1; i <= cur; i++) {
	        if (blk[i].fi == -1) continue;
	        ans = max(ans, blk[i].fi - last_val);	        
	        last_val = blk[i].se;
	    }
	    ans = max(ans, curR - last_val);
	}
	return ans;
}
//
//signed main() {
//    ios::sync_with_stdio(false);
//    cin.tie(0);
//    if (fopen(".inp", "r")) {
//        freopen(".inp", "r", stdin);
//        freopen(".out", "w", stdout);
//    }
//    int t;
//    cin >> t >> N;
//    for (int i = 1; i <= N; i++) cin >> A[i];
//    subtask_num = t;
//    cout << findGap(t, N);
//    return 0;
//}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...