Untitled

 avatar
unknown
c_cpp
2 days ago
1.5 kB
6
Indexable
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int tt, tc;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int rand(int a, int b) { return uniform_int_distribution<int>(a, b)(rng); }

const int N = 100000;
const int M = 1000;
const int D = 13;

int perm[N + 9], par[N + 9], sz[N + 9];
int Sample[D + 9];

void init() {
	iota(par + 1, par + N + 1, 1);
	iota(perm, perm + N + 1, 1);
	fill(sz + 1, sz + N + 1, 1);
}

int find(int x) {
	return x == par[x] ? x : par[x] = find(par[x]);
}

void join(int x, int y) {
	x = find(x), y = find(y);
	if (x == y) return;
	if (sz[x] < sz[y]) swap(x, y);
	par[y] = x;
	sz[x] += sz[y];
}

void sample_edge() {
	int cur_size = N;
	for (int i = 1; i <= D; i++) {
		int k = rand(1, cur_size);
		Sample[i] = perm[k];
		swap(perm[k], perm[cur_size]);
		cur_size--;
	}
}

void unite_sample() {
	for (int i = 1; i < D; i++) join(Sample[i], Sample[i + 1]);
}

int max_component() {
	int res = 0;
	for (int i = 1; i <= N; i++) res = max(res, sz[find(i)]);
	return res;
}

int solve() {
	init();
	for (int i = 0; i < M; i++) {
		sample_edge();
		unite_sample();
	}
	return max_component();
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int num_samples;
	cin >> num_samples;
	int sum = 0;
	for (int i = 0; i < num_samples; i++) sum = max(sum, solve());

	int lg = 0;
	while ((1 << lg) < N) lg++;
	if ((1 << lg) > N) lg--;
	cout << sum << "\n";
	cout << fixed << setprecision(6)  << log(((double) sum / (double)lg)) / log((double) D) << "\n";
}
Leave a Comment