제출 #1306431

#제출 시각아이디문제언어결과실행 시간메모리
1306431Double_SlashCouncil (JOI23_council)C++20
100 / 100
1593 ms10808 KiB
#include <bits/stdc++.h> using namespace std; int main() { int n, m; cin >> n >> m; int a[n]{}, freq[m]{}; vector<array<int, 2>> dp(1 << m, {0, 1}); for (int i = n; i--;) { for (int j = m; j--;) { int x; cin >> x; a[i] |= x << j; freq[j] += x; } } auto upd = [&] (int i, int j) { if (__builtin_popcount(i & ~a[j]) < __builtin_popcount(i & ~a[dp[i][1]]) or j == dp[i][0]) return; dp[i][1] = j; if (__builtin_popcount(i & ~a[dp[i][1]]) > __builtin_popcount(i & ~a[dp[i][0]])) swap(dp[i][0], dp[i][1]); }; for (int i = 1 << m; i--;) upd(i, 1); for (int i = n; i--;) upd(~a[i] & ((1 << m) - 1), i); for (int mi = 1 << m; mi--;) { for (int i = m; i--;) { for (int j = 2; j--;) upd(mi, dp[mi | (1 << i)][j]); } } for (int mi = 0; mi < (1 << m); ++mi) { for (int i = m; i--;) { for (int j = 2; j--;) upd(mi, dp[mi & ~(1 << i)][j]); } } for (int i = n; i--;) { int mi = 0; for (int j = m; j--;) mi |= (freq[j] - ((a[i] >> j) & 1) == n / 2) << j; mi = a[dp[mi][dp[mi][0] == i]]; int ans = 0; for (int j = m; j--;) ans += freq[j] - ((a[i] >> j) & 1) - ((mi >> j) & 1) >= n / 2; cout << ans << endl; } }
#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...