Submission #520438

#TimeUsernameProblemLanguageResultExecution timeMemory
520438KoDDiversity (CEOI21_diversity)C++17
38 / 100
7058 ms13048 KiB
#include <bits/stdc++.h> using std::vector; using std::array; using std::pair; using std::tuple; using i64 = std::int64_t; constexpr i64 INF = std::numeric_limits<i64>::max() / 2; template <class T> void setmin(T& lhs, const T& rhs) { if (lhs > rhs) { lhs = rhs; } } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); int N, Q; std::cin >> N >> Q; vector<int> A(N); std::map<int, int> count; for (auto& x : A) { std::cin >> x; count[x] += 1; } vector<int> block; for (const auto& [_, c] : count) { block.push_back(c); } std::sort(block.begin(), block.end()); const int n = block.size(); vector<i64> dp(N + 1, INF), next(N + 1); dp[0] = (i64)N * (N + 1) / 2; int sum = 0; for (int i = 0; i < n - 1; ++i) { std::fill(next.begin(), next.end(), INF); for (int l = 0; l <= sum; ++l) { if (dp[l] == INF) { continue; } const int nl = l + block[i]; const int nr = N - (sum - l) - block[i]; setmin(next[nl], dp[l] + (i64)nl * (N - nl)); setmin(next[l], dp[l] + (i64)nr * (N - nr)); } std::swap(dp, next); sum += block[i]; } std::cout << *std::min_element(dp.begin(), dp.end()) << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...