Submission #48200

#TimeUsernameProblemLanguageResultExecution timeMemory
48200E869120Palembang Bridges (APIO15_bridge)C++14
100 / 100
1881 ms20308 KiB
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;

long long N, K, Q, A[100009], B[100009], sum;
vector<long long>Z; vector<long long>S;

long long calculate() {
	long long rem = 0;
	for (int i = 1; i <= Q; i++) {
		long long F = (1LL << 60);
		for (int j = 0; j < S.size(); j++) {
			if (A[i] <= S[j] && S[j] <= B[i]) F = 0;
			F = min(F, 2LL * min(abs(A[i] - S[j]), abs(B[i] - S[j])));
		}
		rem += F;
	}
	return sum + rem;
}

long long solve(long long pos) {
	long long rev = (1LL << 60); int i = pos;

	vector<pair<long long, long long>>vec; long long R = 0;
	for (int j = 1; j <= Q; j++) {
		if (A[j] > Z[i]) { R += 2; vec.push_back(make_pair(A[j], 2)); vec.push_back(make_pair(B[j], 2)); vec.push_back(make_pair(B[j] + A[j] - Z[i], -2)); }
	}
	sort(vec.begin(), vec.end());

	S = vector<long long>{ Z[i] };
	long long D = calculate(), J = -R, cx = Z[i]; rev = min(rev, D);
	for (int j = 0; j < vec.size(); j++) {
		rev = min(rev, D);
		D += J*(vec[j].first - cx);
		J += vec[j].second; cx = vec[j].first;
	}
	return rev;
}

int main() {
	cin >> K >> N;
	for (int i = 1; i <= N; i++) {
		char a1, b1; long long a2, b2;
		cin >> a1 >> a2 >> b1 >> b2;
		if (a1 == b1) sum += abs(a2 - b2);
		else {
			Q++; if (a2 > b2) swap(a2, b2);
			A[Q] = a2; B[Q] = b2;
			sum += (b2 - a2 + 1);
		}
	}
	for (int i = 1; i <= Q; i++) { Z.push_back(A[i]); Z.push_back(B[i]); }
	sort(Z.begin(), Z.end());
	if (Q == 0) {
		cout << sum << endl;
		return 0;
	}
	if (K == 1) {
		vector<long long>vec;
		for (int i = 1; i <= Q; i++) { vec.push_back(A[i]); vec.push_back(B[i]); }
		sort(vec.begin(), vec.end());
		
		S = vector<long long>{ vec[vec.size() / 2] };
		long long ans = calculate();
		cout << ans << endl;
	}
	if (K == 2) {
		long long ans = (1LL << 60);
		long long L = 0, R = Z.size(), C1, C2;

		for (int i = 0; i < 27; i++) {
			C1 = (L + L + R) / 3;
			C2 = (L + R + R) / 3;
			long long v1 = solve(C1);
			long long v2 = solve(C2);
			ans = min(ans, min(v1, v2));
			if (v1 > v2) { L = C1; }
			else { R = C2; }
		}
		for (int i = -3; i <= 3; i++) {
			if (C1 + i < 0 || C1 + i >= Z.size()) continue;
			ans = min(ans, solve(C1 + i));
		}
		cout << ans << endl;
	}
	return 0;
}

Compilation message (stderr)

bridge.cpp: In function 'long long int calculate()':
bridge.cpp:14:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = 0; j < S.size(); j++) {
                   ~~^~~~~~~~~~
bridge.cpp: In function 'long long int solve(long long int)':
bridge.cpp:34:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int j = 0; j < vec.size(); j++) {
                  ~~^~~~~~~~~~~~
bridge.cpp: In function 'int main()':
bridge.cpp:83:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if (C1 + i < 0 || C1 + i >= Z.size()) continue;
                      ~~~~~~~^~~~~~~~~~~
#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...