Submission #1335764

#TimeUsernameProblemLanguageResultExecution timeMemory
1335764WongYiKaiCouncil (JOI23_council)C++20
6 / 100
342 ms25460 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main(){
    ll n,m;
    cin >> n >> m;
    ll a[n][m];
    vector<pair<ll,ll>> dp[1<<m][m+1];
    vector<ll> guy[1<<m];
    // is it possible to make 01110101 where 1s can be 0s
    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];
        }
        if (guy[num].size() < 2) guy[num].push_back(i);
    }
    if (0==1 && 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;
    }
    for (int i=0;i<(1<<m);i++){
        ll zero = m-__builtin_popcount(i);
        for (ll guyy:guy[i]){
            if (dp[i][0].size() < 2) dp[i][0].push_back({zero,guyy});
        }
    }
    for (int k=1;k<=m;k++){
        for (int i=0;i<(1<<m);i++){
            ll zero = m-__builtin_popcount(i);
            dp[i][k] = dp[i][k-1];
            if (i&(1<<(k-1))){
                for (pair<ll,ll> guyy:dp[i^(1<<(k-1))][k-1]){
                    if (dp[i][k].size() < 2) dp[i][k].push_back({zero,guyy.second});
                }
            }
        }
    }
    pair<pair<ll,ll>,pair<ll,ll>> dp2[1<<m][m+1]; //val, idx
    // max 0s
    for (int i=0;i<(1<<m);i++){
        dp2[i][0] = {{0,-1},{0,-1}};
        for (pair<ll,ll> nd:dp[i][m]){
            if (nd.first > dp2[i][0].first.first){
                if (nd.second == dp2[i][0].second.second) dp2[i][0] = {nd,dp2[i][0].first};
                else dp2[i][0].first = nd;
            }
            else if (nd.first > dp2[i][0].second.first){
                if (nd.second != dp2[i][0].first.second) dp2[i][0].second = nd;
            }
        }
    }
    for (int k=1;k<=m;k++){
        for (int i=0;i<(1<<m);i++){
            dp2[i][k] = dp2[i][k-1];
            if (!i&(1<<(k-1))){
                for (pair<ll,ll> nd:dp[i^(1<<(k-1))][m]){
                    if (nd.first > dp2[i][k].first.first){
                        if (nd.second == dp2[i][k].second.second) dp2[i][k] = {nd,dp2[i][k].first};
                        else dp2[i][k].first = nd;
                    }
                    else if (nd.first > dp2[i][k].second.first){
                        if (nd.second != dp2[i][k].first.second) dp2[i][k].second = nd;
                    }
                }
            }
        }
    }
    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 (dp2[useless][m].first.second == i) cnt += dp2[useless][m].second.first;
        else cnt += dp2[useless][m].first.first;
        cout << cnt << "\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...