Submission #1054510

#TimeUsernameProblemLanguageResultExecution timeMemory
1054510Unforgettablepl전선 연결 (IOI17_wiring)C++17
100 / 100
54 ms10188 KiB
#include "wiring.h"
#include <bits/stdc++.h>
using namespace std;

const long long INF = 1e15;

vector<long long> transformation(vector<int> idxa,vector<int> idxb,vector<long long> DPa) {
	int A = idxa.size()-1;
	int B = idxb.size()-1;
	vector DPres(B+1,INF);
	DPres[0]=DPa.back();
	if(A==0)return DPres;
	vector<long long> centerhelp(B+1);
	{
		// Center Outwards Transformation
		int lastA = idxa.back();
		long long sum = 0;
		long long curropt = INF;
		int otherIDX = A+1;
		for(int i=1;i<=B;i++) {
			otherIDX--;
			if(i<=A)sum+=idxb[i]-idxa[otherIDX];
			centerhelp[i]=sum;
			curropt+=idxb[i]-lastA;
			if(i<=A)curropt = min(curropt,min(DPa[otherIDX],DPa[otherIDX-1])+sum);
			DPres[i]=min(DPres[i],curropt);
		}
	}
	{
		// Inwards transformation
		long long sum = 0;
		long long curropt = INF;
		int cntCenterTransformation = min(A,B);
		idxb.erase(idxb.begin()+cntCenterTransformation+1,idxb.end());
		B = idxb.size()-1;
		int FirstB = idxb[1];
		long long base = centerhelp[B];
		long long lastOpt = INF;
		for(int i=A-B;i;i--) {
			base+=FirstB-idxa[i];
			lastOpt = min(lastOpt,min(DPa[i],DPa[i-1])+base);
			DPres[B]=min(DPres[B],min(DPa[i],DPa[i-1])+base);
		}
		for(int i=B;i;i--){
			int otherIDX = A+1-i;
			if(i==B) {
				curropt=min(curropt,lastOpt);
			} else {
				curropt+=FirstB-idxb[i+1];
			}
			curropt=min(curropt,min(DPa[otherIDX],DPa[otherIDX-1])+centerhelp[i]);
			DPres[i]=min(DPres[i],curropt);
		}
	}
	return DPres;
}

long long min_total_length(vector<int> r, vector<int> b) {
	vector<pair<int,int>> arr;
	for(int&i:b)arr.emplace_back(i,0);
	for(int&i:r)arr.emplace_back(i,1);
	sort(arr.begin(), arr.end());
	int n = arr.size();
	arr.insert(arr.begin(),{-1,0});
	arr.emplace_back(1e9+1,2);
	vector DPlast(1,0ll);
	vector lastidx(1,-1);
	vector curridx(1,-1);
	for(int i=1;i<=n;i++) {
		auto [idx,mycolour] = arr[i];
		curridx.emplace_back(idx);
		if(arr[i+1].second==mycolour)continue;
		DPlast = transformation(lastidx,curridx,DPlast);
		swap(curridx,lastidx);
		curridx.clear();
		curridx.emplace_back(-1);
	}
	return DPlast.back();
}

Compilation message (stderr)

wiring.cpp: In function 'std::vector<long long int> transformation(std::vector<int>, std::vector<int>, std::vector<long long int>)':
wiring.cpp:31:13: warning: unused variable 'sum' [-Wunused-variable]
   31 |   long long sum = 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...