제출 #1343211

#제출 시각아이디문제언어결과실행 시간메모리
1343211xnoelPalembang Bridges (APIO15_bridge)C++20
22 / 100
29 ms3544 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

int alg(const vector<int>& ps) {
    int sz=ps.size();
    if (sz<=1) return 0;
    int first_sum=ps[sz/2];
    int second_sum=ps[sz-1]-ps[sz/2];
    return second_sum-first_sum;
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    //freopen("1.in","r",stdin);
    int k,n;
    cin >> k >> n;

    if (k==1) {
        int ans=0;
        vector<int> coord;
        coord.reserve(2*n);
        for (int i=0;i<n;i++) {
            char c1,c2;
            int x,y;
            cin >> c1 >> x >> c2 >> y;
            if (c1==c2) ans+=abs(x-y);
            else {
                coord.push_back(x);
                coord.push_back(y);
            }
        }
        ans+=coord.size()/2;
        sort(coord.begin(),coord.end());
        vector<int> ps(coord.size()+1,0);
        for (int i=0;i<coord.size();i++) {
            ps[i+1]=ps[i]+coord[i];
        }
        cout<<ans+alg(ps)<<"\n";
        return 0;
    }
    else if (k==2) {
        int ans=0;
        vector<pair<int,int>> vp;
        vp.reserve(n);
        for (int i=0;i<n;i++) {
            char c1,c2;
            int x,y;
            cin >> c1 >> x >> c2 >> y;
            if (c1==c2) ans+=abs(x-y);
            else vp.push_back({x,y});
        }
        sort(vp.begin(),vp.end(),[](const pair<int,int>& a, const pair<int,int>& b){return a.first+a.second<b.first+b.second;});
        vector<int> coord(vp.size()*2);
        for (int i=0;i<vp.size();i++) {
            coord[i*2]=vp[i].first;
            coord[i*2+1]=vp[i].second;
        }
        ans+=coord.size()/2;

        if (coord.size()<=2) {
            cout<<ans<<"\n";
            return 0;
        }

        multiset<int> low_ms1, high_ms1, low_ms2, high_ms2;
        int low_sum1=0, high_sum1=0, low_sum2=0, high_sum2=0;
        vector<int> temp_coord=coord;
        sort(temp_coord.begin(),temp_coord.end());
        for (int i=0;i<temp_coord.size();i++) {
            if (i<temp_coord.size()/2) {
                low_ms2.insert(temp_coord[i]);
                low_sum2+=temp_coord[i];
            }
            else {
                high_ms2.insert(temp_coord[i]);
                high_sum2+=temp_coord[i];
            }
        }

        // for (auto num: coord) cout<<num<<" ";
        // cout<<"\n";

        int temp_sum=1e18;
        for (int i=0;i<coord.size()-4;i+=2) {
            int num1=coord[i], num2=coord[i+1];
            if (low_ms1.empty()){
                low_ms1.insert(min(num1,num2));
                high_ms1.insert(max(num1,num2));
                low_sum1+=min(num1,num2);
                high_sum1+=max(num1,num2);
            }
            else {
                if (num1<=*low_ms1.rbegin()) {
                    low_ms1.insert(num1);
                    low_sum1+=num1;
                }
                else {
                    high_ms1.insert(num1);
                    high_sum1+=num1;
                }
                if (num2<=*low_ms1.rbegin()) {
                    low_ms1.insert(num2);
                    low_sum1+=num2;
                }
                else {
                    high_ms1.insert(num2);
                    high_sum1+=num2;
                }
            }
            if (low_ms1.size()>high_ms1.size()) {
                high_sum1+=*low_ms1.rbegin();
                high_ms1.insert(*low_ms1.rbegin());
                low_sum1-=*low_ms1.rbegin();
                low_ms1.erase(prev(low_ms1.end()));
            }
            else if (low_ms1.size()<high_ms1.size()) {
                low_sum1+=*high_ms1.begin();
                low_ms1.insert(*high_ms1.begin());
                high_sum1-=*high_ms1.begin();
                high_ms1.erase(high_ms1.begin());
            }

            


            if (num1<=*low_ms2.rbegin()) {
                low_ms2.erase(low_ms2.find(num1));
                low_sum2-=num1;
            }
            else {
                high_ms2.erase(high_ms2.find(num1));
                high_sum2-=num1;
                low_ms2.insert(num1);
            }

            if (num2<=*low_ms2.rbegin()) {
                low_ms2.erase(low_ms2.find(num2));
                low_sum2-=num2;
            }
            else {
                high_ms2.erase(high_ms2.find(num2));
                high_sum2-=num2;
                low_ms2.insert(num2);
            }



            if (low_ms2.size()>high_ms2.size()) {
                high_sum2+=*low_ms2.rbegin();
                high_ms2.insert(*low_ms2.rbegin());
                low_sum2-=*low_ms2.rbegin();
                low_ms2.erase(prev(low_ms2.end()));
            }
            else if (low_ms2.size()<high_ms2.size()) {
                low_sum2+=*high_ms2.begin();
                low_ms2.insert(*high_ms2.begin());
                high_sum2-=*high_ms2.begin();
                high_ms2.erase(high_ms2.begin());
            }
            //cout<<i<<" "<<low_sum1<<" "<<high_sum1<<" "<<low_sum2<<" "<<high_sum2<<"\n";
            temp_sum=min(temp_sum,high_sum1-low_sum1+high_sum2-low_sum2);
        }
        cout<<ans+temp_sum<<"\n";
        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...