Submission #1314384

#TimeUsernameProblemLanguageResultExecution timeMemory
1314384CyanberryObstacles for a Llama (IOI25_obstacles)C++20
44 / 100
2095 ms19120 KiB
#include "obstacles.h"
#include <bits/stdc++.h>
using namespace std;

set<int> walls;
vector<int> T, H;
vector<pair<int, int>> mem;
void initialize(std::vector<int> temp, std::vector<int> hum) {
	mem.assign(hum.size(), {-2, -2});
	int maxT = 0;
	T = temp, H = hum;
	for (int i = 0; i < T.size(); ++i) {
		maxT = max(maxT, T[i]);
	}
	for (int i = 0; i < H.size(); ++i) {
		if (H[i] >= maxT) {
			walls.insert(i);
		}
	}
}

pair<int, int> down(int a) {
	if (mem[a].first != -2) return mem[a];
	int l = a-1, r = a+1, req = H[a];
	for (int i = 0; i < T.size(); ++i) {
		while(l >= 0 && T[i] > H[l]) {
			req = min(req, H[l]);
			if (i == 0 && mem[l].first != -2) {
				mem[a] = mem[l];
				return mem[l];
			}
			--l;
		}
		while(r < H.size() && T[i] > H[r]) {
			req = min(req, H[r]);
			if (i == 0 && mem[r].first != -2) {
				mem[a] = mem[r];
				return mem[r];
			}
			++r;
		}
		if (T[i] <= req) {
			return {l, r};
		}
	}
	mem[a] = {l, r};
	return {l, r};
}

bool can_reach(int L, int R, int S, int D) {
	return down(S) == down(D);
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...