제출 #781235

#제출 시각아이디문제언어결과실행 시간메모리
781235GusterGoose27전선 연결 (IOI17_wiring)C++17
0 / 100
1069 ms180316 KiB
#include "wiring.h"

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int MAXN = 1e5+5;
const ll inf = 1e18;
map<ll, ll> dp;
int nxt[MAXN][2];
int n;

int _abs(int v) {
	return v < 0 ? -v : v;
}

ll hsh(int i, int j, bool lmatch, bool rmatch) {
	return (ll) 4*i*n+4*j+2*lmatch+rmatch;
}

ll make_dp(int i, int j, bool lmatch, bool rmatch, vector<int> &r, vector<int> &b) {
	int cur = i;
	for (int _ = 0; _ < 3; _++) cur = nxt[cur][_&1];
	if (cur <= j) return inf;
	cur = j;
	for (int _ = 1; _ < 4; _++) cur = nxt[cur][_&1];
	if (cur <= i) return inf;
	int cost = _abs(r[i]-b[j]);
	if (i == r.size()-1 && j == b.size()-1) {
		return cost;
	}
	ll cur_hsh = hsh(i, j, lmatch, rmatch);
	if (dp.find(cur_hsh) != dp.end()) return dp[cur_hsh];
	ll ans = inf;
	if (lmatch) ans = min(ans, make_dp(i+1, j, 0, rmatch, r, b));
	ans = min(ans, make_dp(i+1, j, 0, 1, r, b)+cost);
	if (rmatch) ans = min(ans, make_dp(i, j+1, lmatch, 0, r, b));;
	ans = min(ans, make_dp(i, j+1, 1, 0, r, b)+cost);
	dp[cur_hsh] = ans;
	// cerr << i << ' ' << j << ' ' << lmatch << ' ' << rmatch << ' ' << ans << '\n';
	return ans;
}

ll min_total_length(vector<int> r, vector<int> b) {
	n = r.size()+b.size();
	int i = 0;
	nxt[r.size()][0] = b.size();
	nxt[b.size()][1] = r.size();
	for (int j = 0; j < b.size(); j++) {
		while (i < r.size() && r[i] < b[j]) i++;
		nxt[j][1] = i;
	}
	int j = 0;
	for (int i = 0; i < r.size(); i++) {
		while (j < b.size() && b[j] < r[i]) j++;
		nxt[i][0] = j;
	}
	ll ans = make_dp(0, 0, 0, 0, r, b);
	assert(dp.size() < 7*n);
	return ans;
}

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

wiring.cpp: In function 'll make_dp(int, int, bool, bool, std::vector<int>&, std::vector<int>&)':
wiring.cpp:32:8: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |  if (i == r.size()-1 && j == b.size()-1) {
      |      ~~^~~~~~~~~~~~~
wiring.cpp:32:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |  if (i == r.size()-1 && j == b.size()-1) {
      |                         ~~^~~~~~~~~~~~~
wiring.cpp: In function 'll min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:52:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |  for (int j = 0; j < b.size(); j++) {
      |                  ~~^~~~~~~~~~
wiring.cpp:53:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |   while (i < r.size() && r[i] < b[j]) i++;
      |          ~~^~~~~~~~~~
wiring.cpp:57:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |  for (int i = 0; i < r.size(); i++) {
      |                  ~~^~~~~~~~~~
wiring.cpp:58:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   58 |   while (j < b.size() && b[j] < r[i]) j++;
      |          ~~^~~~~~~~~~
In file included from /usr/include/c++/10/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
                 from wiring.cpp:3:
wiring.cpp:62:19: warning: comparison of integer expressions of different signedness: 'std::map<long long int, long long int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   62 |  assert(dp.size() < 7*n);
      |         ~~~~~~~~~~^~~~~
#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...