#include "dungeons.h"
#include <bits/stdc++.h>
using namespace std;
#define n N
#define s S
#define p P
#define w W
#define l L
#define int long long
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define fi first
#define se second
const int logn = 31;
const int inf = 4e16 + 42;
int n;
vector<int> win_str, lose_str, win_pos, lose_pos;
int k;
vector<vector<vector<int> > > lift_str;
vector<vector<vector<int> > > lift_pos;
map<int, int> conv;
vector<int> val;
vector<int> cost;
void solve() {
for(int i = 0; i < n; i++) {
conv[win_str[i]] = -1;
}
//conv[inf] = -1;
k = (int) conv.size();
val.assign(k, 0);
int val_idx = -1;
vector<pii > v;
for(const pii &p : conv) {
val_idx++;
v.pb(mp(p.fi, val_idx));
val[val_idx] = p.fi;
}
conv.clear();
for(const pii &p : v) {
conv[p.fi] = p.se;
}
lift_str = lift_pos = vector<vector<vector<int> > > (k, vector<vector<int> > (1 + n, vector<int> (logn, 0)));
int minimum_value = 0; // these are already won
for(int cur_idx = 0; cur_idx < k; cur_idx++) {
vector<vector<int> > &cur_lift_str = lift_str[cur_idx];
vector<vector<int> > &cur_lift_pos = lift_pos[cur_idx];
for(int i = 0; i <= n; i++) {
if(win_str[i] <= minimum_value) {
cur_lift_str[i][0] = win_str[i];
cur_lift_pos[i][0] = win_pos[i];
} else {
cur_lift_str[i][0] = lose_str[i];
cur_lift_pos[i][0] = lose_pos[i];
}
}
for(int j = 1; j < logn; j++) {
for(int i = 0; i <= n; i++) {
cur_lift_str[i][j] = cur_lift_str[i][j - 1] + cur_lift_str[cur_lift_pos[i][j - 1]][j - 1];
cur_lift_pos[i][j] = cur_lift_pos[cur_lift_pos[i][j - 1]][j - 1];
}
}
minimum_value = val[cur_idx];
}
cost.assign(1 + n, 0);
for(int i = n - 1; i >= 0; i--) {
cost[i] = win_str[i] + cost[win_pos[i]];
}
}
int query(int pos, int strength) {
/*if(strength >= k) {
return strength + cost[pos];
}
for(int j = logn - 1; j >= 0; j--) {
if(strength + lift_str[pos][j] < k) {
strength += lift_str[pos][j];
pos = lift_pos[pos][j];
}
}
strength += lift_str[pos][0];
pos = lift_pos[pos][0];
return strength + cost[pos];*/
for(int cur_idx = 0; cur_idx < k; cur_idx++) {
if(strength >= val[cur_idx]) {
continue;
}
//cout << cur_idx << " - " << val[cur_idx] << ": " << pos << " " << strength << endl;
for(int j = logn - 1; j >= 0; j--) {
if(strength + lift_str[cur_idx][pos][j] < val[cur_idx]) {
strength += lift_str[cur_idx][pos][j];
pos = lift_pos[cur_idx][pos][j];
}
}
//cout << cur_idx << " - " << val[cur_idx] << ": " << pos << " " << strength << endl;
strength += lift_str[cur_idx][pos][0];
pos = lift_pos[cur_idx][pos][0];
}
//cout << "last one: " << pos << " " << strength << endl;
return strength + cost[pos];
}
#undef n
#undef s
#undef p
#undef w
#undef l
void init(signed n, vector<signed> s, vector<signed> p, vector<signed> w, vector<signed> l) {
N = n;
win_str = lose_str = win_pos = lose_pos = (vector<int> (n + 1, 0));
for(int i = 0; i < n; i++) {
win_str[i] = s[i];
lose_str[i] = p[i];
win_pos[i] = w[i];
lose_pos[i] = l[i];
}
win_str[n] = 0;
lose_str[n] = 0;
win_pos[n] = n;
lose_pos[n] = n;
solve();
}
int simulate(signed x, signed z) {
return query(x, z);
}
/*
3 1
2 6 9
3 1 2
2 2 3
1 0 1
0 1
*/
/*
3 2
2 6 9
3 1 2
2 2 3
1 0 1
0 1
2 3
*/
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
340 KB |
Output is correct |
3 |
Correct |
11 ms |
11852 KB |
Output is correct |
4 |
Runtime error |
1317 ms |
2097152 KB |
Execution killed with signal 9 |
5 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
568 ms |
549352 KB |
Output is correct |
2 |
Runtime error |
1114 ms |
2097152 KB |
Execution killed with signal 9 |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
1236 KB |
Output is correct |
2 |
Correct |
101 ms |
46256 KB |
Output is correct |
3 |
Correct |
122 ms |
46208 KB |
Output is correct |
4 |
Correct |
97 ms |
45772 KB |
Output is correct |
5 |
Correct |
93 ms |
45716 KB |
Output is correct |
6 |
Correct |
113 ms |
45956 KB |
Output is correct |
7 |
Correct |
113 ms |
46540 KB |
Output is correct |
8 |
Correct |
93 ms |
46284 KB |
Output is correct |
9 |
Correct |
101 ms |
46224 KB |
Output is correct |
10 |
Correct |
90 ms |
46156 KB |
Output is correct |
11 |
Correct |
117 ms |
46528 KB |
Output is correct |
12 |
Correct |
209 ms |
46452 KB |
Output is correct |
13 |
Correct |
216 ms |
46540 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
1236 KB |
Output is correct |
2 |
Correct |
101 ms |
46256 KB |
Output is correct |
3 |
Correct |
122 ms |
46208 KB |
Output is correct |
4 |
Correct |
97 ms |
45772 KB |
Output is correct |
5 |
Correct |
93 ms |
45716 KB |
Output is correct |
6 |
Correct |
113 ms |
45956 KB |
Output is correct |
7 |
Correct |
113 ms |
46540 KB |
Output is correct |
8 |
Correct |
93 ms |
46284 KB |
Output is correct |
9 |
Correct |
101 ms |
46224 KB |
Output is correct |
10 |
Correct |
90 ms |
46156 KB |
Output is correct |
11 |
Correct |
117 ms |
46528 KB |
Output is correct |
12 |
Correct |
209 ms |
46452 KB |
Output is correct |
13 |
Correct |
216 ms |
46540 KB |
Output is correct |
14 |
Correct |
5 ms |
2772 KB |
Output is correct |
15 |
Correct |
219 ms |
101452 KB |
Output is correct |
16 |
Correct |
290 ms |
129008 KB |
Output is correct |
17 |
Correct |
299 ms |
155804 KB |
Output is correct |
18 |
Correct |
347 ms |
155920 KB |
Output is correct |
19 |
Correct |
363 ms |
156120 KB |
Output is correct |
20 |
Correct |
244 ms |
101052 KB |
Output is correct |
21 |
Correct |
306 ms |
128628 KB |
Output is correct |
22 |
Correct |
169 ms |
73840 KB |
Output is correct |
23 |
Correct |
383 ms |
128696 KB |
Output is correct |
24 |
Correct |
388 ms |
101324 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
1236 KB |
Output is correct |
2 |
Correct |
101 ms |
46256 KB |
Output is correct |
3 |
Correct |
122 ms |
46208 KB |
Output is correct |
4 |
Correct |
97 ms |
45772 KB |
Output is correct |
5 |
Correct |
93 ms |
45716 KB |
Output is correct |
6 |
Correct |
113 ms |
45956 KB |
Output is correct |
7 |
Correct |
113 ms |
46540 KB |
Output is correct |
8 |
Correct |
93 ms |
46284 KB |
Output is correct |
9 |
Correct |
101 ms |
46224 KB |
Output is correct |
10 |
Correct |
90 ms |
46156 KB |
Output is correct |
11 |
Correct |
117 ms |
46528 KB |
Output is correct |
12 |
Correct |
209 ms |
46452 KB |
Output is correct |
13 |
Correct |
216 ms |
46540 KB |
Output is correct |
14 |
Correct |
5 ms |
2772 KB |
Output is correct |
15 |
Correct |
219 ms |
101452 KB |
Output is correct |
16 |
Correct |
290 ms |
129008 KB |
Output is correct |
17 |
Correct |
299 ms |
155804 KB |
Output is correct |
18 |
Correct |
347 ms |
155920 KB |
Output is correct |
19 |
Correct |
363 ms |
156120 KB |
Output is correct |
20 |
Correct |
244 ms |
101052 KB |
Output is correct |
21 |
Correct |
306 ms |
128628 KB |
Output is correct |
22 |
Correct |
169 ms |
73840 KB |
Output is correct |
23 |
Correct |
383 ms |
128696 KB |
Output is correct |
24 |
Correct |
388 ms |
101324 KB |
Output is correct |
25 |
Runtime error |
1050 ms |
2097152 KB |
Execution killed with signal 9 |
26 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
568 ms |
549352 KB |
Output is correct |
2 |
Runtime error |
1114 ms |
2097152 KB |
Execution killed with signal 9 |
3 |
Halted |
0 ms |
0 KB |
- |