Submission #1063968

#TimeUsernameProblemLanguageResultExecution timeMemory
1063968MOUF_MAHMALATCouncil (JOI23_council)C++14
100 / 100
512 ms35172 KiB
#include <bits/stdc++.h>
#define all(v) v.begin(),v.end()
#define F first
#define S second
using namespace std;
typedef int ll;
typedef pair<ll,ll>pll;
const ll oo=3e5+9;
ll n,m,c[20];
bool b[20][oo];
pll dp[2][1<<20];
void solve()
{
    cin>>n>>m;
    for(ll i=0; i<(1<<m); i++)
        dp[0][i]=dp[1][i]= {-1,-1};
    for(ll i=0; i<n; i++)
    {
        ll mask=0;
        for(ll j=0; j<m; j++)
        {
            cin>>b[j][i];
            if(!b[j][i])
                mask|=(1<<j);
            c[j]+=b[j][i];
        }
        if(dp[0][mask].F== -1)
            dp[0][mask]= {1,i};
        else
            dp[1][mask]= {1,i};
    }
    for(ll j=m-1; j>=0; j--)
        for(ll i=(1<<m)-1; i>=0; i--)
        {
            if(!((1<<j)&i))
            {
                if(dp[0][i|(1<<j)].F!= -1)
                {
                    if(dp[0][i].F== -1)
                        dp[0][i]=dp[0][i|(1<<j)];
                    else if(dp[0][i].S!=dp[0][i|(1<<j)].S)
                        dp[1][i]=dp[0][i|(1<<j)];
                }
                if(dp[1][i|(1<<j)].F!= -1)
                {
                    if(dp[0][i].F== -1)
                        dp[0][i]=dp[1][i|(1<<j)];
                    else if(dp[0][i].S!=dp[1][i|(1<<j)].S)
                        dp[1][i]=dp[1][i|(1<<j)];
                }
            }
        }
    for(ll i=0; i<(1<<m); i++)
        for(ll j=0; j<2; j++)
            if(dp[j][i].F != -1)
            {
                ll x=__builtin_popcountll(i);
                dp[j][i].F=x;
            }
    for(ll j=0; j<m; j++)
        for(ll i=0; i<(1<<m); i++)
        {
            if(!((1<<j)&i))
                continue;
            pll a[4];
            a[0]=dp[0][i];
            a[1]=dp[1][i];
            a[2]=dp[0][i^(1<<j)];
            a[3]=dp[1][i^(1<<j)];
            sort(a,a+4,greater<pll>());
            dp[0][i]=a[0];
            dp[1][i]={-1,-1};
            for(ll k=1;k<4;k++)
                if(a[0].S!=a[k].S)
            {
                dp[1][i]=a[k];
                break;
            }
        }
//    for(ll i=0;i<(1<<m);i++)
//    {
//        cout<<dp[0][i].F<<" "<<dp[1][i].F<<"\n";
//        cout<<dp[0][i].S<<" ?? "<<dp[1][i].S<<"\n";
//    }
    for(ll i=0; i<n; i++)
    {
        ll mask=(1<<m)-1,ans=0;
        for(ll j=0; j<m; j++)
        {
            c[j]-=b[j][i];
            if(c[j]-1>=n/2)
                ans++,mask^=(1<<j);
            if(c[j]<n/2)
                mask^=(1<<j);
//            cout<<ans<<" ";
        }
//        cout<<"\n";
//        cout<<mask<<" "<<ans<<" "<<"!\n";
//        cout<<dp[0][mask].F<<" "<<dp[0][mask].S<<"\n";
//        cout<<dp[1][mask].F<<" "<<dp[1][mask].S<<"\n";
        if(dp[0][mask].S==i)
            cout<<ans+dp[1][mask].F<<"\n";
        else
            cout<<ans+dp[0][mask].F<<"\n";
        for(ll j=0;j<m;j++)
            c[j]+=b[j][i];
    }
}
int main()
{
    ios_base::sync_with_stdio(0),cin.tie(0);
    ll tt=1;
//    cin>>tt;
    while(tt--)
        solve();
    return 0;
}
//3
//3
//3
//2
//3
//2
//2
//1
//3
//2
//2
//1
//2
//1
//1
//0
#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...