Submission #1308636

#TimeUsernameProblemLanguageResultExecution timeMemory
1308636simplemind_31Palembang Bridges (APIO15_bridge)C++20
100 / 100
284 ms20028 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#define ALL(x) x.begin(),x.end()
using namespace __gnu_pbds;
using namespace std;
typedef long long ll;
typedef tree<pair<ll,pair<ll,ll>>,null_type,less<pair<ll,pair<ll,ll>>>,rb_tree_tag,tree_order_statistics_node_update> llset;
char t1,t2;
ll k,n,a,b;
ll lad,res,sumade,sumaiz;
bool cmp(pair<ll,ll> a,pair<ll,ll> b){return a.first+a.second<b.first+b.second;};
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin >> k >> n;
    vector<pair<ll,ll>> nums;
    vector<ll> dif;
    for(ll i=0;i<n;i++){
        cin >> t1 >> a >> t2 >> b;
        if(t1==t2)lad+=abs(a-b);
        else{
            dif.push_back(a);
            dif.push_back(b);
            nums.push_back({min(a,b),max(a,b)});
        }
    }
    n=nums.size();
    sort(ALL(dif));
    for(ll i=0;i<dif.size();i++){
        res+=abs(dif[i]-dif[dif.size()/2]);
    }
    res+=n;
    if(k==1){
        cout << lad+res;
        return 0;
    }
    sort(ALL(nums),cmp);
    llset de;
    vector<ll> sumaaaa(n);
    for(ll i=0;i<n;i++){
        if(de.empty()){
            de.insert({nums[i].first,{i,0}});
        }else{
            ll valmedante=de.find_by_order(de.size()/2)->first;
            sumade+=abs(valmedante-nums[i].first);
            de.insert({nums[i].first,{i,0}});
            if(nums[i].first<=valmedante){
                ll valmednow=de.find_by_order(de.size()/2)->first;
                sumade-=(valmedante-valmednow);
            }
        }
        ll valmedante=de.find_by_order(de.size()/2)->first;
        sumade+=abs(valmedante-nums[i].second);
        de.insert({nums[i].second,{i,1}});
        sumaaaa[i]=sumade;
    }
    for(ll i=0;i<n;i++){
        //de 0 a i pref, de i+1 a n-1 suf
        //quitar nums[i] del de
        ll valmedante=de.find_by_order(de.size()/2)->first;
        sumade-=abs(valmedante-nums[i].first);
        de.erase(make_pair(nums[i].first,make_pair(i,0)));
        if(nums[i].first>=valmedante){
            ll valmednow=de.find_by_order(de.size()/2)->first;
            sumade-=valmedante-valmednow;
        }
        valmedante=de.find_by_order(de.size()/2)->first;
        sumade-=abs(valmedante-nums[i].second);
        de.erase(make_pair(nums[i].second,make_pair(i,1)));
        res=min(res,sumade+sumaaaa[i]+n);
    }
    cout << lad+res;
}
#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...