#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
#define deb(...)
#define DBP(...)
using namespace std;
using ll = long long;
using vi = vector<int>;
using pii = pair<int, int>;
#define pb push_back
#define mp make_pair
#define x first
#define y second
#define rep(i, b, e) for (int i = (b); i < (e); i++)
#define each(a, x) for (auto& a : (x))
#define all(x) (x).begin(), (x).end()
#define sz(x) int((x).size())
void run();
int main() {
cin.sync_with_stdio(0); cin.tie(0);
cout << fixed << setprecision(12);
run();
cout << flush; _Exit(0);
}
using dbl = long double;
using cmpl = complex<dbl>;
void fft(vector<cmpl>& a) {
static vector<cmpl> w(2, 1);
int n = sz(a);
for (int k = sz(w); k < n; k *= 2) {
w.resize(n);
rep(i, 0, k) w[k+i] = exp(cmpl(0, M_PI*i/k));
}
vi rev(n);
rep(i, 0, n) rev[i] = (rev[i/2] | i%2*n) / 2;
rep(i, 0, n) if (i < rev[i]) swap(a[i], a[rev[i]]);
for (int k = 1; k < n; k *= 2) {
for (int i = 0; i < n; i += k*2) rep(j, 0, k) {
auto d = a[i+j+k] * w[j+k];
a[i+j+k] = a[i+j] - d;
a[i+j] += d;
}
}
}
vector<dbl> convolve(const vector<dbl>& a, const vector<dbl>& b) {
if (a.empty() || b.empty()) return {};
int len = sz(a)+sz(b)-1, n = 1;
while (n < len) n *= 2;
vector<cmpl> in(n), out(n);
rep(i, 0, sz(a)) in[i].real(a[i]);
rep(i, 0, sz(b)) in[i].imag(b[i]);
fft(in);
each(x, in) x *= x;
rep(i, 0, n) out[i] = in[-i&(n-1)] - conj(in[i]);
fft(out);
vector<dbl> ret(len);
rep(i, 0, len) ret[i] = imag(out[i]) / (n*4);
return ret;
}
vector<dbl> prob;
int t;
dbl ans;
vector<dbl> solve(int begin, int end, vector<dbl> pref, int offset) {
if (end-begin <= 0) return {1};
int k = (t+end+1) / 2 - offset;
if (end-begin == 1) {
dbl p = prob[begin];
if (k-1 < sz(pref)) {
dbl alt = pref[k-1] * p;
rep(i, k, sz(pref)) alt += pref[i];
ans = max(ans, alt);
}
return {1-p, p};
}
int endK = min(k+1, sz(pref));
int beginK = clamp(k-(end-begin), 0, endK);
rep(i, endK, sz(pref)) pref[endK-1] += pref[i];
pref.resize(endK);
pref.erase(pref.begin(), pref.begin()+beginK);
offset += beginK;
int mid = (begin+end) / 2;
vector<dbl> L = solve(begin, mid, pref, offset);
pref = convolve(pref, L);
vector<dbl> R = solve(mid, end, std::move(pref), offset);
return convolve(L, R);
}
void run() {
int n;
cin >> n >> t;
prob.resize(n);
each(e, prob) cin >> e;
sort(all(prob), greater<dbl>());
ans = 0;
solve(0, n, {1}, 0);
cout << ans << '\n';
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | #define _USE_MATH_DEFINES #include <bits/stdc++.h> #define deb(...) #define DBP(...) using namespace std; using ll = long long; using vi = vector<int>; using pii = pair<int, int>; #define pb push_back #define mp make_pair #define x first #define y second #define rep(i, b, e) for (int i = (b); i < (e); i++) #define each(a, x) for (auto& a : (x)) #define all(x) (x).begin(), (x).end() #define sz(x) int((x).size()) void run(); int main() { cin.sync_with_stdio(0); cin.tie(0); cout << fixed << setprecision(12); run(); cout << flush; _Exit(0); } using dbl = long double; using cmpl = complex<dbl>; void fft(vector<cmpl>& a) { static vector<cmpl> w(2, 1); int n = sz(a); for (int k = sz(w); k < n; k *= 2) { w.resize(n); rep(i, 0, k) w[k+i] = exp(cmpl(0, M_PI*i/k)); } vi rev(n); rep(i, 0, n) rev[i] = (rev[i/2] | i%2*n) / 2; rep(i, 0, n) if (i < rev[i]) swap(a[i], a[rev[i]]); for (int k = 1; k < n; k *= 2) { for (int i = 0; i < n; i += k*2) rep(j, 0, k) { auto d = a[i+j+k] * w[j+k]; a[i+j+k] = a[i+j] - d; a[i+j] += d; } } } vector<dbl> convolve(const vector<dbl>& a, const vector<dbl>& b) { if (a.empty() || b.empty()) return {}; int len = sz(a)+sz(b)-1, n = 1; while (n < len) n *= 2; vector<cmpl> in(n), out(n); rep(i, 0, sz(a)) in[i].real(a[i]); rep(i, 0, sz(b)) in[i].imag(b[i]); fft(in); each(x, in) x *= x; rep(i, 0, n) out[i] = in[-i&(n-1)] - conj(in[i]); fft(out); vector<dbl> ret(len); rep(i, 0, len) ret[i] = imag(out[i]) / (n*4); return ret; } vector<dbl> prob; int t; dbl ans; vector<dbl> solve(int begin, int end, vector<dbl> pref, int offset) { if (end-begin <= 0) return {1}; int k = (t+end+1) / 2 - offset; if (end-begin == 1) { dbl p = prob[begin]; if (k-1 < sz(pref)) { dbl alt = pref[k-1] * p; rep(i, k, sz(pref)) alt += pref[i]; ans = max(ans, alt); } return {1-p, p}; } int endK = min(k+1, sz(pref)); int beginK = clamp(k-(end-begin), 0, endK); rep(i, endK, sz(pref)) pref[endK-1] += pref[i]; pref.resize(endK); pref.erase(pref.begin(), pref.begin()+beginK); offset += beginK; int mid = (begin+end) / 2; vector<dbl> L = solve(begin, mid, pref, offset); pref = convolve(pref, L); vector<dbl> R = solve(mid, end, std::move(pref), offset); return convolve(L, R); } void run() { int n; cin >> n >> t; prob.resize(n); each(e, prob) cin >> e; sort(all(prob), greater<dbl>()); ans = 0; solve(0, n, {1}, 0); cout << ans << '\n'; } |
English