#include <bits/stdc++.h>
using ll = long long;
using sz = size_t;
using namespace std;
// make the code less c++-readable:
template<class T> using v = vector<T>;
template<class T> using vv = v<v<T>>;
using vi = v<int>; using vll = v<ll>; using vvi = vv<int>; using vvll = vv<ll>;
// hai loading utilities
#define $T template<class T>
#define $Ts template<class... T>
$T T Load() { T v; cin >> v; return v; }
$T auto Loads(int n) { v<T> v; v.reserve(n); while(n--) v.emplace_back(Load<T>()); return v; }
$T auto Loads() { return Loads<T>(Load<int>()); }
template<class T, int N> auto Loada() { array<T, N> a; for (T& v: a) v = Load<T>(); return a; }
$Ts auto Cols(int rows) { tuple<v<T>...> t; while(rows--) [&]<sz... I>(index_sequence<I...>){(std::get<I>(t).push_back(Load<T>()), ...);}(index_sequence_for<T...>{}); return t; }
//$Ts auto Rows(int rows) { v<tuple<T...>> v; while(rows--) { v.emplace_back(Load<T>()...); } return v; } bugged :(
struct _aIV { $T operator vector<T>() { return Loads<T>(n); } sz n; };
struct _aI { $T operator T() { return Load<T>(); } _aIV operator()(sz n) { return {n}; } }; static inline _aI $; /* int N = $; vi Y = $(N); */
#define MAKE_LOADER(T, alias) \
T alias() { return Load<T>(); } /* int x = Int(); */\
auto alias##s() { return Loads<T>(); } /* vector<> xs = Ints(); */\
auto alias##s(int n) { return Loads<T>(n); } /* vector<> xs = Ints(7); */\
template<int N> auto alias##a() { return Loada<T, N>(); } /* array<> xs = Inta<7>(); */\
// line intentionally left blank
MAKE_LOADER(int, Int)
MAKE_LOADER(long long, LL)
MAKE_LOADER(char, Char)
MAKE_LOADER(string, String)
// kthxbye
using Real = double;
void test() {
const int N = $;
const int T = $;
v<Real> szanse = $(N);
sort(szanse.begin(), szanse.end(), greater<Real>{});
vector<Real> rozkład(2*50'000 + 44, 0);
Real* const R = rozkład.data() + rozkład.size() / 2;
R[0] = 1;
int mini = 0, maxi = 0;
Real odp = 0;
Real totalnie = 0;
for (const Real sza : szanse) {
Real bilans_totalności = 0;
if ((T % 2) == (abs(mini) % 2)) {
bilans_totalności -= R[T] * (1-sza);
//assert(bilans_totalności <= 0);
} else {
bilans_totalności += R[T-1] * sza;
//assert(bilans_totalności >= 0);
}
//cout << sza << ":" << bilans_totalności << " ";
for (int ile = mini; ile <= maxi; ile += 2) {
R[ile-1] += R[ile] * (1-sza);
R[ile+1] = R[ile] * sza;
}
--mini;
++maxi;
constexpr static Real tol = 1e-15;
constexpr static sz limit = 1000;
if (R[mini] < tol && maxi - mini > limit+2) {
R[mini+2] += R[mini];
R[mini] = 0;
mini += 2;
}
if (R[maxi] < tol && maxi - mini > limit) {
R[maxi-2] += R[maxi];
R[maxi] = 0;
maxi -= 2;
}
totalnie += bilans_totalności;
odp = max(odp, totalnie);
}
cout << fixed << setprecision(17) << odp << endl;
}
[[maybe_unused]] void jeden_test() { test(); }
[[maybe_unused]] void wiele_test() { int T = $; while (T--) test(); }
int main() {
jeden_test();
return 0;
}
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 | #include <bits/stdc++.h> using ll = long long; using sz = size_t; using namespace std; // make the code less c++-readable: template<class T> using v = vector<T>; template<class T> using vv = v<v<T>>; using vi = v<int>; using vll = v<ll>; using vvi = vv<int>; using vvll = vv<ll>; // hai loading utilities #define $T template<class T> #define $Ts template<class... T> $T T Load() { T v; cin >> v; return v; } $T auto Loads(int n) { v<T> v; v.reserve(n); while(n--) v.emplace_back(Load<T>()); return v; } $T auto Loads() { return Loads<T>(Load<int>()); } template<class T, int N> auto Loada() { array<T, N> a; for (T& v: a) v = Load<T>(); return a; } $Ts auto Cols(int rows) { tuple<v<T>...> t; while(rows--) [&]<sz... I>(index_sequence<I...>){(std::get<I>(t).push_back(Load<T>()), ...);}(index_sequence_for<T...>{}); return t; } //$Ts auto Rows(int rows) { v<tuple<T...>> v; while(rows--) { v.emplace_back(Load<T>()...); } return v; } bugged :( struct _aIV { $T operator vector<T>() { return Loads<T>(n); } sz n; }; struct _aI { $T operator T() { return Load<T>(); } _aIV operator()(sz n) { return {n}; } }; static inline _aI $; /* int N = $; vi Y = $(N); */ #define MAKE_LOADER(T, alias) \ T alias() { return Load<T>(); } /* int x = Int(); */\ auto alias##s() { return Loads<T>(); } /* vector<> xs = Ints(); */\ auto alias##s(int n) { return Loads<T>(n); } /* vector<> xs = Ints(7); */\ template<int N> auto alias##a() { return Loada<T, N>(); } /* array<> xs = Inta<7>(); */\ // line intentionally left blank MAKE_LOADER(int, Int) MAKE_LOADER(long long, LL) MAKE_LOADER(char, Char) MAKE_LOADER(string, String) // kthxbye using Real = double; void test() { const int N = $; const int T = $; v<Real> szanse = $(N); sort(szanse.begin(), szanse.end(), greater<Real>{}); vector<Real> rozkład(2*50'000 + 44, 0); Real* const R = rozkład.data() + rozkład.size() / 2; R[0] = 1; int mini = 0, maxi = 0; Real odp = 0; Real totalnie = 0; for (const Real sza : szanse) { Real bilans_totalności = 0; if ((T % 2) == (abs(mini) % 2)) { bilans_totalności -= R[T] * (1-sza); //assert(bilans_totalności <= 0); } else { bilans_totalności += R[T-1] * sza; //assert(bilans_totalności >= 0); } //cout << sza << ":" << bilans_totalności << " "; for (int ile = mini; ile <= maxi; ile += 2) { R[ile-1] += R[ile] * (1-sza); R[ile+1] = R[ile] * sza; } --mini; ++maxi; constexpr static Real tol = 1e-15; constexpr static sz limit = 1000; if (R[mini] < tol && maxi - mini > limit+2) { R[mini+2] += R[mini]; R[mini] = 0; mini += 2; } if (R[maxi] < tol && maxi - mini > limit) { R[maxi-2] += R[maxi]; R[maxi] = 0; maxi -= 2; } totalnie += bilans_totalności; odp = max(odp, totalnie); } cout << fixed << setprecision(17) << odp << endl; } [[maybe_unused]] void jeden_test() { test(); } [[maybe_unused]] void wiele_test() { int T = $; while (T--) test(); } int main() { jeden_test(); return 0; } |
English