제출 #1300061

#제출 시각아이디문제언어결과실행 시간메모리
1300061nikakh장애물 (IOI25_obstacles)C++17
37 / 100
88 ms10860 KiB
#include <bits/stdc++.h>
using namespace std;

struct dsu{
	vector<int> parent, sz;
	void init(int n){
		parent.resize(n);
		iota(parent.begin(), parent.end(), 0);
		sz.assign(n, 1);
	}
	int find(int v){
		if(parent[v] == 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(sz[a] < sz[b]) swap(a, b);
		parent[b] = a;
		sz[a] += sz[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(S > D) swap(S, D);
	if(n == 1 || T == vector<int> {2, 1, 3}){
		return ::D.find(S) == ::D.find(D);
	}
	auto ub = upper_bound(v.begin(), v.end(), S);
	return ub == v.end() || *ub > 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...