제출 #1334716

#제출 시각아이디문제언어결과실행 시간메모리
1334716yhkhooCouncil (JOI23_council)C++17
16 / 100
4093 ms55728 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, MAXM4 = 1024, INF = MAXN*67;
typedef bitset<MAXN> tt;
int n, m;
int a[MAXN], s[MAXM];
pii memo[MAXM4];
tt dp1[MAXM4][10], dp2[MAXM4][10];

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 m2 = m/2, m3 = m-m2;
    for(int msk=0; msk<(1<<m2); msk++){
        auto cdp = dp1[msk];
        for(int i=0; i<n; i++){
            int cur = pop(a[i] & msk);
            //cerr << 'a' << msk << ' ' << i << ' ' << cur << '\n';
            cdp[cur][i] = 1;
        }
    }
    for(int msk=0; msk<(1<<m3); msk++){
        auto cdp = dp2[msk];
        for(int i=0; i<n; i++){
            int cur = pop(a[i] & (msk<<m2));
            //cerr << 'b' << msk << ' ' << i << ' ' << cur << '\n';
            cdp[cur][i] = 1;
        }
    }
    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);
            }
        }
        int g = 67;
        int msk1 = cr & ((1<<m2)-1), msk2 = cr >> m2;
        //cerr << msk1 << ' ' << msk2 << '\n';
        for(int j=0; j<=m2; j++){
            for(int k=0; k<=m3; k++){
                tt cb = dp1[msk1][j] & dp2[msk2][k];
                cb[i] = 0;
                //cerr << j << ' ' << k << ' ' << cb.any() << '\n';
                if(cb.any()){
                    g = min(g, j+k);
                }
            }
        }
        cout << tot - d - g << '\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...