Submission #1363395

#TimeUsernameProblemLanguageResultExecution timeMemory
1363395nguyenkhangninh99Council (JOI23_council)C++20
100 / 100
313 ms24184 KiB
#include <bits/stdc++.h>
using namespace std;

const int maxm = 20;
pair<int, int> f[1 << maxm], g[1 << maxm];
int mp[1 << maxm];

void update(int mask, pair<int, int> val){
    if(val.second == -1 || val.second == f[mask].second) return;
    if(val.first > f[mask].first){
        g[mask] = f[mask];
        f[mask] = val;
    }else g[mask] = max(g[mask], val);
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int n, m; cin >> n >> m;

    vector<int> a(n + 1), rev(n + 1), cnt(m + 1);
    for(int i = 1; i <= n; i++){
        for(int j = 0; j < m; j++){
            int x; cin >> x;
            cnt[j] += x;
            a[i] |= (x << j);
        }
        rev[i] = a[i] ^ ((1 << m) - 1);
        mp[rev[i]]++;
    }

    for(int mask = 0; mask < (1 << m); mask++){
        if(mp[mask]) f[mask] = {__builtin_popcount(mask), mask};
        else f[mask] = {-1, -1};
        g[mask] = {-1, -1};
    }

    for(int j = 0; j < m; j++){
        for(int mask = (1 << m) - 1; mask >= 0; mask--){
            if(!(mask & (1 << j))){
                pair<int, int> val1 = f[mask | (1 << j)], val2 = g[mask | (1 << j)];
                val1.first--; val2.first--;
                update(mask, val1);
                update(mask, val2);
            }
        }
    }

    for(int j = 0; j < m; j++){
        for(int mask = 0; mask < (1 << m); mask++){
            if(mask & (1 << j)){
                update(mask, f[mask ^ (1 << j)]);
                update(mask, g[mask ^ (1 << j)]);
            }
        }
    }
    for(int i = 1; i <= n; i++){
        int res = 0, mask = 0;
        for(int j = 0; j < m; j++){
            int left = cnt[j] - ((a[i] >> j) & 1);
            
            if(left > n / 2) res++;
            else if(left == n / 2) mask |= (1 << j); 
        }

        pair<int, int> best = (f[mask].second == rev[i] && mp[rev[i]] == 1 ? g[mask] : f[mask]);
        cout << res + (best.second != -1 ? best.first : 0) << "\n";
    }
}
#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...