제출 #162265

#제출 시각아이디문제언어결과실행 시간메모리
162265rama_pangPalembang Bridges (APIO15_bridge)C++14
22 / 100
75 ms5012 KiB
#include <bits/stdc++.h>
using namespace std;
using lint = long long;

lint K, N;
lint ans;
vector<pair<lint, lint>> A;

lint solve_1() {
    vector<lint> points;

    for (int i = 0; i < N; i++) {
        points.emplace_back(A[i].first);
        points.emplace_back(A[i].second);
    }

    sort(points.begin(), points.end());

    lint res = 0;

    for (int i = 0; i < N; i++) 
        res -= points[i];
    
    for (int i = N; i < N + N; i++)
        res += points[i];
    
    return res;
}

lint solve_2() {
    auto get = [&](lint B1, lint B2) {
        lint res = 0;
        for (lint i = 0; i < N; i++) {
            res += min(labs(B1 - A[i].first) + labs(B1 - A[i].second), 
                       labs(B2 - A[i].first) + labs(B2 - A[i].second));
        }

        return (lint)res;
    };

    lint res = INT64_MAX;
    vector<lint> points;

    for (int i = 0; i < N; i++) 
        points.emplace_back(A[i].first), 
        points.emplace_back(A[i].second);
    
    sort(points.begin(), points.end());

    for (lint i = 0; i < points.size(); i++) {
        lint le = i, ri = points.size() - 1;
        for (lint j = le; j <= ri; j++) {
            res = min(res, get(points[i], points[j]));
        }

        // while (le <= ri) {
        //     lint mid = (le + ri) / 2;
        //     if (mid + 1 >= N) {
        //         ri--;
        //         continue;
        //     } else if (mid < 0) {
        //         le++;
        //         continue;
        //     } else {
        //         lint l = get(points[i], points[mid]), r = get(points[i], points[mid + 1]);
        //         res = min(res, l), res = min(res, r);
        //         if (l < r) {
        //             ri = mid;
        //         } else {
        //             le = mid + 1;
        //         }
        //     }
        // }
        
    }

    return res;
}

lint solve() {
    sort(A.begin(), A.end());
    N = A.size();

    if (K == 1)
        return N + solve_1();
    else
        return N + solve_2();
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> K >> N;

    for (int i = 0; i < N; i++) {
        char Z1, Z2;
        lint B1, B2;

        cin >> Z1 >> B1 >> Z2 >> B2;
        if (B1 > B2) swap(B1, B2);

        if (Z1 == Z2)
            ans += B2 - B1;
        else
            A.emplace_back(B1, B2);
    }

    ans += solve();

    cout << ans << "\n";

    return 0;
}

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

bridge.cpp: In function 'lint solve_2()':
bridge.cpp:50:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (lint i = 0; i < points.size(); i++) {
                      ~~^~~~~~~~~~~~~~~
#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...