제출 #1232687

#제출 시각아이디문제언어결과실행 시간메모리
1232687rythm_of_knight던전 (IOI21_dungeons)C++17
13 / 100
70 ms31816 KiB
#include "dungeons.h"
#include <bits/stdc++.h>
#define ar array
using namespace std;
typedef long long ll;

const int MXN = 4e5 + 45;
int s[MXN], w[MXN], n;
ll add[MXN];
ar <ll, 3> st[24][MXN];

void init(int N, vector<int> S, vector<int> p, vector<int> W, vector<int> l) {
	n = N;
	for (int i = 0; i < n; i++)
		s[i] = S[i], w[i] = W[i], add[i] = S[i];
	for (int i = n - 1; i >= 0; i--) {
		ll cur = s[i] + s[i];
		int cnt = 0;
		while (w[i] < n && s[w[i]] <= cur) {
			cnt++;
			cur += add[w[i]];
			add[i] += add[w[i]];
			w[i] = w[w[i]];
		}
		if (cnt > 27) {
			int ta = 1, tb = 0;
			while (cnt--) {
				cout << "BLYAAAAAAT\n" << flush;
				// cout << ta / tb << '\n' << flush;
			}
		}
	}
	for (int i = 0; i < n; i++) {
		st[0][i][0] = l[i];
		st[0][i][1] = s[i] + p[i] - s[l[i]];
		st[0][i][2] = max(0ll, st[0][i][1]);
	}
	for (int b = 1; b < 24; b++) {
		for (int i = 0; i < n; i++) {
			int h = st[b - 1][i][0];
			st[b][i][0] = st[b - 1][h][0];
			st[b][i][1] = st[b - 1][i][1] + st[b - 1][h][1];
			st[b][i][2] = max(st[b - 1][i][2], st[b - 1][i][1] + st[b - 1][h][2]);
		}
	}
}

ll simulate(int x, int z) {
	ll cur = z;
	int cnt = 0;
	while (x < n) {
		if (s[x] > cur) {
			ll now = cur - s[x];
			int b = 23;
			while (b >= 0) {
				cnt++;
				auto &tmp = st[b][x];
				if (tmp[2] + now < 0) {
					now += tmp[1];
					x = tmp[0];
				}
				b--;
			}
			now += st[0][x][1];
			x = st[0][x][0];
			cur = s[x] + now;
		} else {
			cnt++;
			cur += add[x];
			x = w[x];
		}
	}
	if (cnt > 30)
		return -1;
	return cur;
}

#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...
#Verdict Execution timeMemoryGrader output
Fetching results...