제출 #103865

#제출 시각아이디문제언어결과실행 시간메모리
103865E869120Palembang Bridges (APIO15_bridge)C++14
22 / 100
380 ms16104 KiB
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

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 solve_val(long long val) {
	vector<long long>X; map<long long, long long>Map;
	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]));
			X.push_back(L[i] - E); Map[L[i] - E] -= 2;
			X.push_back(R[i] + E); Map[R[i] + E] -= 2;
			X.push_back(L[i]); Map[L[i]] += 2;
			X.push_back(R[i]); Map[R[i]] += 2;
		}
	}
	sort(X.begin(), X.end());
	X.erase(unique(X.begin(), X.end()), X.end());

	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 < X.size(); i++) {
		sum += (X[i] - cx) * dep;
		minx = min(minx, sum);
		dep += Map[X[i]];
		cx = X[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 < 29; 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 c1 = c1;
	}
	for (int i = cl - 1; i <= c1 + 2; 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;
}

컴파일 시 표준 에러 (stderr) 메시지

bridge.cpp: In function 'long long int solve_1()':
bridge.cpp:23: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_val(long long int)':
bridge.cpp:50: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:78: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...