Submission #1334635

#TimeUsernameProblemLanguageResultExecution timeMemory
1334635yhkhooCouncil (JOI23_council)C++17
41 / 100
4094 ms10584 KiB
#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> pii;
#define fi first
#define se second
#define pop __builtin_popcount

const int MAXN = 300000, MAXM = 20, MAXM2 = 1048576, INF = MAXN*67;
int n, m;
int a[MAXN], s[MAXM];
pii memo[MAXM2];

pii dp(int msk){
    auto& mem = memo[msk];
    if(mem.fi != -1){
        return mem;
    }
    auto& [m1, m2] = mem;
    m1 = INF, m2 = INF;
    for(int i=0; i<n; i++){
        int cur = pop(a[i] & msk);
        if(cur <= m1){
            m2 = m1;
            m1 = cur;
        }
        else if(cur < m2){
            m2 = cur;
        }
    }
    return mem;
}

signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    memset(memo, -1, sizeof(memo));
    cin >> n >> m;
    int x = n/2;
    for(int i=0; i<n; i++){
        for(int j=0, aij; j<m; j++){
            cin >> aij;
            if(aij){
                a[i] ^= (1<<j);
                s[j]++;
            }
        }
    }
    int tot = 0, r = 0;
    for(int i=0; i<m; i++){
        if(s[i] >= x){
            tot++;
        }
        if(s[i] == x){
            r ^= (1<<i);
        }
    }
    for(int i=0; i<n; i++){
        int cr = r, d = 0;
        for(int j=0; j<m; j++){
            if(!(a[i] & (1<<j))) continue;
            if(s[j] == x){
                cr ^= (1<<j);
                d++;
            }
            else if(s[j] == x+1){
                cr ^= (1<<j);
            }
        }
        auto [m1, m2] = dp(cr);
        int cm = pop(a[i] & cr);
        int ans = tot - d;
        if(cm == m1){
            ans -= m2;
        }
        else{
            ans -= m1;
        }
        cout << ans << '\n';
    }
    return 0;
}
#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...