제출 #72941

#제출 시각아이디문제언어결과실행 시간메모리
72941SmsS전선 연결 (IOI17_wiring)C++17
13 / 100
1070 ms6560 KiB
#include<bits/stdc++.h>
using namespace std;
#define for2(a,b,c) for(int a=b;a<c;a++)
#define ll long long
#include "wiring.h"

ll sub2(vector<int> r,vector<int> b){
	ll res = 0;
	int L = 0;
	int R = b.size()-1;
	while(L != r.size() && R != -1){
		res += b[R]-r[L];
		L++;
		R--;
	}
	while(R != -1){
		res += b[R]-r[L-1];
		R--;
	}
	while(L != r.size()){
		res += b[R+1]-r[L];
		L++;
	}
	return res;
}

#define PII pair<int,int>
#define F first
#define S second
#define pb push_back
#define all(x) (x).begin(),(x).end()
const int maxn = 200100;
ll dp[maxn];
ll sub3(vector<int> v1,vector<int> v2){
	vector<int> v[2];
	vector<PII> V;
	for(auto x : v1) {
		v[0].pb(x);
		V.pb({x,0});
	}
	for(auto x : v2){
		v[1].pb(x);
		V.pb({x,1});
	}
	sort(all(V));
	int n = V.size();
	for2(i,0,n){
		int x = V[i].F;
		bool t = V[i].S;

		dp[i] = 1e18;
		
		ll tmp = 1e18;
		int ind =  lower_bound(all(v[!t]),x)-v[!t].begin();
		if(ind != v[!t].size()) tmp = min(tmp,(ll)v[!t][ind]-x);
		ind --;
		if(ind >= 0)            tmp = min(tmp,(ll)x-v[!t][ind]);
		if(i) tmp += dp[i-1];
		dp[i] = tmp;	
		

		tmp = 0;
		ll cnt = 0;
		for(int j = i; j >= 0; j--){
			if(j != i) tmp += cnt*(V[j+1].F-V[j].F);
///			if(i == 5) cout << cnt << ' ' << (V[i+1].F) << ' ' << (V[i].F) << endl;
			if(V[j].S != V[i].S) break;
			cnt++;
		}
//		if(i == 5) cout << tmp << endl;
		int k = 0;
		for(int j = max(0ll,i-2*cnt+1); j <= i-cnt; j++){
			if(V[j].S == V[i].S) break;
			if(j != i-2*cnt+1) tmp += k*(V[j+1].F-V[j].F);
			k++;
		}
//		if(i == 5) cout << tmp << endl;
	
		if(k != cnt){
///			cout << "   " << i << ' ';
			///cout << dp[i] << endl;	

			continue;
		}
		dp[i] = min(dp[i],dp[i-2*cnt]+tmp);

///		cout << i << ' ';
///		cout << dp[i] << endl;	
//		cout << tmp << endl;
	}
	return dp[V.size()-1];
}

long long min_total_length(std::vector<int> r, std::vector<int> b) {
	if(r.back() < b[0]) return sub2(r,b);
	return sub3(r,b);
}

컴파일 시 표준 에러 (stderr) 메시지

wiring.cpp: In function 'long long int sub2(std::vector<int>, std::vector<int>)':
wiring.cpp:11:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while(L != r.size() && R != -1){
        ~~^~~~~~~~~~~
wiring.cpp:20:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while(L != r.size()){
        ~~^~~~~~~~~~~
wiring.cpp: In function 'long long int sub3(std::vector<int>, std::vector<int>)':
wiring.cpp:55:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(ind != v[!t].size()) tmp = min(tmp,(ll)v[!t][ind]-x);
      ~~~~^~~~~~~~~~~~~~~
#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...