Submission #1358955

#TimeUsernameProblemLanguageResultExecution timeMemory
1358955turralCouncil (JOI23_council)C++20
100 / 100
444 ms362832 KiB
#include <iostream>
#include <vector>

using namespace std;

#define pi pair<int,int>

const int INF = 1e9;

struct FirstSecond {
    pi f, s;

    FirstSecond() : f(INF, -1), s(INF, -1) {}
    
    void add(int msk, int i){
        int val = __builtin_popcount(msk);
        pi par = {val, i};

        if (par <= f){
            s = f;
            f = par;
        } else if (par < s){
            s = par;
        }
    }

    void add(FirstSecond sec){
        pi nf = sec.f, ns = sec.s;

        if (f <= nf){
            s = min(nf, s);
        } else {
            s = min(f, ns);
            f = nf;
        }
    }

    int get(int i){
        return (i == f.second ? s.first : f.first);
    }

    void print(int ix){
        cout << ix << ":\n";
        cout << f.first << ' ' << f.second << " nigg\n";
        cout << s.first << ' ' << s.second << " endddd\n";
        cout << "---\n";
    }
};

FirstSecond operator+(FirstSecond a, int v){
    a.f.first += v;
    a.s.first += v;

    return a;
}

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);
    vector<vector<FirstSecond> > dp(nM+1, vector<FirstSecond>(pt));
    for (int i=0; i<N; ++i){
        dp[0][msk[i]].add(msk[i], i);
    }

    for (int i=1; i<=nM; ++i){
        for (int j=0; j<pt; ++j){
            dp[i][j] = dp[i-1][j];

            int bit = (1 << (i-1));
            dp[i][j].add(dp[i-1][j ^ bit] + ((j & bit) > 0));
        }
    }
    
    for (int i=0; i<N; ++i){
        int k = mskVote ^ msk[i];
        int v = __builtin_popcount(mskVote & (pt-1 - msk[i]));
        int nv = nM - dp[nM][k].get(i);

        cout << v + nv + plus << '\n';
    }
}

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

    solve();
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...