//
// Mateusz Pietrowcow
//
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
using ll = long long;
using uint = unsigned int;
using ull = unsigned long long;
using ii = pair<int,int>;
using uii = pair<uint,uint>;
using pll = pair<ll,ll>;
using pull = pair<ull,ull>;
using ld = double;
using pld = pair<ld,ld>;
#define int128 __int128_t
#define uint128 __uint128_t
#define pbds __gnu_pbds
#define cxx __gnu_cxx
#define MOD 1000000007
#define MODLL 1000000007LL
#define MODULL 1000000007ULL
// best primes in the galaxy
#define MOD1 1000000007LL
#define MOD2 1000000403LL
#define MOD3 1000000787LL
#define MOD4 1000001447LL
#define INF 1'000'000'000
#define INFLL 1'000'000'000'000'000'000LL
#define INFULL 1'000'000'000'000'000'000ULL
#define timeNow() (chrono::high_resolution_clock::now().time_since_epoch().count())
#define all(x) x.begin(),x.end()
#define len(x) (int)(x.size())
#define lenl(x) (ll)(x.size())
#define inRange(x,a,b) (a <= x && x <= b)
#define fir first
#define sec second
#define self(x,y,z) y = x(y,z)
template <typename X, typename Y, typename Z>
using gp_hashmap = pbds::gp_hash_table<X,Y,Z,equal_to<X>,pbds::direct_mask_range_hashing<>,pbds::linear_probe_fn<>,pbds::hash_standard_resize_policy<pbds::hash_exponential_size_policy<>,pbds::hash_load_check_resize_trigger<>,true>>;
template <typename X, typename Y, typename Z>
using gp_hashmap_safe = pbds::cc_hash_table<X,Y,Z,equal_to<X>,pbds::direct_mod_range_hashing<>,pbds::hash_standard_resize_policy<pbds::hash_prime_size_policy,pbds::hash_load_check_resize_trigger<>,true>>;
template <typename X, typename Y, typename Z>
using cc_hashmap = pbds::cc_hash_table<X,Y,Z,equal_to<X>,pbds::direct_mask_range_hashing<>,pbds::hash_standard_resize_policy<pbds::hash_exponential_size_policy<>,pbds::hash_load_check_resize_trigger<>,true>>;
template <typename X, typename Y, typename Z>
using cc_hashmap_safe = pbds::cc_hash_table<X,Y,Z,equal_to<X>,pbds::direct_mod_range_hashing<>,pbds::hash_standard_resize_policy<pbds::hash_prime_size_policy,pbds::hash_load_check_resize_trigger<>,true>>;
template <typename X, typename Y, typename Z>
using indexed_set = pbds::tree<X, Y, Z, pbds::rb_tree_tag, pbds::tree_order_statistics_node_update>;
struct chash
{
size_t operator()(const int& a) const
{
const static int rng = (int)timeNow() ^ (int)(ull)(make_unique<char>().get());
return a ^ rng;
}
};
namespace sol
{
constexpr int N = 5e4+5, M = 2*N+5;
ld dp[M], val[N], ival[N];
int n, p;
void read()
{
cin >> n >> p;
for (int i = 0; i < n; i++)
cin >> val[i];
}
void solve()
{
sort(val, val+n, greater<ld>());
for (int i = 0; i < n; i++)
ival[i] = 1.0L - val[i];
ld best = 0, sum = 0;
dp[0] = 1;
for (int i = 0; i < n; i++)
{
if (i + 1 >= p)
{
if ((p ^ i) % 2 == 0)
sum -= dp[(i + p) / 2] * ival[i]; // t -> t-1
else
sum += dp[(i + p - 1) / 2] * val[i]; // t-1 -> t
}
self(max, best, sum);
for (int j = min(i, (i + p) / 2 + (n - i) / 2); j >= max(0, (i + p) / 2 - (n - i) / 2); j--)
{
ld old = dp[j];
dp[j] *= ival[i];
dp[j + 1] += -dp[j]+old;
}
}
cout << fixed << setprecision(7) << best << '\n';
}
};
int main()
{
ios_base::sync_with_stdio(0);
cout.tie(0);
cin.tie(0);
sol::read();
sol::solve();
}
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 117 118 119 120 121 122 123 124 125 126 127 | // // Mateusz Pietrowcow // #include <bits/stdc++.h> #include <bits/extc++.h> using namespace std; using ll = long long; using uint = unsigned int; using ull = unsigned long long; using ii = pair<int,int>; using uii = pair<uint,uint>; using pll = pair<ll,ll>; using pull = pair<ull,ull>; using ld = double; using pld = pair<ld,ld>; #define int128 __int128_t #define uint128 __uint128_t #define pbds __gnu_pbds #define cxx __gnu_cxx #define MOD 1000000007 #define MODLL 1000000007LL #define MODULL 1000000007ULL // best primes in the galaxy #define MOD1 1000000007LL #define MOD2 1000000403LL #define MOD3 1000000787LL #define MOD4 1000001447LL #define INF 1'000'000'000 #define INFLL 1'000'000'000'000'000'000LL #define INFULL 1'000'000'000'000'000'000ULL #define timeNow() (chrono::high_resolution_clock::now().time_since_epoch().count()) #define all(x) x.begin(),x.end() #define len(x) (int)(x.size()) #define lenl(x) (ll)(x.size()) #define inRange(x,a,b) (a <= x && x <= b) #define fir first #define sec second #define self(x,y,z) y = x(y,z) template <typename X, typename Y, typename Z> using gp_hashmap = pbds::gp_hash_table<X,Y,Z,equal_to<X>,pbds::direct_mask_range_hashing<>,pbds::linear_probe_fn<>,pbds::hash_standard_resize_policy<pbds::hash_exponential_size_policy<>,pbds::hash_load_check_resize_trigger<>,true>>; template <typename X, typename Y, typename Z> using gp_hashmap_safe = pbds::cc_hash_table<X,Y,Z,equal_to<X>,pbds::direct_mod_range_hashing<>,pbds::hash_standard_resize_policy<pbds::hash_prime_size_policy,pbds::hash_load_check_resize_trigger<>,true>>; template <typename X, typename Y, typename Z> using cc_hashmap = pbds::cc_hash_table<X,Y,Z,equal_to<X>,pbds::direct_mask_range_hashing<>,pbds::hash_standard_resize_policy<pbds::hash_exponential_size_policy<>,pbds::hash_load_check_resize_trigger<>,true>>; template <typename X, typename Y, typename Z> using cc_hashmap_safe = pbds::cc_hash_table<X,Y,Z,equal_to<X>,pbds::direct_mod_range_hashing<>,pbds::hash_standard_resize_policy<pbds::hash_prime_size_policy,pbds::hash_load_check_resize_trigger<>,true>>; template <typename X, typename Y, typename Z> using indexed_set = pbds::tree<X, Y, Z, pbds::rb_tree_tag, pbds::tree_order_statistics_node_update>; struct chash { size_t operator()(const int& a) const { const static int rng = (int)timeNow() ^ (int)(ull)(make_unique<char>().get()); return a ^ rng; } }; namespace sol { constexpr int N = 5e4+5, M = 2*N+5; ld dp[M], val[N], ival[N]; int n, p; void read() { cin >> n >> p; for (int i = 0; i < n; i++) cin >> val[i]; } void solve() { sort(val, val+n, greater<ld>()); for (int i = 0; i < n; i++) ival[i] = 1.0L - val[i]; ld best = 0, sum = 0; dp[0] = 1; for (int i = 0; i < n; i++) { if (i + 1 >= p) { if ((p ^ i) % 2 == 0) sum -= dp[(i + p) / 2] * ival[i]; // t -> t-1 else sum += dp[(i + p - 1) / 2] * val[i]; // t-1 -> t } self(max, best, sum); for (int j = min(i, (i + p) / 2 + (n - i) / 2); j >= max(0, (i + p) / 2 - (n - i) / 2); j--) { ld old = dp[j]; dp[j] *= ival[i]; dp[j + 1] += -dp[j]+old; } } cout << fixed << setprecision(7) << best << '\n'; } }; int main() { ios_base::sync_with_stdio(0); cout.tie(0); cin.tie(0); sol::read(); sol::solve(); } |
English