Submission #1363546

#TimeUsernameProblemLanguageResultExecution timeMemory
1363546c12Gap (APIO16_gap)C++17
30 / 100
33 ms2556 KiB
#include<bits/stdc++.h>

using namespace std;

#include "gap.h"



// 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;

// long long findGap(int, int);

// 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;
// }

// int main()
// {
// 	FILE *in = stdin, *out = stdout;
// 	my_assert(2 == fscanf(in, "%d%d", &subtask_num, &N));
// 	my_assert(1 <= subtask_num && subtask_num <= 2);
// 	my_assert(2 <= N && N <= 100000);
// 	for (int i=1;i<=N;i++) my_assert(1 == fscanf(in, "%lld", A+i));
// 	for (int i=1;i<N;i++) my_assert(A[i] < A[i+1]);

// 	fprintf(out, "%lld\n", findGap(subtask_num, N));
// 	fprintf(out, "%lld\n", call_count);

// 	return 0;
// }

long long findGap(int T, int N)
{
	#define ll long long
	if(T == 1){
		vector<ll>vec(N);

		ll s = 0;
		ll t = LLONG_MAX;
		for(int i = 0;i < N/2;i++){
			ll mn,mx;

			MinMax(s,t,&mn,&mx);
			vec[i] = mn;
			vec[N-i-1] = mx;
			
			s = mn+1;
			t = mx-1;
		}
		if(N & 1){
			ll mn,mx;

			MinMax(s,t,&mn,&mx);

			vec[N/2] = mn;
		}

		// for(int i = 0;i < N;i++) cout << vec[i] << ' ';
		// cout << '\n';

		ll mn = 0;
		for(int i = 0;i < N-1;i++){
			mn = max(mn,vec[i+1] - vec[i]);
		}
		return mn;
	}
	else{
		vector<int>vec(N);
		int s = 0;
		for(int i = 0;i < N;i++){
			ll mn,mx;

			MinMax(s,s+1,&mn,&mx);
			if(mn < s) swap(mn,mx);
			
			cout << mn << ' ' << mx << '\n';
			vec[i] = mn;
			
			s = mn + 1;
		}

		int mn = 0;
		for(int i = 0;i < N-1;i++){
			mn = min(mn,vec[i+1] - vec[i]);
		}
		return mn;
	}
	return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...