Submission #442118

#TimeUsernameProblemLanguageResultExecution timeMemory
442118prvocisloAncient Books (IOI17_books)C++17
50 / 100
198 ms26940 KiB
#include "books.h"
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

const int maxn = 1e6 + 5;
vector<int> c(maxn, -1), L(maxn, maxn), R(maxn, -1);
void extend_for_free(int &l, int &r)
{
	int tl = min({l, L[c[l]], R[c[r]]}), tr = max({r, R[c[l]], R[c[r]]});
	while (tl < l || r < tr)
	{
		if (tl < l)
		{
			l--;
			tl = min(tl, L[c[l]]);
			tr = max(tr, R[c[l]]);
		}
		if (r < tr)
		{
			r++;
			tl = min(tl, L[c[r]]);
			tr = max(tr, R[c[r]]);
		}
	}
}
int calculate(int l, int r, int tl, int tr)
{
	int ans = 0;
	while (tl < l || r < tr)
	{
		extend_for_free(l, r);
		bool left = false, right = false;
		int cll = l, clr = r, crl = l, crr = r, costl = 0, costr = 0;
		while (tl < cll)
		{
			cll--, costl += 2;
			extend_for_free(cll, clr);
			if (clr > r) 
			{
				left = true; 
				break;
			}
		}
		while (tr > crr)
		{
			crr++, costr += 2;
			extend_for_free(crl, crr);
			if (crl < l) 
			{
				right = true; 
				break;
			}
		}
		if (left && right) ans += min(costl, costr);
		else ans += costl + costr;
		l = min(cll, crl), r = max(crl, crr);
	}
	return ans;
}
ll minimum_walk(vector<int> p, int s)
{
	int n = p.size(), num = -1, l = s, r = s;
	ll ans = 0;
	for (int i = 0; i < n; i++)
	{
		ans += abs(p[i] - i);
		if (c[i] != -1) continue;
		num++, L[num] = R[num] = i, c[i] = num;
		int j = p[i];
		while (j != i)
		{
			L[num] = min(L[num], j), R[num] = max(R[num], j), c[j] = num;
			j = p[j];
		}
		if (i != p[i]) l = min(l, L[num]), r = max(r, R[num]);
	}
	ans += calculate(s, s, l, r);
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...