제출 #110954

#제출 시각아이디문제언어결과실행 시간메모리
110954PeppaPigPalembang Bridges (APIO15_bridge)C++14
100 / 100
104 ms8060 KiB
#include <bits/stdc++.h>

#define long long long
#define pii pair<int, int>
#define x first
#define y second

using namespace std;

const int N = 1e5+5;

long suml, sumr;
priority_queue<long> L;
priority_queue<long, vector<long>, greater<long> > R;

void add(long x) {
    if(L.empty() || x <= L.top()) {
        L.emplace(x), suml += x;
        int now = L.size() + R.size();
        if(L.size() > (now + 1) / 2) {
            long t = L.top(); L.pop();
            suml -= t;
            R.emplace(t), sumr += t;
        } 
    } else {
        R.emplace(x), sumr += x;
        int now = L.size() + R.size();
        if(R.size() > (now + 1) / 2) {
            long t = R.top(); R.pop();
            sumr -= t;
            L.emplace(t), suml += t;
        } 
    }
}

int k, n;
long ans, dpl[N], dpr[N];
vector<pii> v;

int main() {
    scanf("%d %d", &k, &n);
    for(int i = 1; i <= n; i++) {
        char a, c; int b, d;
        scanf(" %c %d %c %d", &a, &b, &c, &d);
        if(b > d)  swap(b, d);
        if(a == c) ans += d - b;
        else v.emplace_back(b, d);
    }
    n = v.size(), ans += n;
    if(!v.empty()) {
        sort(v.begin(), v.end(), [&](const pii &a, const pii &b) {
            return a.x + a.y < b.x + b.y;
        });
        for(int i = 1; i <= n; i++) {
            add(v[i-1].x), add(v[i-1].y);
            int now = L.size() + R.size();
            long b = L.size() == (now + 1) / 2 ? L.top() : R.top();
            dpl[i] = (b * L.size() - suml) + (sumr - b * R.size());
        }
        L = priority_queue<long>();
        R = priority_queue<long, vector<long>, greater<long> >();
        suml = sumr = 0;
        for(int i = n; i; i--) {
            add(v[i-1].x), add(v[i-1].y);
            int now = L.size() + R.size();
            long b = L.size() == (now + 1) / 2 ? L.top() : R.top();
            dpr[i] = (b * L.size() - suml) + (sumr - b * R.size());
        }
        if(k == 1) ans += dpl[n];
        else {
            long tmp = 2e18;
            for(int i = 0; i <= n; i++) tmp = min(tmp, dpl[i] + dpr[i+1]);
            ans += tmp;
        }
    }
    printf("%lld\n", ans);

    return 0;
}

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

bridge.cpp: In function 'void add(long long int)':
bridge.cpp:20:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if(L.size() > (now + 1) / 2) {
            ~~~~~~~~~^~~~~~~~~~~~~~~
bridge.cpp:28:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if(R.size() > (now + 1) / 2) {
            ~~~~~~~~~^~~~~~~~~~~~~~~
bridge.cpp: In function 'int main()':
bridge.cpp:57:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             long b = L.size() == (now + 1) / 2 ? L.top() : R.top();
                      ~~~~~~~~~^~~~~~~~~~~~~~~~
bridge.cpp:66:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             long b = L.size() == (now + 1) / 2 ? L.top() : R.top();
                      ~~~~~~~~~^~~~~~~~~~~~~~~~
bridge.cpp:41:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d", &k, &n);
     ~~~~~^~~~~~~~~~~~~~~~~
bridge.cpp:44:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf(" %c %d %c %d", &a, &b, &c, &d);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...