Submission #103871

#TimeUsernameProblemLanguageResultExecution timeMemory
103871E869120Palembang Bridges (APIO15_bridge)C++14
22 / 100
515 ms16040 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[70000]; long long J = 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])); if (L[i] - E >= 0) { X.push_back(L[i] - E); Map[(L[i] - E) >> 14][(L[i] - E) & 16384] -= 2; } else J -= 2; if (R[i] + E <= 1000000000LL) { X.push_back(R[i] + E); Map[(R[i] + E) >> 14][(R[i] + E) & 16384] -= 2; } X.push_back(L[i]); Map[L[i] >> 10][L[i] & 1023] += 2; X.push_back(R[i]); Map[R[i] >> 10][R[i] & 1023] += 2; } } sort(X.begin(), X.end()); X.erase(unique(X.begin(), X.end()), X.end()); long long cx = 0LL, sum = 0, minx = (1LL << 60), dep = J; 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] >> 14][X[i] & 16384]; 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 cl = 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; }

Compilation message (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:58: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:86: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...