Submission #1335669

#TimeUsernameProblemLanguageResultExecution timeMemory
1335669WongYiKaiCouncil (JOI23_council)C++20
22 / 100
347 ms24412 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main(){
    ll n,m;
    cin >> n >> m;
    ll a[n][m];
    ll dp[1<<m];
    ll guy[1<<m];
    // is it possible to make 01110101 where 1s can be 0s
    memset(dp,0,sizeof(dp));
    memset(guy,0,sizeof(guy));
    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];
        }
        guy[num]++;
    }
    if (n<=3000){
        for (int i=0;i<n;i++){
            ll ans = 0;
            for (int j=0;j<n;j++){
                if (i==j) continue;
                ll cnt = 0;                
                for (int k=0;k<m;k++){
                    if (sum[k] - a[i][k] - a[j][k] >= n/2) cnt++;
                }
                ans = max(ans,cnt);
            }
            cout << ans << "\n";
        }
        return 0;
    }
    pair<ll,ll> dpmx[1<<m];
    for (int i=0;i<(1<<m);i++){
        for (int j=0;j<=i;j++){
            if ((i|j)!=i) continue;
            dp[i] += guy[j];
        }
        ll zero = m-__builtin_popcount(i);
        if (dp[i] >= 2) dpmx[i] = {zero,zero};
        else if (dp[i] == 1) dpmx[i] = {zero,0};
        else dpmx[i] = {0,0};
    }
    pair<ll,ll> dp2[1<<m];
    // max 0s
    for (int i=0;i<(1<<m);i++){
        dp2[i] = {0,0};
        for (int j=0;j<(1<<m);j++){
            if (dp[j] == 0) continue;
            if ((i&j)==i){
                if (dpmx[j].first > dp2[i].first){
                    dp2[i] = {dpmx[j].first, max(dp2[i].first,dpmx[j].second)};
                }
                else{
                    dp2[i].second = max(dp2[i].second, dpmx[j].first);
                }
            }
        }
    }
    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--;
            }
        }
        ll me = 0;
        for (int j=0;j<m;j++){
            if (useless&(1<<j)) continue;
            me += 1-a[i][j];
        }
        if (dp2[useless].first == me){
            cout << cnt + dp2[useless].second << "\n";
        }
        else cout << cnt + dp2[useless].first << "\n";
    }
}
#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...