Untitled
#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