제출 #1334658

#제출 시각아이디문제언어결과실행 시간메모리
1334658WongYiKaiCouncil (JOI23_council)C++20
40 / 100
1894 ms1114112 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main(){
    ll n,m;
    cin >> n >> m;
    ll a[n][m];
    unordered_map<ll,ll> cover[1<<m];
    vector<ll> cover2[1<<m];
    cover2[0].resize(m+1,0);
    ll sum[m+1];
    memset(sum,0,sizeof(sum));
    for (int i=0;i<n;i++){
        ll num = 0;
        ll cnt = 0;
        for (int j=0;j<m;j++){
            cin >> a[i][j];
            num += (a[i][j]<<j);
            if (a[i][j]==1) cnt++;
            sum[j] += a[i][j];
        }
        cover[0][num]++;
    }
    for (int i=1;i<(1<<m);i++){
        ll num = m;
        vector<ll> on;
        for (int j=0;j<m;j++){
            if (i&(1<<j)) {
                num--;
                on.push_back(j);
            }
        }
        cover2[i].resize(num+1,0);
        for (ll idx=0;idx<1;idx++){
            ll bit = on[idx];
            //unblock bit
            ll pos = bit-idx;
            for (int k=0;k<(1<<(num+1));k++){
                ll newk = k&((1<<pos)-1);
                ll rightk = (k>>(pos+1));
                newk += (rightk<<pos);
                cover[i][newk] += cover[i-(1<<bit)][k];
            }
        }
    }
    /*
    for (int i=0;i<(1<<m);i++){
        ll num = m;
        for (int j=0;j<m;j++){
            if (i&(1<<j)) {
                cout << "1 ";
                num--;
            }
            else cout << "0 ";
        }
        cout << "\n";
        for (int j=0;j<(1<<num);j++){
            for (int k=0;k<num;k++){
                if (j&(1<<k)) cout << "1 ";
                else cout << "0 ";
            }
            cout << cover[i][j] << "\n";
        }
        cout << "\n";
    }
    */
    ll dis[(1<<m)];
    memset(dis,-1,sizeof(dis));
    ll cutoff = n/2;
    for (int i=0;i<n;i++){
        ll useless = 0;
        ll cnt = 0;
        ll num = m;
        for (int j=0;j<m;j++){
            if (sum[j]-a[i][j] > cutoff){
                cnt++;
            }
            if (sum[j]-a[i][j] != cutoff){
                useless += (1<<j);
                num--;
            }
        }
        if (dis[useless]==-1){
            for (int j=0;j<(1<<num);j++){
                ll x = __builtin_popcount(j);
                cover2[useless][x] += cover[useless][j];
            }
            dis[useless] = 1;
        }
        for (int x=0;x<=num;x++){
            if (cover2[useless][x] > 1){
                cout << cnt + num - x << "\n";
                break;
            }
            else if (cover2[useless][x] == 1){
                ll me = 0;
                for (int j=0;j<m;j++){
                    if (useless&(1<<j)) continue;
                    me += a[i][j];
                }
                if (me != x){
                    cout << cnt + num - x << "\n";
                    break;
                }
            }
        }
    }
}
#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...