#include "dungeons.h"
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define m_p make_pair
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
typedef long long ll;
const int N = 400005;
const int m = 28;
const ll INF = 1000000009000000009;
int n;
vector<int> S, P, W, L;
vector<int> t[N];
ll st[m][N];
int ut[m][N];
void dfst(int x, int j)
{
if (x == n || S[x] >= (1 << j))
{
st[j][x] = 0;
ut[j][x] = x;
}
for (int i = 0; i < sz(t[x]); ++i)
{
int h = t[x][i];
ut[j][h] = ut[j][x];
st[j][h] = st[j][x] + S[h];
dfst(h, j);
}
}
pair<int, ll> u[m][N];
//////////////////////////////////////////////////////////////
vector<vector<int> > vv;
int c[N];
bool dfsc(int x, int j)
{
c[x] = 1;
int h = u[j][x].fi;
if (!c[h])
{
if (dfsc(h, j))
{
c[x] = 2;
return true;
}
}
else if (c[h] == 1)
{
vector<int> v;
while (h != x)
{
v.push_back(h);
h = u[j][h].fi;
}
v.push_back(x);
vv.push_back(v);
c[x] = 2;
return true;
}
c[x] = 2;
return false;
}
int minc[m][N];
ll sc[m][N];
vector<pair<int, ll> > g[N];
int q[N];
ll d[m][N];
void dfs0(int x, int j)
{
q[x] = 1;
for (int i = 0; i < g[x].size(); ++i)
{
int h = g[x][i].fi;
d[j][h] = d[j][x] + g[x][i].se;
dfs0(h, j);
q[x] += q[h];
}
for (int i = 0; i < g[x].size(); ++i)
{
int h = g[x][i].fi;
if (q[h] > q[g[x][0].fi])
{
swap(g[x][i], g[x][0]);
}
}
}
int tin[m][N], tout[m][N], ti[m], rtin[m][N];
int f[m][N];
int p0[m][N];
ll minf[m][N];
void dfs1(int x, int j)
{
tin[j][x] = ++ti[j];
rtin[j][tin[j][x]] = x;
for (int i = 0; i < g[x].size(); ++i)
{
int h = g[x][i].fi;
p0[j][h] = x;
if (i == 0)
{
f[j][h] = f[j][x];
minf[j][h] = minf[j][x];
minf[j][h] = min(minf[j][h], d[j][h] + S[h]);
}
else
{
f[j][h] = h;
minf[j][h] = d[j][h] + S[h];
}
dfs1(h, j);
}
tout[j][x] = ti[j];
}
ll minu[m][N * 4];
ll bu[N];
void bil(int j, int tl, int tr, int pos)
{
if (tl == tr)
{
minu[j][pos] = bu[tl];
return;
}
int m = (tl + tr) / 2;
bil(j, tl, m, pos * 2);
bil(j, m + 1, tr, pos * 2 + 1);
minu[j][pos] = min(minu[j][pos * 2], minu[j][pos * 2 + 1]);
}
void ubd(int j, int tl, int tr, int x, ll y, int pos)
{
if (tl == tr)
{
minu[j][pos] = y;
return;
}
int m = (tl + tr) / 2;
if (x <= m)
ubd(j, tl, m, x, y, pos * 2);
else
ubd(j, m + 1, tr, x, y, pos * 2 + 1);
minu[j][pos] = min(minu[j][pos * 2], minu[j][pos * 2 + 1]);
}
int qry(int j, int tl, int tr, int l, int r, ll y, int pos)
{
if (l > r)
return ti[j] + 1;
if (tl == l && tr == r)
{
if (minu[j][pos] > y)
return ti[j] + 1;
if (tl == tr)
return tl;
}
int m = (tl + tr) / 2;
int ans = qry(j, m + 1, tr, max(m + 1, l), r, y, pos * 2 + 1);
if (ans <= ti[j])
return ans;
return qry(j, tl, m, l, min(m, r), y, pos * 2);
}
int qry(int j, int x, ll y)
{
int qq = 0;
while (1)
{
++qq;
assert(qq <= 20);
if (minf[j][x] <= y)
{
int ans = qry(j, 1, ti[j], tin[j][f[j][x]], tin[j][x], y, 1);
assert(ans <= ti[j]);
return rtin[j][ans];
}
x = f[j][x];
if (d[j][x] == 0)
return x;
x = p0[j][x];
}
}
void init(int NN, std::vector<int> SS, std::vector<int> PP, std::vector<int> WW, std::vector<int> LL) {
n = NN;
S = SS;
P = PP;
W = WW;
L = LL;
for (int i = 0; i < n; ++i)
{
t[W[i]].push_back(i);
}
for (int j = 0; j < m; ++j)
{
vv.clear();
for (int i = 0; i <= n; ++i)
{
g[i].clear();
c[i] = 0;
}
dfst(n, j);
for (int x = 0; x < n; ++x)
{
if (S[x] >= (1 << j))
{
u[j][x] = m_p(ut[j][L[x]], P[x] + st[j][L[x]]);
}
}
u[j][n] = m_p(n, 0);
////////////////////////////////////////////////////////////////////////////
for (int x = 0; x <= n; ++x)
{
if (x == n || S[x] >= (1 << j))
{
if (!c[x])
{
dfsc(x, j);
}
}
}
for (int x = 0; x <= n; ++x)
{
c[x] = 0;
}
for (int i = 0; i < sz(vv); ++i)
{
c[vv[i][0]] = 1;
if (vv[i][0] == n)
{
assert(sz(vv[i]) == 1);
continue;
}
minc[j][vv[i][0]] = S[vv[i][0]];
for (int k = 0; k < sz(vv[i]); ++k)
{
minc[j][vv[i][0]] = min(minc[j][vv[i][0]], S[vv[i][k]]);
sc[j][vv[i][0]] += u[j][vv[i][k]].se;
}
}
for (int x = 0; x <= n; ++x)
{
if (x == n || S[x] >= (1 << j))
{
if (!c[x])
g[u[j][x].fi].push_back(m_p(x, u[j][x].se));
}
}
for (int x = 0; x <= n; ++x)
{
if (c[x])
{
dfs0(x, j);
f[j][x] = x;
if (x < n)
minf[j][x] = S[x];
dfs1(x, j);
}
}
for (int x = 0; x <= n; ++x)
{
if (x == n || S[x] >= (1 << j))
{
if (x != n)
bu[tin[j][x]] = d[j][x] + S[x];
//ubd(j, 1, ti[j], tin[j][x], d[j][x] + S[x], 1);
else
{
assert(d[j][x] == 0);
bu[tin[j][x]] = d[j][x];
//ubd(j, 1, ti[j], tin[j][x], d[j][x], 1);
}
}
}
bil(j, 1, ti[j], 1);
}
}
long long simulate(int x, int Z) {
ll z = Z;
int qq = 0;
while (x != n)
{
for (int j = m - 1; j >= 0; --j)
{
if (z >= (1 << j))
{
z += st[j][x];
x = ut[j][x];
/*while (x != n && z < S[x])
{
z += u[j][x].se;
x = u[j][x].fi;
}*/
while (x != n && z < S[x])
{
++qq;
int p = qry(j, x, z + d[j][x]);
z += d[j][x] - d[j][p];
x = p;
if (x != n && z < S[x])
{
ll q = (minc[j][x] - z);
if (q < 0)
q = 0;
else
q = (q / sc[j][x]);
z += q * sc[j][x];
if (z < S[x])
{
z += u[j][x].se;
x = u[j][x].fi;
}
}
}
if (x != n)
{
assert(z >= S[x]);
z += S[x];
x = W[x];
}
break;
}
}
}
assert(qq <= m * 3);
return z;
}
/*
3 2
2 6 9
3 1 2
2 2 3
1 0 1
0 1
2 3
*/
Compilation message
dungeons.cpp: In function 'void dfs0(int, int)':
dungeons.cpp:81:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
81 | for (int i = 0; i < g[x].size(); ++i)
| ~~^~~~~~~~~~~~~
dungeons.cpp:88:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
88 | for (int i = 0; i < g[x].size(); ++i)
| ~~^~~~~~~~~~~~~
dungeons.cpp: In function 'void dfs1(int, int)':
dungeons.cpp:106:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
106 | for (int i = 0; i < g[x].size(); ++i)
| ~~^~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
10 ms |
21076 KB |
Output is correct |
2 |
Correct |
10 ms |
21360 KB |
Output is correct |
3 |
Correct |
16 ms |
22376 KB |
Output is correct |
4 |
Correct |
178 ms |
92512 KB |
Output is correct |
5 |
Correct |
16 ms |
24240 KB |
Output is correct |
6 |
Correct |
170 ms |
92472 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
14 ms |
23856 KB |
Output is correct |
2 |
Correct |
1037 ms |
328520 KB |
Output is correct |
3 |
Correct |
1113 ms |
342172 KB |
Output is correct |
4 |
Correct |
2131 ms |
515104 KB |
Output is correct |
5 |
Correct |
3073 ms |
481448 KB |
Output is correct |
6 |
Correct |
1041 ms |
328484 KB |
Output is correct |
7 |
Correct |
625 ms |
345664 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
16 ms |
23636 KB |
Output is correct |
2 |
Correct |
262 ms |
123188 KB |
Output is correct |
3 |
Correct |
237 ms |
129984 KB |
Output is correct |
4 |
Correct |
100 ms |
58912 KB |
Output is correct |
5 |
Correct |
90 ms |
60900 KB |
Output is correct |
6 |
Correct |
318 ms |
123756 KB |
Output is correct |
7 |
Correct |
287 ms |
127220 KB |
Output is correct |
8 |
Correct |
111 ms |
62772 KB |
Output is correct |
9 |
Correct |
115 ms |
54476 KB |
Output is correct |
10 |
Correct |
103 ms |
55324 KB |
Output is correct |
11 |
Correct |
301 ms |
131364 KB |
Output is correct |
12 |
Correct |
392 ms |
135964 KB |
Output is correct |
13 |
Correct |
217 ms |
135124 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
16 ms |
23636 KB |
Output is correct |
2 |
Correct |
262 ms |
123188 KB |
Output is correct |
3 |
Correct |
237 ms |
129984 KB |
Output is correct |
4 |
Correct |
100 ms |
58912 KB |
Output is correct |
5 |
Correct |
90 ms |
60900 KB |
Output is correct |
6 |
Correct |
318 ms |
123756 KB |
Output is correct |
7 |
Correct |
287 ms |
127220 KB |
Output is correct |
8 |
Correct |
111 ms |
62772 KB |
Output is correct |
9 |
Correct |
115 ms |
54476 KB |
Output is correct |
10 |
Correct |
103 ms |
55324 KB |
Output is correct |
11 |
Correct |
301 ms |
131364 KB |
Output is correct |
12 |
Correct |
392 ms |
135964 KB |
Output is correct |
13 |
Correct |
217 ms |
135124 KB |
Output is correct |
14 |
Correct |
13 ms |
22740 KB |
Output is correct |
15 |
Correct |
169 ms |
79788 KB |
Output is correct |
16 |
Correct |
270 ms |
126788 KB |
Output is correct |
17 |
Correct |
126 ms |
82252 KB |
Output is correct |
18 |
Correct |
128 ms |
82284 KB |
Output is correct |
19 |
Correct |
297 ms |
130696 KB |
Output is correct |
20 |
Correct |
127 ms |
79432 KB |
Output is correct |
21 |
Correct |
145 ms |
82500 KB |
Output is correct |
22 |
Correct |
182 ms |
120412 KB |
Output is correct |
23 |
Correct |
285 ms |
120176 KB |
Output is correct |
24 |
Correct |
318 ms |
127740 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
16 ms |
23636 KB |
Output is correct |
2 |
Correct |
262 ms |
123188 KB |
Output is correct |
3 |
Correct |
237 ms |
129984 KB |
Output is correct |
4 |
Correct |
100 ms |
58912 KB |
Output is correct |
5 |
Correct |
90 ms |
60900 KB |
Output is correct |
6 |
Correct |
318 ms |
123756 KB |
Output is correct |
7 |
Correct |
287 ms |
127220 KB |
Output is correct |
8 |
Correct |
111 ms |
62772 KB |
Output is correct |
9 |
Correct |
115 ms |
54476 KB |
Output is correct |
10 |
Correct |
103 ms |
55324 KB |
Output is correct |
11 |
Correct |
301 ms |
131364 KB |
Output is correct |
12 |
Correct |
392 ms |
135964 KB |
Output is correct |
13 |
Correct |
217 ms |
135124 KB |
Output is correct |
14 |
Correct |
13 ms |
22740 KB |
Output is correct |
15 |
Correct |
169 ms |
79788 KB |
Output is correct |
16 |
Correct |
270 ms |
126788 KB |
Output is correct |
17 |
Correct |
126 ms |
82252 KB |
Output is correct |
18 |
Correct |
128 ms |
82284 KB |
Output is correct |
19 |
Correct |
297 ms |
130696 KB |
Output is correct |
20 |
Correct |
127 ms |
79432 KB |
Output is correct |
21 |
Correct |
145 ms |
82500 KB |
Output is correct |
22 |
Correct |
182 ms |
120412 KB |
Output is correct |
23 |
Correct |
285 ms |
120176 KB |
Output is correct |
24 |
Correct |
318 ms |
127740 KB |
Output is correct |
25 |
Correct |
228 ms |
129128 KB |
Output is correct |
26 |
Correct |
268 ms |
129496 KB |
Output is correct |
27 |
Correct |
113 ms |
58148 KB |
Output is correct |
28 |
Correct |
120 ms |
58128 KB |
Output is correct |
29 |
Correct |
333 ms |
129824 KB |
Output is correct |
30 |
Correct |
107 ms |
62628 KB |
Output is correct |
31 |
Correct |
103 ms |
62672 KB |
Output is correct |
32 |
Correct |
238 ms |
108140 KB |
Output is correct |
33 |
Correct |
376 ms |
134072 KB |
Output is correct |
34 |
Correct |
467 ms |
115644 KB |
Output is correct |
35 |
Correct |
328 ms |
128756 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
14 ms |
23856 KB |
Output is correct |
2 |
Correct |
1037 ms |
328520 KB |
Output is correct |
3 |
Correct |
1113 ms |
342172 KB |
Output is correct |
4 |
Correct |
2131 ms |
515104 KB |
Output is correct |
5 |
Correct |
3073 ms |
481448 KB |
Output is correct |
6 |
Correct |
1041 ms |
328484 KB |
Output is correct |
7 |
Correct |
625 ms |
345664 KB |
Output is correct |
8 |
Correct |
16 ms |
23636 KB |
Output is correct |
9 |
Correct |
262 ms |
123188 KB |
Output is correct |
10 |
Correct |
237 ms |
129984 KB |
Output is correct |
11 |
Correct |
100 ms |
58912 KB |
Output is correct |
12 |
Correct |
90 ms |
60900 KB |
Output is correct |
13 |
Correct |
318 ms |
123756 KB |
Output is correct |
14 |
Correct |
287 ms |
127220 KB |
Output is correct |
15 |
Correct |
111 ms |
62772 KB |
Output is correct |
16 |
Correct |
115 ms |
54476 KB |
Output is correct |
17 |
Correct |
103 ms |
55324 KB |
Output is correct |
18 |
Correct |
301 ms |
131364 KB |
Output is correct |
19 |
Correct |
392 ms |
135964 KB |
Output is correct |
20 |
Correct |
217 ms |
135124 KB |
Output is correct |
21 |
Correct |
13 ms |
22740 KB |
Output is correct |
22 |
Correct |
169 ms |
79788 KB |
Output is correct |
23 |
Correct |
270 ms |
126788 KB |
Output is correct |
24 |
Correct |
126 ms |
82252 KB |
Output is correct |
25 |
Correct |
128 ms |
82284 KB |
Output is correct |
26 |
Correct |
297 ms |
130696 KB |
Output is correct |
27 |
Correct |
127 ms |
79432 KB |
Output is correct |
28 |
Correct |
145 ms |
82500 KB |
Output is correct |
29 |
Correct |
182 ms |
120412 KB |
Output is correct |
30 |
Correct |
285 ms |
120176 KB |
Output is correct |
31 |
Correct |
318 ms |
127740 KB |
Output is correct |
32 |
Correct |
228 ms |
129128 KB |
Output is correct |
33 |
Correct |
268 ms |
129496 KB |
Output is correct |
34 |
Correct |
113 ms |
58148 KB |
Output is correct |
35 |
Correct |
120 ms |
58128 KB |
Output is correct |
36 |
Correct |
333 ms |
129824 KB |
Output is correct |
37 |
Correct |
107 ms |
62628 KB |
Output is correct |
38 |
Correct |
103 ms |
62672 KB |
Output is correct |
39 |
Correct |
238 ms |
108140 KB |
Output is correct |
40 |
Correct |
376 ms |
134072 KB |
Output is correct |
41 |
Correct |
467 ms |
115644 KB |
Output is correct |
42 |
Correct |
328 ms |
128756 KB |
Output is correct |
43 |
Correct |
10 ms |
20904 KB |
Output is correct |
44 |
Correct |
14 ms |
23892 KB |
Output is correct |
45 |
Correct |
5861 ms |
870536 KB |
Output is correct |
46 |
Correct |
2217 ms |
312696 KB |
Output is correct |
47 |
Correct |
2466 ms |
313004 KB |
Output is correct |
48 |
Correct |
4255 ms |
905700 KB |
Output is correct |
49 |
Correct |
6234 ms |
882148 KB |
Output is correct |
50 |
Correct |
1084 ms |
337748 KB |
Output is correct |
51 |
Correct |
4396 ms |
908536 KB |
Output is correct |
52 |
Correct |
1052 ms |
335784 KB |
Output is correct |
53 |
Correct |
5045 ms |
715780 KB |
Output is correct |
54 |
Correct |
2605 ms |
907120 KB |
Output is correct |
55 |
Correct |
2159 ms |
774496 KB |
Output is correct |
56 |
Correct |
6057 ms |
877244 KB |
Output is correct |
57 |
Correct |
6022 ms |
877996 KB |
Output is correct |
58 |
Correct |
6297 ms |
887200 KB |
Output is correct |
59 |
Correct |
6305 ms |
892456 KB |
Output is correct |
60 |
Correct |
5533 ms |
610080 KB |
Output is correct |
61 |
Correct |
6098 ms |
637624 KB |
Output is correct |