Submission #1378861

#TimeUsernameProblemLanguageResultExecution timeMemory
1378861Godgift42Palembang Bridges (APIO15_bridge)C++20
0 / 100
1 ms344 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const ll inf=1000000000000000000;

int main(){
    int n,k;
    cin >> k >> n;
    if(k==1){
        ll ans=0;
        vector<pair<ll,ll>> a;
        vector<ll> ra;
        vector<pair<ll,ll>> wa;
        vector<ll> rwa;
        for(int i=0;i<n;i++){
            char p,q;
            int b,s;
            cin >> p >> b >> q >> s;
            
            if(p!=q){
                if(b>s)swap(b,s);
                a.push_back({b,s});
                wa.push_back({s,b});
                rwa.push_back(b);
                ra.push_back(s);
            }
            else ans+=abs(b-s);
        }
        sort(a.begin(),a.end());
        sort(ra.begin(),ra.end());
        sort(wa.begin(),wa.end());
        sort(rwa.begin(),rwa.end());
        ll sz=a.size();
        if(sz==0){
            cout << ans << "\n";
            return 0;
        }
        vector<ll> prm(sz+1,0);
        ll de=a[0].first;
        for(int i=1;i<=sz;i++){
            prm[i]=prm[i-1]+ra[i-1];
            de+=a[i-1].first;
        }
        ll cs=inf;
        ll ar=0;
        for(ll i=0;i<sz;i++){
            ar+=a[i].first;
            de-=a[i].first;
            ll cur=sz+(i+1)*a[i].first-ar+de-(sz-i-1)*a[i].first;
            ll it=upper_bound(ra.begin(),ra.end(),a[i].first)-ra.begin();
            cur+=a[i].first*it-prm[it]+prm[sz]-prm[it]-a[i].first*(sz-it);
            cs=min(cs,cur);
        }
        vector<ll> wprm(sz+1,0);
        de=wa[0].first;
        for(int i=1;i<=sz;i++){
            prm[i]=prm[i-1]+rwa[i-1];
            de+=wa[i-1].first;
        }
       ar=0;
        for(ll i=0;i<sz;i++){
            ar+=wa[i].first;
            de-=wa[i].first;
            ll cur=sz+(i+1)*wa[i].first-ar+de-(sz-i-1)*wa[i].first;
            ll it=upper_bound(rwa.begin(),rwa.end(),wa[i].first)-rwa.begin();
            cur+=wa[i].first*it-prm[it]+prm[sz]-prm[it]-wa[i].first*(sz-it);
            cs=min(cs,cur);
        }
        cout << ans+cs << "\n";
    }   
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...