Untitled
unknown
c_cpp
9 months ago
1.5 kB
11
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";
}Editor is loading...
Leave a Comment