Submission #1308609

#TimeUsernameProblemLanguageResultExecution timeMemory
1308609simplemind_31Palembang Bridges (APIO15_bridge)C++20
22 / 100
39 ms2228 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<int,null_type,less_equal<int>,rb_tree_tag,tree_order_statistics_node_update> intset;
char t1,t2;
int k,n,a,b;
ll lad,res,sumade,sumaiz;
bool cmp(pair<int,int> a,pair<int,int> 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<int,int>> nums;
    vector<int> dif;
    for(int 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)});
        }
    }
    sort(ALL(nums),cmp);
    n=nums.size();
    if(k==1){
        sort(ALL(dif));
        for(int i=0;i<dif.size();i++){
            res+=abs(dif[i]-dif[dif.size()/2]);
        }
        cout << lad+res+n;
        return 0;
    }
    sort(ALL(nums),cmp);
    intset de;
    vector<ll> sumaaaa(n);
    for(int i=0;i<n;i++){
        if(de.empty()){
            de.insert(nums[i].first);
        }else{
            ll valmedante=*de.find_by_order(de.size()/2);
            sumade+=abs(valmedante-nums[i].first);
            de.insert(nums[i].first);
            if(nums[i].first<valmedante){
                //nada
                ll valmednow=*de.find_by_order(de.size()/2);
                sumade-=(valmedante-valmednow);
                //sumade+=(valmedante-valmednow)*(de.size()-de.size()/2-1);
                //sumade-=(valmedante-valmednow)*(de.size()/2+1);
            }
        }
        ll valmedante=*de.find_by_order(de.size()/2);
        sumade+=abs(valmedante-nums[i].second);
        de.insert(nums[i].second);
        /*if(nums[i].second>valmedante){
            ll valmednow=*de.find_by_order(de.size()/2);
            sumade-=(valmedante-valmednow)*(de.size()-de.size()/2);
            sumade+=(valmedante-valmednow)*(de.size()/2);
        }*/
        sumaaaa[i]=sumade;
    }
    res=1e18;
    for(int i=0;i<n-1;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);
        sumade-=abs(valmedante-nums[i].first);
        de.erase(de.find(nums[i].first));
        if(nums[i].first>valmedante){
            ll valmednow=*de.find_by_order(de.size()/2);
            sumade-=valmedante-valmednow;
        }
        valmedante=*de.find_by_order(de.size()/2);
        sumade-=abs(valmedante-nums[i].second);
        de.erase(de.find(nums[i].second));
        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...