template<class T> voidmerge(std::vector<T> &v1, std::vector<T> &v2){ std::vector<T> ret; for (int i = 0, j = 0; i < v1.size() || j < v2.size();) { if (i < v1.size() && (j == v2.size() || v1[i] < v2[j])) ret.emplace_back(v1[i++]); else ret.emplace_back(v2[j++]); } v1.swap(ret); }
boolcheck(int t){ std::vector<std::tuple<int, int, int>> vec; if (t % 2 == 0) { std::vector<std::tuple<int, int, int>> vv[4]; for (int i = 1; i <= n; ++i) vv[0].emplace_back(a[i] + 1, 0, 2); for (int i = 1; i <= n; ++i) vv[1].emplace_back(a[i] + t / 2 + 1, 0, -2); for (int i = n; i; --i) vv[2].emplace_back(t / 2 - a[i], 1, 2); for (int i = n; i; --i) vv[3].emplace_back(t - a[i], 1, -2); for (int i = 0; i < 4; ++i) merge(vec, vv[i]); } else { std::vector<std::tuple<int, int, int>> vv[6]; for (int i = 1; i <= n; ++i) vv[0].emplace_back(a[i] + 1, 0, 2); for (int i = 1; i <= n; ++i) vv[1].emplace_back(a[i] + t / 2 + 1, 0, -1); for (int i = 1; i <= n; ++i) vv[2].emplace_back(a[i] + t / 2 + 2, 0, -1); for (int i = n; i; --i) vv[3].emplace_back(t / 2 - a[i], 1, 1); for (int i = n; i; --i) vv[4].emplace_back(t / 2 - a[i] + 1, 1, 1); for (int i = n; i; --i) vv[5].emplace_back(t - a[i], 1, -2); for (int i = 0; i < 6; ++i) merge(vec, vv[i]); } int cnt = 0, las = 0, now[2] = {0}; for (int i = 0; i + 1 < (int)vec.size(); ++i) { if (i + 1 < (int)vec.size() && std::get<0>(vec[i]) == std::get<0>(vec[i + 1])) continue; int len = std::get<0>(vec[i + 1]) - std::get<0>(vec[i]); for (int j = i; ~j; --j) { if (std::get<0>(vec[j]) != std::get<0>(vec[i])) break; now[std::get<1>(vec[j])] += std::get<2>(vec[j]); } if (now[0] >= now[1]) { cnt += now[1] * len, las += (now[0] - now[1]) * len; } else { cnt += now[0] * len; int c1 = (now[1] - now[0]) * len; cnt += std::min(c1, las), las -= std::min(c1, las); } } return cnt >= 2 * m; }
voiddickdreamer(){ std::cin >> n >> m; for (int i = 1; i <= n; ++i) std::cin >> a[i]; std::sort(a + 1, a + 1 + n); int L = 0, R = 2e14, res = 2e14; while (L + 1 < R) { int mid = (L + R) >> 1; if (check(mid)) R = res = mid; else L = mid; } std::cout << res << '\n'; }