Submission #79117

#TimeUsernameProblemLanguageResultExecution timeMemory
79117PlurmWiring (IOI17_wiring)C++11
100 / 100
117 ms97160 KiB
#include "wiring.h"
#include <vector>
#include <algorithm>

using namespace std;
long long min_total_length(vector<int> r, vector<int> b) {
	vector<pair<int,bool> > combined;
	vector<long long> qs;
	for(int x : r){
		combined.emplace_back(x,false);
	}
	for(int x : b){
		combined.emplace_back(x,true);
	}
	sort(combined.begin(),combined.end());
	bool cur = !combined.front().second;
	int clen = -1e9;
	int llen = 0;
	int begin = 0;
	vector<int> lpos;
	lpos.resize(combined.size());
	vector<int> laxis;
	laxis.resize(combined.size());
	for(int i = 0; i < combined.size(); i++){
		if(combined[i].second == cur){
			clen++;
		}else{
			begin = i;
			llen = clen;
			clen = 1;
			cur = !cur;
		}
		lpos[i] = 2*begin-i-1;
		laxis[i] = begin;
		if(lpos[i] < begin-llen){
			lpos[i] = -1;
		}
	}
	qs.push_back((long long)combined.front().first);
	for(int i = 1; i < combined.size(); i++){
		qs.push_back(qs.back() + (long long)combined[i].first);
	}
	vector<long long> dp;
	dp.resize(combined.size());
	dp[0] = 1e18;
	if(combined[0].second){
		auto it = lower_bound(r.begin(),r.end(),combined[0].first);
		if(it != r.begin()) dp[0] = min(dp[0],(long long)combined[0].first - (long long)*(it-1));
		if(it != r.end()) dp[0] = min(dp[0], (long long)*it - (long long)combined[0].first);
	}else{
		auto it = lower_bound(b.begin(),b.end(),combined[0].first);
		if(it != b.begin()) dp[0] = min(dp[0], (long long)combined[0].first - (long long)*(it-1));
		if(it != b.end()) dp[0] = min(dp[0], (long long)*it - (long long)combined[0].first);
	}
	for(int i = 1; i < combined.size(); i++){
		// Case 1: dp[i] = dp[i-1] + abs(pos[i] - pos[j])
		dp[i] = 1e18;
		if(combined[i].second){
			auto it = lower_bound(r.begin(),r.end(),combined[i].first);
			if(it != r.begin())
				dp[i] = min(dp[i],dp[i-1] + (long long)combined[i].first - (long long)*(it-1));
			if(it != r.end())
				dp[i] = min(dp[i],dp[i-1] + (long long)*it - (long long)combined[i].first);
		}else{
			auto it = lower_bound(b.begin(),b.end(),combined[i].first);
			if(it != b.begin())
				dp[i] = min(dp[i],dp[i-1] + (long long)combined[i].first - (long long)*(it-1));
			if(it != b.end())
				dp[i] = min(dp[i],dp[i-1] - (long long)combined[i].first + (long long)*it);
		}
		// Case 2: dp[i] = dp[j] + Distance Differences
		if(lpos[i] == 0){
			dp[i] = min(dp[i],qs[i] - qs[laxis[i]-1] - qs[laxis[i]-1]);
		}else if(lpos[i] != -1){
			dp[i] = min(dp[i],qs[i] - qs[laxis[i]-1] - qs[laxis[i]-1] + qs[lpos[i]-1] + dp[lpos[i]-1]);
		}
	}
	return dp.back();
}

Compilation message (stderr)

wiring.cpp: In function 'long long int min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:24:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < combined.size(); i++){
                 ~~^~~~~~~~~~~~~~~~~
wiring.cpp:40:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 1; i < combined.size(); i++){
                 ~~^~~~~~~~~~~~~~~~~
wiring.cpp:55:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 1; i < combined.size(); i++){
                 ~~^~~~~~~~~~~~~~~~~
#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...