Submission #1188900

#TimeUsernameProblemLanguageResultExecution timeMemory
1188900mannshah1211Council (JOI23_council)C++20
100 / 100
875 ms103400 KiB
/** * author: tourist * created: 20.04.2025 10:00:06 **/ #include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "algo/debug.h" #else #define debug(...) 42 #endif const int inf = 1e9; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; vector<vector<int>> a(n, vector<int>(m)); vector<int> senators(n); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> a[i][j]; senators[i] += a[i][j] * (1 << j); } } vector<int> vote(m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (a[i][j] == 1) { vote[j] += 1; } } } vector<pair<int, int>> fake(1 << m, pair<int, int>{-1, -1}); vector<vector<pair<int, int>>> dp(1 << m, vector<pair<int, int>>(2, pair<int, int>{-1, -1})); for (int i = 0; i < n; i++) { int inv = ((1 << m) - 1) ^ senators[i]; if (fake[inv].first == -1) { fake[inv].first = i; } else if (fake[inv].second == -1) { fake[inv].second = i; } } for (int j = 0; j < m; j++) { for (int i = (1 << m) - 1; i >= 0; i--) { if (i & (1 << j)) { continue; } vector<int> used = {fake[i].first, fake[i].second, fake[i ^ (1 << j)].first, fake[i ^ (1 << j)].second}; sort(used.rbegin(), used.rend()); fake[i] = make_pair(used[0], used[1]); } } auto Modify = [&](int mask, pair<int, int> p) -> void { if (dp[mask][0].second == p.second) { dp[mask][0] = max(dp[mask][0], p); } else { dp[mask][1] = max(dp[mask][1], p); } if (dp[mask][0] < dp[mask][1]) { swap(dp[mask][0], dp[mask][1]); } }; for (int i = 0; i < (1 << m); i++) { if (fake[i].first != -1) { Modify(i, pair<int, int>{__builtin_popcount(i), fake[i].first}); } if (fake[i].second != -1) { Modify(i, pair<int, int>{__builtin_popcount(i), fake[i].second}); } } for (int j = 0; j < m; j++) { for (int i = 0; i < (1 << m); i++) { if (i & (1 << j)) { Modify(i, dp[i ^ (1 << j)][0]); Modify(i, dp[i ^ (1 << j)][1]); } } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (a[i][j] == 1) { vote[j] -= 1; } } vector<int> maybe; int ans = 0; for (int j = 0; j < m; j++) { if (vote[j] >= n / 2 + 1) { ans++; } else if (vote[j] == n / 2) { maybe.push_back(j); } } int mask = 0; for (auto x : maybe) { mask += (1 << x); } cout << ((dp[mask][0].second == i) ? dp[mask][1].first : dp[mask][0].first) + ans << '\n'; for (int j = 0; j < m; j++) { if (a[i][j] == 1) { vote[j] += 1; } } } 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...
#Verdict Execution timeMemoryGrader output
Fetching results...