Submission #1053136

#TimeUsernameProblemLanguageResultExecution timeMemory
1053136abczzAncient Books (IOI17_books)C++17
100 / 100
89 ms25280 KiB
#include "books.h"
#include <iostream>
#define ll long long

using namespace std;

bool ok = 0;
vector <ll> p;
ll n, l, r, x, y, qx, qy, ql, qr, a, b, f = 0, mn = 0, mx = 0;
void branch() {
	while (true) {
		for	(int i=x; i>=qx; --i) {
			qx = min(qx, p[i]);
			qy = max(qy, p[i]);
		}
		for (int i=y; i<=qy; ++i) {
			qx = min(qx, p[i]);
			qy = max(qy, p[i]);
		}
		if (x == qx && y == qy) break;
		x = qx, y = qy;
	}
}
long long minimum_walk(std::vector<int> A, int s) {
	for (auto u : A) p.push_back(u);
	n = p.size();
	for (int i=0; i<n; ++i) {
		f += abs(i-p[i]);
	}
	l = n, r = -1;
	for (int i=0; i<n; ++i) {
		if (p[i] != i) {
			l = i;
			break;
		}
	}
	for (int i=n-1; i>=0; --i) {
		if (p[i] != i) {
			r = i;
			break;
		}
	}
	if (l == n) return 0;
	x = y = qx = qy = s;
	branch();
	while (true) {
		ok = a = b = 0;
		mn = 1e18, mx = -1e18;
		for (int i=x-1; i>=l; --i) {
			qx = i;
			mn = min(mn, (ll)p[i]);
			if (p[i] > y) {
				a += 2;
				ok = 1;
				break;
			}
			if (mn == i) a += 2;
		}
		for (int i=y+1; i<=r; ++i) {
			qy = i;
			mx = max(mx, (ll)p[i]);
			if (p[i] < x) {
				b += 2;
				break;
			}
			if (mx == i) b += 2;
		}
		if (!ok) {
			f += a + b;
			break;
		}
		else {
			f += min(a, b);
			branch();
		}
	}
	return f;
}

Compilation message (stderr)

books.cpp: In function 'long long int minimum_walk(std::vector<int>, int)':
books.cpp:47:10: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   47 |   ok = a = b = 0;
      |        ~~^~~~~~~
#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...