제출 #48200

#제출 시각아이디문제언어결과실행 시간메모리
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; }

컴파일 시 표준 에러 (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...