Submission #103883

#TimeUsernameProblemLanguageResultExecution timeMemory
103883E869120Palembang Bridges (APIO15_bridge)C++14
100 / 100
1986 ms18520 KiB
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
#pragma warning (disable: 4996)

long long K, N, M, L[100009], R[100009], cnt;

long long solve_1() {
	vector<long long>X; map<long long, long long>Map;
	for (int i = 0; i < M; i++) {
		X.push_back(L[i]);
		X.push_back(R[i]);
		Map[L[i]] += 2; Map[R[i]] += 2;
	}
	sort(X.begin(), X.end());
	X.erase(unique(X.begin(), X.end()), X.end());

	long long cx = 0, sum = 0, minx = (1LL << 60), dep = -M * 2;
	for (int i = 0; i < M; i++) sum += L[i] + R[i];
	minx = min(minx, sum);

	for (int i = 0; i < X.size(); i++) {
		sum += (X[i] - cx) * dep;
		minx = min(minx, sum);
		dep += Map[X[i]];
		cx = X[i];
	}
	return minx;
}

long long D[1 << 20], vals[1 << 20], size_;
long long Y[1 << 20]; pair<int, int> X[1 << 20];

long long solve_val(long long val) {
	int sz = 0;
	for (int i = 0; i < M; i++) {
		if (val < L[i] || R[i] < val) {
			long long E = min(abs(L[i] - val), abs(val - R[i]));
			Y[sz] = (L[i] - E) * 2; sz++;
			Y[sz] = (R[i] + E) * 2; sz++;
			Y[sz] = L[i] * 2 + 1; sz++;
			Y[sz] = R[i] * 2 + 1; sz++;
		}
	}
	sort(Y, Y + sz);
	for (int i = 0; i < sz; i++) {
		if (Y[i] % 2 == 0) {
			X[i].first = (long long)(Y[i] >> 1);
			X[i].second = -2;
		}
		else {
			X[i].first = (long long)((Y[i] - 1) >> 1);
			X[i].second = 2;
		}
	}

	size_ = 0; vals[0] = 0;
	for (int i = 0; i < sz; i++) {
		D[size_] = X[i].first;
		vals[size_] += X[i].second;
		if (i == sz - 1 || X[i].first != X[i + 1].first) { size_++; vals[size_] = 0; }
	}

	long long cx = -2000000000LL, sum = 0, minx = (1LL << 60), dep = 0;
	for (int i = 0; i < M; i++) sum += abs(L[i] - val) + abs(R[i] - val);
	minx = min(minx, sum);

	for (int i = 0; i < size_; i++) {
		sum += (D[i] - cx) * dep;
		minx = min(minx, sum);
		dep += vals[i];
		cx = D[i];
	}
	return minx;
}

long long solve_2() {
	long long ans = solve_1();

	vector<long long>XX;
	for (int i = 0; i < N; i++) XX.push_back(L[i]);
	for (int i = 0; i < N; i++) XX.push_back(R[i]);
	sort(XX.begin(), XX.end());

	int cl = 0, cr = XX.size(), c1, c2;
	for (int i = 0; i < 27; i++) {
		c1 = (cl + cl + cr) / 3;
		c2 = (cl + cr + cr) / 3;
		long long J1 = solve_val(XX[c1]);
		long long J2 = solve_val(XX[c2]);
		ans = min({ ans, J1, J2 });
		if (J1 < J2) cr = c2;
		else cl = c1;
	}
	for (int i = cl; i <= c1 + 1; i++) {
		if (i < 0 || i >= XX.size()) continue;
		long long J1 = solve_val(XX[i]);
		ans = min(ans, J1);
	}
	return ans;
}

int main() {
	cin >> K >> N;
	for (int i = 0; i < N; i++) {
		char c1, c2; int cl, cr;
		cin >> c1 >> cl >> c2 >> cr;
		if (c1 != c2) {
			if (cl > cr) swap(cl, cr);
			L[M] = cl;
			R[M] = cr;
			cnt++; M++;
		}
		else cnt += 1LL * abs(cl - cr);
	}

	if (K == 1) {
		cout << solve_1() + cnt << endl;
	}
	if (K == 2) {
		cout << solve_2() + cnt << endl;
	}
	return 0;
}

Compilation message (stderr)

bridge.cpp:6:0: warning: ignoring #pragma warning  [-Wunknown-pragmas]
 #pragma warning (disable: 4996)
 
bridge.cpp: In function 'long long int solve_1()':
bridge.cpp:24:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < X.size(); i++) {
                  ~~^~~~~~~~~~
bridge.cpp: In function 'long long int solve_2()':
bridge.cpp:98:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (i < 0 || i >= XX.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...