답안 #875394

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
875394 2023-11-19T13:28:53 Z serifefedartar Drzava (COCI15_drzava) C++17
152 / 160
295 ms 8108 KB
#include <bits/stdc++.h>
using namespace std;
 
#define fast ios::sync_with_stdio(0);cin.tie(0);
#define s second
#define f first
typedef long long ll;
const ll MOD = 998244353;
const ll LOGN = 20; 
const ll MAXN = 5e4 + 101;

struct P {
	double x, y;
	ll k;
	void read() {
		cin >> x >> y >> k;
	}
	P() { }
	P(double _x, double _y, ll _k) : x(_x), y(_y), k(_k) { }
};

vector<P> v;
set<pair<double,int>> s;
int par[MAXN], sz[MAXN], N, K;
int find(int node) {
	if (node == par[node])
		return node;
	return par[node] = find(par[node]);
}

void unite(int a, int b) {
	a = find(a);
	b = find(b);
	if (a == b)
		return ; 
	if (sz[b] > sz[a])
		swap(a, b);
	par[b] = a;
	sz[a] += sz[b];
}

int dp[MAXN][31];
ll dist(int a, int b) {
	ll dx = v[a].x - v[b].x;
	ll dy = v[a].y - v[b].y;
	return dx * dx + dy * dy;
}

bool check(double d) {
	memset(dp, 0, sizeof(dp));
	for (int i = 0; i < MAXN; i++)
		par[i] = i, sz[i] = 1;

	int l = 0, r = 0;
	for (r = 0; r < N; r++) {
		int R = r;
		while (l < N && v[r].x - v[l].x > d) {
			s.erase({v[l].y, l});
			l++;
		}
		while (R < N && v[r].x == v[R].x) {
			s.insert({v[R].y, R});

			auto it = s.lower_bound({v[R].y - d, -1});
			for ( ; it != s.end() && (*it).f <= v[R].y + d; it++) {
				if (dist(R, (*it).s) <= d * d)
					unite(R, (*it).s);
				if (sz[find(R)] >= K)
					return true;
			}
			R++;
		}
		r = R - 1;
	}

	for (int i = 0; i < N; i++) {
		int p = find(i);
		int new_dp[31];
		for (int j = 0; j < 31; j++)
			new_dp[j] = dp[p][j];
		for (int j = K-1; j >= 0; j--) {
			if (dp[p][j])
				new_dp[(j + v[i].k) % K] = true;
		}
		for (int j = 0; j < 31; j++)
			dp[p][j] = new_dp[j];
		dp[p][v[i].k] = true;
	}

	for (int i = 0; i < N; i++) {
		if (dp[find(i)][0])
			return true;
	}
	return false;
}

int main() {
	fast
	cin >> N >> K;

	v = vector<P>(N);
	for (int i = 0; i < N; i++) {
		v[i].read();
		v[i].k %= K;
	}
	sort(v.begin(), v.end(), [&](P A, P B) {
		return make_pair(A.x, A.y) < make_pair(B.x, B.y);
	});

	double L = 0.0, R = 200000000.0;
	double ans = -1.0;
	while (R - L > 0.00001) {
		double mid = L + (R-L) / 2;
		if (check(mid)) {
			R = mid;
			ans = mid;
		} else
			L = mid;
	}
	cout << setprecision(3) << fixed << ans << "\n";
}
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 6744 KB Output is correct
2 Correct 8 ms 6748 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 6748 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 6744 KB Output is correct
2 Correct 11 ms 6748 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 6748 KB Output is correct
2 Correct 11 ms 6956 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 6748 KB Output is correct
2 Correct 9 ms 6948 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 6748 KB Output is correct
2 Correct 10 ms 6952 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 6748 KB Output is correct
2 Correct 10 ms 7000 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 6748 KB Output is correct
2 Correct 11 ms 6944 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 6748 KB Output is correct
2 Correct 81 ms 7260 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 6748 KB Output is correct
2 Correct 269 ms 7872 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 6748 KB Output is correct
2 Correct 295 ms 8028 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 6748 KB Output is correct
2 Correct 253 ms 7972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 6748 KB Output is correct
2 Correct 283 ms 8088 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 6748 KB Output is correct
2 Correct 245 ms 8108 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 6748 KB Output is correct
2 Correct 225 ms 7968 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 6748 KB Output is correct
2 Correct 237 ms 7916 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 6924 KB Output is correct
2 Correct 188 ms 8028 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 6748 KB Output is correct
2 Correct 203 ms 7936 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 6744 KB Output is correct
2 Correct 232 ms 8092 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 6744 KB Output is correct
2 Correct 211 ms 8092 KB Output is correct