제출 #1335742

#제출 시각아이디문제언어결과실행 시간메모리
1335742WongYiKaiCouncil (JOI23_council)C++20
0 / 100
74 ms5612 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++){
            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(guyy);
                }
            }
        }
    }
    pair<pair<ll,ll>,pair<ll,ll>> dp2[1<<m]; //val, idx
    // max 0s
    for (int i=0;i<(1<<m);i++){
        dp2[i] = {{0,-1},{0,-1}};
        for (int j=0;j<(1<<m);j++){
            if (dp[j][m].empty()) continue;
            if ((i&j)==i){
                for (pair<ll,ll> nd:dp[j][m]){
                    if (nd.first > dp2[i].first.first){
                        if (nd.second == dp2[i].second.second) dp2[i] = {nd,dp2[i].first};
                        else dp2[i].first = nd;
                    }
                    else if (nd.first > dp2[i].second.first){
                        if (nd.second != dp2[i].first.second) dp2[i].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].first.second == i) cnt += dp2[useless].second.first;
        else cnt += dp2[useless].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...