제출 #1341400

#제출 시각아이디문제언어결과실행 시간메모리
1341400NipphitchPalembang Bridges (APIO15_bridge)C++20
100 / 100
68 ms6180 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long 
const int N=1e5+5;

int lsum,rsum,pref[N];
priority_queue <int> lpq;
priority_queue <int,vector <int>,greater <int>> rpq;

bool cmp(pair <int,int> x,pair <int,int> y){
    return x.first+x.second<y.first+y.second;
}

void insert(int x){
    int median=(lpq.size()?lpq.top():1000000001);
    if(x<=median){
        lpq.push(x);
        lsum+=x;
    }
    else{
        rpq.push(x);
        rsum+=x;
    }
    if(rpq.size()+1<lpq.size()){
        int nxt=lpq.top();
        lpq.pop();
        rpq.push(nxt);
        lsum-=nxt;
        rsum+=nxt;
    }
    else if(lpq.size()<rpq.size()){
        int nxt=rpq.top();
        rpq.pop();
        lpq.push(nxt);
        rsum-=nxt;
        lsum+=nxt;
    }
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int k,n,sum_side=0;
    vector <pair <int,int>> v={{0,0}};
    cin >> k >> n;
    for(int i=0;i<n;i++){
        char a,b;
        int x,y;
        cin >> a >> x >> b >> y;
        if(a==b) sum_side+=abs(x-y);
        else v.push_back({x,y});
    }
    sort(v.begin(),v.end(),cmp);
    n=v.size()-1;
    sum_side+=n;
    lsum=rsum=0;
    for(int i=1;i<=n;i++){
        insert(v[i].first);
        insert(v[i].second);
        pref[i]=rsum-lsum;
    }
    int ans=pref[n];
    if(k==2){
        while(!lpq.empty()) lpq.pop();
        while(!rpq.empty()) rpq.pop();
        lsum=rsum=0;
        for(int i=n;i>0;i--){
            insert(v[i].first);
            insert(v[i].second);
            ans=min(ans,rsum-lsum+pref[i-1]);
        }
    }
    cout << sum_side+ans;
}
#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...