제출 #585594

#제출 시각아이디문제언어결과실행 시간메모리
5855941ne전선 연결 (IOI17_wiring)C++14
0 / 100
20 ms332 KiB
#include "wiring.h"
#include<bits/stdc++.h>
using namespace std;
struct node{
	long long u,v,cost;	
};
const int maxn = 200005;
long long min_total_length(std::vector<int> r, std::vector<int> b) {
	int n = (int)r.size();
	int m = (int)b.size();
	vector<pair<int,int>>arr;
	for (auto x:r){
		arr.push_back({x,0});
	}
	for (auto y:b){
		arr.push_back({y,1});
	}
	sort(arr.begin(),arr.end());
	vector<vector<int>>nxt(n + m,vector<int>(2,n + m)),prev(n + m,vector<int>(2,n + m));
	int rr = n + m,bb = n + m;
	for (int i = n + m - 1;i>=0;--i){
		nxt[i][0] = bb;
		nxt[i][1] = rr;
		if (arr[i].second == 0){
			rr = i;
		}
		else{
			bb = i;
		}
	}
	rr = -1,bb = -1;
	for (int i = 0;i<n + m;++i){
		prev[i][0] = bb;
		prev[i][1] = rr;
		if (arr[i].second == 0){
			rr = i;
		}
		else{
			bb = i;
		}
	}
	const long long MAX = 1e15;
	bitset<maxn>bit;
	function<long long(int)>dfs = [&](int u){
		if (u == n + m){
			if (bit.count() == n + m)return 0LL;
			return MAX;
		}
		long long ans = MAX;
		long long temp = 0;
		if (arr[u].second == 0){
			if (nxt[u][0]==n + m){
				temp = 0;
			}
			else{
				temp = arr[nxt[u][0]].first - arr[u].first;
				int temp1 = bit[u];
				int temp2 = bit[nxt[u][0]];
				bit[u] = 1;
				bit[nxt[u][0]] = 1;
				ans = min(ans,dfs(nxt[u][0]) + temp);
				bit[nxt[u][0]] = temp2;
				bit[u] = temp1;
			}
			if (bit[u]){
				ans = min(ans,dfs(min(nxt[u][0],nxt[u][1])));
			}
			if (!bit[u] && prev[u][0]!=-1){
				int temp1 = bit[u];
				int temp2 = bit[prev[u][0]];
				bit[u] = true;
				bit[prev[u][0]] = true;
				ans = min(dfs(u) + arr[u].first - arr[prev[u][0]].first,ans);
				bit[prev[u][0]] = temp2;
				bit[u] = temp1;
			}
		}
		else{
			if (nxt[u][1]==n + m){
				temp = 0;
			}
			else{
				temp = arr[nxt[u][1]].first - arr[u].first;
				int temp1 = bit[u];
				int temp2 = bit[nxt[u][1]];
				bit[u] = 1;
				bit[nxt[u][1]] = 1;
				ans = min(ans,dfs(nxt[u][1]) + temp);
				bit[nxt[u][1]] = temp2;
				bit[u] = temp1;
			}
			if (bit[u]){
				ans = min(ans,dfs(min(nxt[u][0],nxt[u][1])));
			}
			if (!bit[u] && prev[u][1]!=-1){
				int temp1 = bit[u];
				int temp2 = bit[prev[u][1]];
				bit[u] = true;
				bit[prev[u][1]] = true;
				ans = min(dfs(u) + arr[u].first - arr[prev[u][1]].first,ans);
				bit[prev[u][1]] = temp2;
				bit[u] = temp1;
			}
		}
		return ans;
	};
	long long ans = dfs(0);
	return ans;
}

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

wiring.cpp: In lambda function:
wiring.cpp:46:20: warning: comparison of integer expressions of different signedness: 'std::size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   46 |    if (bit.count() == n + m)return 0LL;
      |        ~~~~~~~~~~~~^~~~~~~~
#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...