제출 #1306426

#제출 시각아이디문제언어결과실행 시간메모리
1306426Double_SlashCouncil (JOI23_council)C++20
0 / 100
491 ms8692 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);
    for (int i = n; i--;) {
        for (int j = m; j--;) {
            int x;
            cin >> x;
            a[i] |= x << j;
            freq[j] += x;
        }
        dp[~a[i] & ((1 << m) - 1)][0] = i;
    }
    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 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...