#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include "wiring.h"
using namespace std;
const int INF = 1000000005;
const int MAX = 100005;
const int TOF = 5;
vector<pair<int, int> > states;
int blue[MAX], red[MAX], n, m;
long long dp[MAX * TOF * 4];
void add_state(int i, int j)
{
states.push_back(make_pair(i, j));
}
void create_states(int b, int r)
{
if (blue[b] < red[r])
{
int lb = b + 1;
while (lb < n && blue[lb] < red[r])
lb++;
int nxt_pos = INF;
if (lb != n)
nxt_pos = blue[lb];
int pr = r;
while (pr < m && red[pr] < nxt_pos)
{
for (int i = b; i < min(b + TOF, lb); i++)
add_state(i, pr);
for (int i = lb - 1; i >= max(lb - TOF, b); i--)
add_state(i, pr);
int mid = b + pr - r;
for (int i = max(b, mid - TOF); i < min(mid + TOF, lb); i++)
add_state(i, pr);
pr++;
}
if (lb != n)
create_states(lb, r);
}
else
{
int lr = r + 1;
while (lr < m && red[lr] < blue[b])
lr++;
int nxt_pos = INF;
if (lr != m)
nxt_pos = red[lr];
int pb = b;
while (pb < n && blue[pb] < nxt_pos)
{
for (int i = r; i < min(r + TOF, lr); i++)
add_state(pb, i);
for (int i = lr - 1; i >= max(lr - TOF, r); i--)
add_state(pb, i);
int mid = r + pb - b;
for (int i = max(r, mid - TOF); i < min(mid + TOF, lr); i++)
add_state(pb, i);
pb++;
}
if (lr != m)
create_states(b, lr);
}
}
int mp(pair<int, int> p)
{
int id = lower_bound(states.begin(), states.end(), p) - states.begin();
if (id < states.size() && states[id] == p)
return id;
return -1;
}
int abs(int x)
{
return (x > 0 ? x : -x);
}
long long get(int id)
{
if (id == -1)
return 1e18;
if (dp[id] != -1)
return dp[id];
dp[id] = 1e18;
int i = states[id].first, j = states[id].second;
if (!i && !j)
return dp[id] = abs(blue[i] - red[j]);
for (int ni = i; ni > i - 2; ni--)
for (int nj = j; nj > j - 2; nj--)
if (make_pair(ni, nj) != make_pair(i, j))
{
int nid = mp(make_pair(ni, nj));
dp[id] = min(dp[id], get(nid) + abs(blue[i] - red[j]));
}
return dp[id];
}
long long min_total_length(vector <int> _red, vector <int> _blue)
{
n = _blue.size();
m = _red.size();
for (int i = 0; i < n; i++)
blue[i] = _blue[i];
for (int i = 0; i < m; i++)
red[i] = _red[i];
create_states(0, 0);
sort(states.begin(), states.end());
states.resize(unique(states.begin(), states.end()) - states.begin());
memset(dp, -1, sizeof(dp));
return get(mp(make_pair(n - 1, m - 1)));
}
Compilation message
wiring.cpp: In function 'int mp(std::pair<int, int>)':
wiring.cpp:69:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if (id < states.size() && states[id] == p)
^
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
18428 KB |
Output is correct |
2 |
Correct |
0 ms |
18428 KB |
Output is correct |
3 |
Incorrect |
0 ms |
18428 KB |
3rd lines differ - on the 1st token, expected: '15280', found: '15412' |
4 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
3 ms |
18428 KB |
3rd lines differ - on the 1st token, expected: '904', found: '932' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
18428 KB |
Output is correct |
2 |
Correct |
0 ms |
18428 KB |
Output is correct |
3 |
Correct |
379 ms |
55076 KB |
Output is correct |
4 |
Correct |
636 ms |
71520 KB |
Output is correct |
5 |
Correct |
0 ms |
18428 KB |
Output is correct |
6 |
Correct |
0 ms |
18428 KB |
Output is correct |
7 |
Correct |
0 ms |
18428 KB |
Output is correct |
8 |
Correct |
6 ms |
18428 KB |
Output is correct |
9 |
Correct |
3 ms |
18428 KB |
Output is correct |
10 |
Correct |
0 ms |
18428 KB |
Output is correct |
11 |
Correct |
0 ms |
18428 KB |
Output is correct |
12 |
Correct |
0 ms |
18428 KB |
Output is correct |
13 |
Correct |
3 ms |
18428 KB |
Output is correct |
14 |
Correct |
0 ms |
18428 KB |
Output is correct |
15 |
Correct |
0 ms |
18428 KB |
Output is correct |
16 |
Correct |
0 ms |
18428 KB |
Output is correct |
17 |
Correct |
3 ms |
18572 KB |
Output is correct |
18 |
Correct |
409 ms |
55048 KB |
Output is correct |
19 |
Correct |
429 ms |
55040 KB |
Output is correct |
20 |
Correct |
643 ms |
71524 KB |
Output is correct |
21 |
Correct |
403 ms |
55028 KB |
Output is correct |
22 |
Correct |
449 ms |
74080 KB |
Output is correct |
23 |
Correct |
459 ms |
74080 KB |
Output is correct |
24 |
Correct |
456 ms |
74084 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
18428 KB |
Output is correct |
2 |
Runtime error |
349 ms |
69232 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
18428 KB |
Output is correct |
2 |
Correct |
0 ms |
18428 KB |
Output is correct |
3 |
Incorrect |
0 ms |
18428 KB |
3rd lines differ - on the 1st token, expected: '15280', found: '15412' |
4 |
Halted |
0 ms |
0 KB |
- |