이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "wiring.h"
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define cerr if(false) cerr
const int INF = 1e17;
struct segtree{
	vector<int> t;
	int sz; 
	segtree(int size){
		sz = size;
		t = vector<int>(sz*4, INF);
	}
	void upd(int i, int s, int e, int indx, int val){
		if(s == e){
			t[i] = val;
			return;
		}
		int m = (s + e)/2;
		if(indx <= m) upd(i*2, s, m, indx, val);
		else upd(i*2+1, m+1, e, indx, val);
		t[i] = min(t[i*2], t[i*2+1]);
	}
	int query(int i, int s, int e, int l, int r){
		if(l <= s && e <= r) return t[i];
		if(s > r || e < l || s > e) return INF;
		int m = (s + e)/2;
		return min(query(i*2, s, m, l, r), query(i*2+1, m+1, e, l, r));
	}
	void upd(int indx, int val){
		upd(1, 0, sz-1, indx, val);
	}
	int query(int l, int r){
		return query(1, 0, sz-1, l, r);
	}
};
long long min_total_length(std::vector<signed> r, std::vector<signed> b) {
	int n = r.size(), m = b.size();
	vector<pair<int, int> > a(n+m);
	for(int i = 0; i < n; i++) a[i] = {r[i], 0};
	for(int i = 0; i < m; i++) a[i+n]= {b[i], 1};
	sort(a.begin(), a.end());
	
	vector<int> prev(n+m), next(n+m);
	prev[0] = 0;
	for(int i = 1; i < a.size(); i++){
		if(a[i].second == a[i-1].second){
			prev[i] = prev[i-1];
		}else{
			prev[i] = i;
		}
	}
	next[n+m-1] = n+m-1;
	for(int i = n + m - 2; i >= 0; i--){
		if(a[i].second == a[i+1].second){
			next[i] = next[i+1];
		}else{
			next[i] = i;
		}
	}
	for(int i = 0; i < n+m; i++){
		cerr<<i<<": "<<a[i].first<<" "<<a[i].second<<" "<<prev[i]<<" "<<next[i]<<endl;
	}
	vector<int> dp(n+m);
	for(int i = 0; i <= next[0]; i++){
		dp[i] = INF;
	}
	
	for(int i = next[0]+1; i < n+m; i++){
			
		// int j = prev[i];
		// int sumR = 0;
		// for(int k = j; k <= i; k++){
		// 	sumR += a[k].first;
		// }
		// int ans = INF;
		// int sumL = 0;
		// int dR = (i - j + 1);	
		// for(int k = j-1; k >= prev[j-1]; k--){
		// 	int dL = (j - k);
		// 	sumL += a[k].first;
		// 	int cost = (k == 0?0:dp[k-1]);
		// 	cost += (a[j-1].first*dL - sumL);
		// 	cost += (sumR - a[j].first*dR);
		// 	cost += max(d1, d2)
		// }
		int j = prev[i];
		int d1 = (i - j + 1);
		int ans = INF;
		int sumA = 0, sumB = 0;
		for(int k = i; k >= j; k--){
			sumA += a[k].first;
		}
		for(int k = j-1; k >= prev[j-1]; k--){
			sumB += a[k].first;
			int d2 = (j - k);
			int cost = min((k?dp[k-1]:0), dp[k]) + (max(d1, d2)*(a[j].first - a[j-1].first)) + (a[j-1].first*d2 - sumB) + (sumA - a[j].first*d1);
			ans = min(ans, cost);
		}
		dp[i] = ans;
		cerr<<"DP "<<i<<" "<<dp[i]<<endl;
		cerr<<"DP "<<i<<" "<<dp[i]<<endl;
	}
	return dp[n+m-1];
}
컴파일 시 표준 에러 (stderr) 메시지
wiring.cpp: In function 'long long int min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:57:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 1; i < a.size(); i++){
                 ~~^~~~~~~~~~| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |