Submission #60535

#TimeUsernameProblemLanguageResultExecution timeMemory
60535istleminPalembang Bridges (APIO15_bridge)C++14
41 / 100
2083 ms13560 KiB
#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b) for(ll i = a; i < ll(b); ++i)
#define trav(a, v) for(auto& a : v)
#define all(x) x.begin(), x.end()
#define sz(x) (ll)(x).size()
#define D(x) cerr << #x << " = " << x << endl

typedef long long ll;
typedef pair<ll, ll> pii;
typedef vector<ll> vi;


int main() {
    cin.sync_with_stdio(false);
	ll k,n;
	ll totDist = 0;
	vector<pair<ll,pii>> intervals;
	vector<ll> points;
	cin>>k>>n;
	rep(i,0,n){
		char a,b;
		ll c,d;
		cin>>a>>c>>b>>d;
		if(a!=b){
			intervals.push_back(make_pair(c+d,pii(c,d)));
			//points.push_back(c+d);
		}else{
			totDist += abs(c-d);
		}
	}
	ll bestDist = 0;
	if(intervals.size()>1){
		bestDist = 1e18;
		sort(all(intervals));
		multiset<ll> right;
		multiset<ll> left;
		rep(i,0,intervals.size()){
			if(i == 0){
				left.insert(intervals[i].second.first);
				left.insert(intervals[i].second.second);
			}else{
				right.insert(intervals[i].second.first);
				right.insert(intervals[i].second.second);
			}
		}
		auto it = right.begin();
		advance(it, right.size()/2);
		ll rAt = *it;
		ll rSum = 0;
		for(auto it : right) rSum += abs(it - rAt);
		ll lAt = *left.begin();
		ll lSum = abs(intervals[0].second.second-intervals[0].second.first);
		bestDist = lSum + rSum;
		rep(i,1,intervals.size()-1){
			ll a = intervals[i].second.first;
			ll b = intervals[i].second.second;
			left.insert(a);
			left.insert(b);
			lSum += abs(lAt-a) + abs(lAt-b);
			right.erase(right.lower_bound(a));
			right.erase(right.lower_bound(b));
			rSum -= abs(rAt-a) + abs(rAt-b);
			auto it = left.lower_bound(lAt);
			ll index = distance(left.begin(),it);
			while(index<left.size()/2){
				lSum += (index*2 + 2 - left.size())*(*(next(it)) - *it);
				advance(it,1);
				++index;
			}
			lAt = *it;
			it = right.lower_bound(rAt);
			index = distance(right.begin(),it);
			while(index<right.size()/2){
				rSum += (index*2 + 2 - right.size())*(*(next(it)) - *it);
				advance(it,1);
				++index;
			}
			rAt = *it;
			bestDist = min(bestDist,lSum + rSum);
		}
	}else if(intervals.size()==1){
		bestDist = abs(intervals[0].second.second - intervals[0].second.first);
	}
	totDist += bestDist;
	totDist += intervals.size();
	cout<<totDist<<endl;
}

Compilation message (stderr)

bridge.cpp: In function 'int main()':
bridge.cpp:68:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    while(index<left.size()/2){
          ~~~~~^~~~~~~~~~~~~~
bridge.cpp:76:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    while(index<right.size()/2){
          ~~~~~^~~~~~~~~~~~~~~
#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...