제출 #1297332

#제출 시각아이디문제언어결과실행 시간메모리
1297332silver_bulletPalembang Bridges (APIO15_bridge)C++20
100 / 100
192 ms12180 KiB
#include<bits/stdc++.h> 
#define ll long long 
using namespace std;
bool cmp(array<int,2> x,array<int,2> y)
{
    return x[0] + x[1] < y[0] + y[1]; 
}
const int maxN = (int)1e5 + 2;
ll sum_left[maxN],sum_right[maxN]; 
int main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int k , n;
    cin >> k >> n;
    ll ans = 0; 
    if(k == 1)
    {
        vector<int> x_coords;
        x_coords.clear();
        while(n--)
        {
            char c1,c2;
            int x1,x2;
            cin >> c1 >> x1 >> c2 >> x2;
            if(c1 == c2) ans += abs(x2 - x1); 
            else ++ans,x_coords.push_back(x1),x_coords.push_back(x2); 
        }
        sort(x_coords.begin(),x_coords.end());
        int med_idx = x_coords.size() / 2;
        for(int x : x_coords) ans += abs(x - x_coords[med_idx]);
    }
    else
    {
        vector<array<int,2>> coords;
        coords.clear();
        while(n--)
        {
            int x1,x2;
            char c1,c2;
            cin >> c1 >> x1 >> c2 >> x2;
            if(c1 == c2) ans += abs(x2 - x1);
            else ++ans,coords.push_back({x1,x2}); 
        }
        sort(coords.begin(),coords.end(),cmp); 
        n = coords.size();
        multiset<int> ms1,ms2;
        ms1.clear(),ms2.clear();
        ll l_sum = 0,r_sum = 0;  
        for(int i=0;i<n;++i)
        {
            int x1 = coords[i][0],x2 = coords[i][1];
            if(x1 > x2) swap(x1,x2);
            ms1.insert(x1),ms2.insert(x2); 
            l_sum += x1,r_sum += x2; 
            if(*ms2.begin() < *ms1.rbegin()) 
            {
                int v; 
                v = *ms2.begin(); 
                ms2.erase(ms2.begin());
                r_sum -= v; 
                ms1.insert(v);
                l_sum += v; 
                v = *ms1.rbegin();
                ms1.erase(ms1.find(v));
                l_sum -= v; 
                ms2.insert(v);
                r_sum += v; 
            }
            ll median = *ms1.rbegin();
            sum_left[i] = median * ms1.size() - l_sum + r_sum - median * ms2.size();
        }
        ms1.clear(),ms2.clear();
        l_sum = 0,r_sum = 0;
        for(int i=n-1;i>=0;--i)
        {
            int x1 = coords[i][0];
            int x2 = coords[i][1];
            if(x1 > x2) swap(x1,x2);
            ms1.insert(x1),ms2.insert(x2);
            l_sum += x1,r_sum += x2;
            if(*ms1.rbegin() > *ms2.begin())
            {
                int v; 
                v = *ms2.begin(); 
                ms2.erase(ms2.begin());
                r_sum -= v; 
                ms1.insert(v);
                l_sum += v; 
                v = *ms1.rbegin();
                ms1.erase(ms1.find(v));
                l_sum -= v; 
                ms2.insert(v);
                r_sum += v; 
            }
            ll median = *ms1.rbegin();
            sum_right[i] = median * ms1.size() - l_sum + r_sum - median * ms2.size();
        }
        ll min_cost = LONG_LONG_MAX;
        for(int i=0;i<n-1;++i) min_cost = min(min_cost,sum_left[i] + sum_right[i+1]); 
        ans += min({min_cost,sum_left[n-1],sum_right[0]});
    }
    cout << ans;
    return 0; 
}
#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...