제출 #1308466

#제출 시각아이디문제언어결과실행 시간메모리
1308466minh30082008Bitaro's travel (JOI23_travel)C++20
100 / 100
330 ms61176 KiB
#include<bits/stdc++.h>
#define fi first
#define se second
#define FOR(i, k, n) for(int i = k; i <= n; i++)
#define FOR1(i, k, n) for(int i = k; i >= n; i--)
#define pb push_back
#define fastio ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define vi vector<int>
#define pii pair<int, int>
#define vii vector<pii>
#define ll long long
#define vll vector<ll>
#define pll pair<ll, ll>
#define re return 0
#define mii map<int, int>
#define input "ALONE.inp"
#define output "ALONE.out"
#define rf 	freopen(input, "r", stdin); freopen(output, "w", stdout)
#define int ll
using namespace std;
const int maxn = 2e5 + 5;
const int mod = 1e9 + 7;
const int base = 998244353;
const int base1 = 31;
const int SZ = 320;
const ll INF = 1e18;
void add(int &a, int b) 
{
	a += b; 
	if(a >= mod) a -= mod; 
	if(a < 0) a += mod; 
}
mt19937 rd(chrono::steady_clock::now().time_since_epoch().count());
int rand(int l, int r)
{
	return uniform_int_distribution<int>(l, r) (rd);
}
int a[maxn];
int leftid[maxn], rightid[maxn];
int maxr[20][maxn], minl[20][maxn];
int lg[maxn];
int get_minl(int l, int r)
{
	int k = lg[r - l + 1];
	return min(minl[k][l], minl[k][r - (1 << k) + 1]);
}
int get_maxr(int l, int r)
{
	int k = lg[r - l + 1];
	return max(maxr[k][l], maxr[k][r - (1 << k) + 1]);
}
signed main()
{
	fastio;
	int n;
	cin >> n;
	FOR(i, 1, n)
		cin >> a[i];
	sort(a + 1, a + 1 + n);
	a[0] = -2e9;
	a[n + 1] = 2e9;
	FOR(i, 1, n)
	{
		int d = a[i + 1] - a[i];
		int l = 1, r = i;
		while(l <= r)
		{
			int mid = (l + r) >> 1;
			if(a[i] - a[mid] <= d)
			{
				leftid[i] = mid;
				r = mid - 1;
			}
			else
				l = mid + 1;
		}
	}
	FOR(i, 1, n)
		lg[i] = __lg(i);
	FOR(i, 1, n)
	{
		int d = a[i] - a[i - 1];
		int l = i, r = n;
		while(l <= r)
		{
			int mid = (l + r) >> 1;
			if(a[mid] - a[i] < d)
			{
				rightid[i] = mid;
				l = mid + 1;
			}
			else
				r = mid - 1;
		}
	}
	FOR(i, 1, n)
	{
		minl[0][i] = leftid[i];
		maxr[0][i] = rightid[i];
	}
	FOR(j, 1, 18)
		FOR(i, 1, n - (1 << j) + 1)
		{
			minl[j][i] = min(minl[j - 1][i], minl[j - 1][i + (1 << (j - 1))]);
			maxr[j][i] = max(maxr[j - 1][i], maxr[j - 1][i + (1 << (j - 1))]);
		}
	int q;
	cin >> q;
	while(q--)
	{
		int x;
		cin >> x;
		if(x >= a[n])
		{
			cout << x - a[1] << "\n";
			continue;
		}
		if(x <= a[1])
		{
			cout << a[n] - x << "\n";
			continue;
		}
		int left = -1, right = -1;
		int l = 1, r = n;
		while(l <= r)
		{
			int mid = (l + r) >> 1;
			if(a[mid] <= x)
			{
				left = mid;
				l = mid + 1;
			}
			else
				r = mid - 1;
		}
		l = 1, r = n;
		while(l <= r)
		{
			int mid = (l + r) >> 1;
			if(a[mid] >= x)
			{
				right = mid;
				r = mid - 1;
			}
			else
				l = mid + 1;
		}
		ll ans = 0;
		int huong, toado;
		if(x - a[left] <= a[right] - x)
			ans = x - a[left], toado = a[left];
		else
			ans = a[right] - x, toado = a[right];
		while(a[right] == toado)
			right++;
		while(a[left] == toado)
			left--;
		if(toado - a[left] <= a[right] - toado)
			huong = 0;
		else
			huong = 1;
		while(left > 0 || right <= n)
		{
			if(huong == 0)
			{
				l = 1, r = left;
				int vt = 1;
				while(l <= r)
				{
					int mid = (l + r) >> 1;
					if(get_maxr(mid, left) >= right)
					{
						vt = mid;
						l = mid + 1;
					}
					else
						r = mid - 1;
				}
				ans += toado - a[vt];
				toado = a[vt];
				left = vt - 1;
				if(right <= n)
				{
					ans += a[right] - a[vt];
					toado = a[right];
				}
				huong = 1;
			}
			else
			{
				l = right, r = n;
				int vt = n;
				while(l <= r)
				{
					int mid = (l + r) >> 1;
					if(get_minl(right, mid) <= left)
					{
						vt = mid;
						r = mid - 1;
					}
					else
						l = mid + 1;
				}
				ans += a[vt] - toado;
				toado = a[vt];
				right = vt + 1;
				if(left > 0)
				{
					ans += a[vt] - a[left];
					toado = a[left];
				}
				huong = 0;
			}
		}
		cout << ans << "\n";
	}
	re;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...