Submission #1131549

#TimeUsernameProblemLanguageResultExecution timeMemory
113154912345678Council (JOI23_council)C++17
100 / 100
522 ms20080 KiB
#include <bits/stdc++.h>

using namespace std;

const int nx=3e5+5, mx=20;

int n, m, cnt[mx], x, vl[nx], rvl[nx];
pair<pair<int, int>, pair<int, int>> dp[(1<<mx)];

void add(int msk, pair<int, int> x)
{
    //if (msk==3) cout<<"add "<<x.first<<' '<<x.second<<'\n';
    if (x.first>=dp[msk].first.first)
    {
        if (x.second!=dp[msk].first.second) swap(dp[msk].first, dp[msk].second), dp[msk].first=x;
        else dp[msk].first=x;
    }
    else if (x.first>=dp[msk].second.first)
    {
        if (x.second==dp[msk].first.second) return;
        else dp[msk].second=x;
    }
}

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n>>m;
    for (int i=1; i<=n; i++) for (int j=0; j<m; j++) cin>>x, vl[i]+=x*(1<<j), cnt[j]+=x, rvl[i]+=(!x)*(1<<j);
    //for (int j=0; j<m; j++) cout<<"cnt "<<j<<' '<<cnt[j]<<'\n';
    for (int i=1; i<=n; i++) add(rvl[i], {__builtin_popcount(rvl[i]), i}); //cout<<"rvl "<<i<<' '<<rvl[i]<<'\n';
    for (int i=(1<<m)-1; i>=0; i--)
    {
        for (int j=0; j<m; j++)
        {
            if (!(i&(1<<j)))
            {
                int msk=(i+(1<<j));
                if (dp[msk].first.second) add(i, {dp[msk].first.first-1, dp[msk].first.second});
                if (dp[msk].second.second) add(i, {dp[msk].second.first-1, dp[msk].second.second});
            }
        }
    }
    for (int i=0; i<(1<<m); i++)
    {
        for (int j=0; j<m; j++)
        {
            if ((i&(1<<j)))
            {
                int msk=(i-(1<<j));
                add(i, dp[msk].first);
                add(i, dp[msk].second);
            }
        }
        //cout<<"dp "<<i<<' '<<dp[i].first.first<<' '<<dp[i].first.second<<' '<<dp[i].second.first<<' '<<dp[i].second.second<<'\n';
    }
    for (int i=1; i<=n; i++)
    {
        int msk=0, ans=0;
        for (int j=0; j<m; j++)
        {
            int cur=cnt[j]-((vl[i]&(1<<j))>0);
            //cout<<i<<' '<<j<<' '<<cur<<'\n';
            if (cur>n/2) ans++;
            else if (cur==n/2) msk|=(1<<j);
        }
        bitset<12> b(msk);
        //cout<<"debug "<<i<<' '<<b<<'\n';
        if (dp[msk].first.second!=i) cout<<ans+dp[msk].first.first<<'\n';
        else cout<<ans+dp[msk].second.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...