Submission #1263652

#TimeUsernameProblemLanguageResultExecution timeMemory
1263652am_aadvikObstacles for a Llama (IOI25_obstacles)C++20
37 / 100
74 ms12332 KiB
#include <iostream>
#include <vector>
using namespace std;

class DSU {
public:
	vector<int> p, rank;
	void init(int n) {
		p.clear();
		for (int i = 0; i <= n; ++i)
			p.push_back(i);
		rank.assign(n + 1, 1);
	}
	int fset(int x) { return (p[x] == x) ? x : p[x] = fset(p[x]); }
	bool iset(int x, int y) { return fset(x) == fset(y); }
	void uset(int x, int y) {
		x = fset(x), y = fset(y);
		if (x != y) {
			if (rank[x] > rank[y])
				swap(x, y);
			p[x] = y, rank[y] += rank[x];
		}
	}
};
DSU u;
vector<int> h, t;
int n, m;
int comp(int i, int j) { return (n <= 3? i * m + j: j); }
void initialize(vector<int> a, vector<int> b) {
	t = a, h = b, n = t.size(), m = h.size();
	u.init(((n <= 3)? n * m + n + m: m + 1));
	for(int i = ((n <= 3)? 0: n - 1); i < n; ++i)
		for (int j = 0; j < m; ++j) 
			if (t[i] > h[j]) {
				int di[] = { 0, 0, 1, -1 };
				int dj[] = { 1, -1, 0, 0 };
				for (int x = 0; x < 4; ++x) {
					int ni = i + di[x], nj = j + dj[x];
					if ((ni >= 0) && (nj >= 0) && (nj < m) && (ni < n))
						if (t[ni] > h[nj])
							u.uset(comp(i, j), comp(ni, nj));
				}
			}
}
bool can_reach(int l, int r, int s, int d) {
	return u.iset((0, s), comp(0, d));
}
/*int main() {
	initialize({ 2, 1, 3 }, { 0, 1, 2, 0 });
	cout << can_reach(0, 3, 1, 3) << endl;
	cout << can_reach(1, 3, 1, 3) << endl;
}*/
#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...