제출 #1357649

#제출 시각아이디문제언어결과실행 시간메모리
1357649turralCouncil (JOI23_council)C++20
16 / 100
4093 ms1620 KiB
#include <iostream>
#include <vector>

using namespace std;

void prin(int n, int M) {
    for (int i=M-1; i>=0; --i){
        cout << ((n & (1 << i)) > 0);
    }
    cout << '\n';
}

void solve(){
    int N, M; cin >> N >> M;

    vector<int> msk(N);
    vector<int> votes(M, 0);
    for (int i=0; i<N; ++i){
        int s=0;
        for (int j=0; j<M; ++j){
            int x; cin >> x;

            votes[j] += x;
            s = (s << 1) + x;
        }
        msk[i] = s;
    }

    int mskVote=0;
    int plus=0;
    int nM=M;
    for (int i=0; i<M; ++i){
        if (votes[i] < N/2){
            --nM;
            votes[i] = -1;
        } else if (votes[i]-2 >= N/2){ 
            ++plus; --nM;
            votes[i] = -1;
        } else if (votes[i] == N/2){
            mskVote = (mskVote << 1) + 0;
        } else if (votes[i]-1 == N/2){
            mskVote = (mskVote << 1) + 1;
        }
    }

    for (int i=0; i<N; ++i){
        int ns=0;
        for (int j=0; j<M; ++j){
            if (votes[j] != -1){
                ns = (ns << 1) + ((msk[i] & (1<<(M-j-1))) > 0);
            }
        }
        msk[i] = ns;
    }

    int pt = (1 << nM)-1;

    for (int i=0; i<N; ++i){
        int res=0;
        int k = mskVote ^ msk[i];
        int v = __builtin_popcount(mskVote & (pt - msk[i]));

        for (int j=0; j<N; ++j){
            if (j == i) continue;

            int nv = __builtin_popcount((pt - k) & (pt-msk[j]));
            res = max(res, v + nv);
        }

        cout << res + plus << '\n';
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    solve();
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…