Submission #1300046

#TimeUsernameProblemLanguageResultExecution timeMemory
1300046nikakhObstacles for a Llama (IOI25_obstacles)C++17
23 / 100
112 ms10844 KiB
#include <bits/stdc++.h>
using namespace std;

struct dsu{
	vector<int> parent, size;
	void init(int n){
		parent.resize(n);
		size.assign(n, 1);
		iota(parent.begin(), parent.end(), 0);
	}
	int find(int v){
		if(v == parent[v]) return v;
		return parent[v] = find(parent[v]);
	}
	void join(int a, int b){
		a = find(a);
		b = find(b);
		if(a == b) return;
		if(size[a] < size[b]) swap(a, b);
		parent[b] = a;
		size[a] += size[b];
	}
};

dsu D;
vector<int> T, v;
int n, m;

int id(int r, int c, int &M){
	return r * M + c;
}

void initialize(vector<int> T, vector<int> H) {
	n = (int)T.size(), m = (int)H.size();
	if(n <= 3){
		D.init(n * m);
		for(int i = 0; i < n; i++){
			for(int j = 0; j < m; j++){
				if(T[i] > H[j]){
					if(i && T[i - 1] > H[j]) D.join(id(i, j, m), id(i - 1, j, m));
					if(j && T[i] > H[j - 1]) D.join(id(i, j, m), id(i, j - 1, m));
				}
			}
		}
	}
	::T = 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(D > S) swap(S, D);
	if(n == 1 || T == vector<int> {2, 1, 3}){
		return ::D.find(S) == ::D.find(D);
	}
	auto LB = lower_bound(v.begin(), v.end(), S);
	return LB == v.end() || *LB > 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...