func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MXN = 1024 * 1024;   int n;   int k;   int v[MXN];   int c[MXN];   int p[MXN];   pair<int, int> vstk[MXN];   pair<int, int> cstk[MXN];   int vn, cn;   static pair<int, int> getxy(int iv) {     int p1 = vstk[iv].first;     auto cx =         lower_bound(cstk, cstk + cn, p1,                     [](const pair<int, int>& a, int b) { return a.first > b; });     return {vstk[iv].second, cx->second};   }   static void calcP() {     vn = 0;     cn = 0;     for (int i = n - 1; i >= 0; i--) {       while (vn > 0 && vstk[vn - 1].second <= v[i]) vn--;       vstk[vn++] = pair<int, int>(i, v[i]);       while (cn > 0 && cstk[cn - 1].second >= c[i]) cn--;       cstk[cn++] = pair<int, int>(i, c[i]);       int l = 0, r = vn - 1;       while (l < r) {         int m = (l + r) / 2;         pair<int, int> xy = getxy(m);         if (xy.first < xy.second)           r = m;         else           l = m + 1;       }       pair<int, int> a1 = getxy(l);       int tans = min(a1.first, a1.second);       if (l > 0) {         a1 = getxy(l - 1);         tans = max(tans, min(a1.first, a1.second));       }       p[i] = tans;     }   }   static double solve() {     for (int i = 0; i < n; i++) v[i] *= 100;     calcP();     sort(p, p + n);     double prb = double(k) / n;     double ans = p[0] * prb;     for (int i = 1; i < n && n - k - i + 1 >= 0; i++) {       prb *= n - k - i + 1;       prb /= (n - i);       ans += p[i] * prb;     }     return ans;   }   int main() {     while (scanf( %d %d , &n, &k) == 2) {       for (int i = 0; i < n; i++) scanf( %d , v + i);       for (int i = 0; i < n; i++) scanf( %d , c + i);       double ans = solve();       printf( %.7f n , ans);     }     return 0;   }   