제출 #1334823

#제출 시각아이디문제언어결과실행 시간메모리
1334823veham전선 연결 (IOI17_wiring)C++20
0 / 100
1 ms344 KiB
#include "wiring.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef pair<int,int> pi;
typedef pair<pi,ll> pil;

struct state{
	int ri,bi;
	ll d;
	double cost;
};
vector<double> c;

ll calc(vi &r, vi &b, double lambda){
	auto cmp = [&](state a, state b){
		ll av = a.d + a.cost * lambda;
		ll bv = b.d + b.cost * lambda;
		return av < bv;
	};
	vector<state> V;
	for(state s{0,0,abs(r[0] - b[0]),0};1;V.clear()){
		if(s.ri == r.size()-1 && s.bi == b.size()-1) return s.d;
		if(s.ri < r.size()-1) V.push_back({s.ri+1,s.bi,s.d + abs(r[s.ri+1]-b[s.bi]),s.cost + c[s.ri]});
		if(s.bi < b.size()-1) V.push_back(state{s.ri,s.bi+1,s.d + abs(r[s.ri]-b[s.bi+1]),s.cost + c[r.size()+s.bi]});
		if(s.ri < r.size()-1 && s.bi < b.size()-1) V.push_back({s.ri+1,s.bi+1,s.d + abs(r[s.ri+1]-b[s.bi+1]),s.cost});
		s = *min_element(V.begin(),V.end(),cmp);
	}
}

ll min_total_length(vi r, vi b) {
	int n = r.size(), m = b.size();
	double lb = 0,rb = 1e18;
	c.assign(m+n,0);
	for(int i = 0;i < n+m;i++) c[i] = 1 + 1/double(3*(m+n)+i);
	ll lv = calc(r,b,lb);
	ll rv = calc(r,b,rb);
	for(;lv != rv;){
		double lm = (2*lb+rb)/3, rm = (2*rb+lb)/3;
		ll lmv = calc(r,b,lm), rmv = calc(r,b,rm);
		if(lmv < rmv){
			rb = rm;
			rv = rmv;
		}
		else{
			lb = lm;
			lv = lmv;
		}
	}
	return lv;
}
#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...