Submission #1241380

#TimeUsernameProblemLanguageResultExecution timeMemory
1241380Dan4LifeWiring (IOI17_wiring)C++17
0 / 100
0 ms328 KiB
#include "wiring.h"
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define sz(a) (int)a.size()
#define all(a) begin(a),end(a)

using ll = long long;
using vi = vector<int>;
using ar2 = array<ll,2>;

const int mxN = (int)2e5+10;
const ll LINF = (ll)4e18;
int n, m;
ll dp[mxN], lst[mxN], pref[2][mxN], pref2[mxN];
vector<ar2> v;

ll F(int l, int r){ return dp[l]+abs(pref[1][r+1]-pref[1][l] - (pref[0][r+1]-pref[0][l])); }

map<int,int> L;
ll min_total_length(vi r, vi b) {
	n = sz(r), m = sz(b);
	for(auto u : r) v.pb({u,0});
	for(auto u : b) v.pb({u,1});
	sort(all(v));
	int cur[2]; cur[0]=cur[1]=-1;
	for(int i = 0; i < n+m; i++){
		lst[i] = cur[!v[i][1]];
		cur[v[i][1]]=i, dp[i+1] = LINF;
		for(int j : {0,1}) pref[j][i+1] = pref[j][i];
		pref[v[i][1]][i+1]+=v[i][0];
		pref2[i+1] = pref2[i]+(v[i][1]?1:-1);
	}
	for(int i = 0; i < n+m; i++){
		if(lst[i]>=0){
			dp[i+1] = min(dp[i+1], dp[i]+v[i][0]-v[lst[i]][0]);
			int j = L[pref2[i+1]];
			if(pref2[j] == pref2[i+1]) dp[i+1]=min(dp[i+1],F(j,i));
		}
		L[pref2[i+1]] = i+1;
	}
	return dp[n+m];
}
#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...