Submission #107127

#TimeUsernameProblemLanguageResultExecution timeMemory
107127oolimryPalembang Bridges (APIO15_bridge)C++14
22 / 100
364 ms10484 KiB
#include <bits/stdc++.h>

using namespace std;

typedef pair<long long, long long> ii;
int main()
{
    //freopen("i.txt","r",stdin);
    int k, n;

    ios_base::sync_with_stdio(false);
    cin.tie(0);

    cin >> k >> n;

    vector<ii> points;

    long long forcedDist = 0ll;

    for(int i = 0;i < n;i++){
        char a, c;
        long long b, d;
        cin >> a >> b >> c >> d;

        if(a == c){
            forcedDist += abs(d-b);
        }
        else{
            forcedDist += abs(d-b);
            forcedDist++;
            if(b > d) swap(b,d);
            points.push_back(ii(b,i));
            points.push_back(ii(d,i));
        }
    }

    n = points.size();
    sort(points.begin(),points.end());
    for(int i = 0;i < n;i++){
        //cout << points[i].first << " " << points[i].second << "\n";
    }

    long long passed = 0ll;
    long long after = n/2;
    set<long long> in;

    long long preVal = 0ll;

    long long val = 0ll;

    for(int i = 0;i < n;i++){
        if(in.find(points[i].second) != in.end()) continue;
        in.insert(points[i].second);
        val += points[i].first;
    }
    in.clear();
    ///val for putting bridge at 0;

    long long minVal = val; ///need to times 2 later

    for(int i = 0;i < n;i++){
        long long diff = points[i].first - preVal;

        if(in.find(points[i].second) == in.end()){
            val += passed * diff;
            val -= after * diff;
            in.insert(points[i].second);
            after--;
        }
        else{
            val += passed * diff;
            val -= after * diff;
            in.erase(points[i].second);
            passed++;
        }



        //cout << val << " " << passed << " " << after << " " << diff << "\n";

        ///std stuff
        minVal = min(val,minVal);
        preVal = points[i].first;

    }

    cout << minVal * 2ll + forcedDist;


    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...