Submission #993355

#TimeUsernameProblemLanguageResultExecution timeMemory
993355BF001Palembang Bridges (APIO15_bridge)C++17
100 / 100
69 ms7912 KiB
#include <bits/stdc++.h>
using namespace std;

#define N 100005
#define int long long
#define fi first
#define se second

typedef pair<int, int> ii;

int same, res, n, lsum, rsum, pre[N];
vector<ii> vec;
priority_queue<int> lq;
priority_queue<int, vector<int>, greater<int>> rq;

void add(int x){
	//cout << x << "\n";
	int tp = 1e18;
	if (lq.size()) tp = lq.top();
	if (x <= tp){
		lq.push(x);
		lsum += x;
	}
	else {
		rq.push(x);
		rsum += x;
	}
	if (rq.size() + 1 < lq.size()){
		tp = lq.top();
		lq.pop();
		rq.push(tp);
		rsum += tp;
		lsum -= tp;
	}
	if (lq.size() < rq.size()){
		tp = rq.top();
		rq.pop();
		lq.push(tp);
		rsum -= tp;
		lsum += tp;
	}
}

bool cmp(ii& a, ii& b){
	return a.fi + a.se < b.fi + b.se;
}

int k;

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
     
    cin >> k >> n;
    for (int i = 1; i <= n; i++){
    	char aa, bb;
    	int pos1, pos2;
    	cin >> aa >> pos1 >> bb >> pos2;
    	if (aa == bb){
    		same += abs(pos2 - pos1);
    	}
    	else{
    		vec.push_back({pos1, pos2});
    	}
    }  

    sort(vec.begin(), vec.end(), cmp);

    same += vec.size();

    for (int i = 1; i <= (int) vec.size(); i++){
    	add(vec[i - 1].fi);
    	add(vec[i - 1].se);
    	//cout << rsum << " " << lsum << "\n";
    	pre[i] = rsum - lsum;
    }

    res = pre[vec.size()];
    if (k == 2){
	    lsum = rsum = 0;
	    while (lq.size()) lq.pop();
	    while (rq.size()) rq.pop();
	    for (int i = (int) vec.size(); i >= 1; i--){
	    	add(vec[i - 1].fi);
	    	add(vec[i - 1].se);
	    	res = min(res, pre[i - 1] + rsum - lsum);
	    }
	}
    cout << res + same;

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