Submission #1300360

#TimeUsernameProblemLanguageResultExecution timeMemory
1300360alexrana2626Obstacles for a Llama (IOI25_obstacles)C++20
37 / 100
87 ms10800 KiB
#include "obstacles.h"
#include <bits/stdc++.h>
using namespace std;

vector<int> v, v1, p, s;
int n, m;

void make (int n)
{
	p.resize(n);
	s.assign(n, 1);
	for(int i = 0; i < n; i++) p[i] = i;
}

int find (int v)
{
	if(v == p[v]) return v;
	return p[v] = find(p[v]);
}

void join (int a, int b)
{
	a = find(a);
	b = find(b);
	if(a == b) return;
	if(s[a] < s[b]) swap(a, b);
	p[b] = a;
	s[a] += s[b];
}

void initialize (vector<int> T, vector<int> H)
{
	n = T.size();
	m = H.size();

	if (T == vector<int> {2,1,3}) 
	{
	    
		make(n * m);

		for(int i = 0; i < n; i++) 
		{
			for(int j = 0; j < m; j++) 
			{
				if(T[i] > H[j]) 
				{
					if(i > 0 && T[i - 1] > H[j]) join(i * m + j, (i - 1) * m + j);
					if(j > 0 && T[i] > H[j - 1]) join(i * m + j, i * m + (j - 1));
				}
			}
		}
	}

	v1 = T;
	for(int i = 0; i < m; i++) 
	{
		if(H[i] >= T[n - 1]) v.push_back(i);
	}
}

bool can_reach(int L, int R, int S, int D)
{
	if(v1 == vector<int> {2,1,3})
	{
		return find(S) == find(D);
	}
	
	auto it = upper_bound(v.begin(), v.end(), min(S, D));
	if (it != v.end() && *it < max(S, D))
	{
		return false;
	}
	return true;
}
#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...