Submission #103881

#TimeUsernameProblemLanguageResultExecution timeMemory
103881E869120Palembang Bridges (APIO15_bridge)C++14
63 / 100
2037 ms16436 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 < 28; 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...