Submission #1308371

#TimeUsernameProblemLanguageResultExecution timeMemory
1308371thnhannCouncil (JOI23_council)C++20
100 / 100
555 ms41400 KiB
//#pragma GCC optimize("Ofast,unroll-loops")
//#pragma GCC target("avx,avx2,fma,lzcnt,popcnt")
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define ii pair<int,int>
#define ill pair<ll,ll>
#define el cout<<'\n'
#define int long long

const ll mod=1e9+7;
const int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
const int nmax=1e6;
const int inf =2e9;

void add(int &a, int b) {
    a += b;
    if (a >= mod) a -= mod;
    if (a < 0) a += mod;
}

template<typename T> void chkmin(T& x, T y) {if(x > y) x = y;}
template<typename T> void chkmax(T& x, T y) {if(x < y) x = y;}

using namespace std;

struct BestPair {
    int val1 = inf, id1 = 0;
    int val2 = inf, id2 = 0;

    void update(int val, int id) {
        if (val < val1) {
            if (id != id1) {
                val2 = val1; id2 = id1;
            }
            val1 = val; id1 = id;
        } else if (val < val2 && id != id1) {
            val2 = val; id2 = id;
        }
    }
    void merge(const BestPair& other) {
        if(other.id1 != 0) update(other.val1, other.id1);
        if(other.id2 != 0) update(other.val2, other.id2);
    }
};

int cnt[25];
bool a[300005][25];
int n, m;
vector<int> p;
int ans = 0;
int type[25];
int id[25];

BestPair dp[1 << 20];

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    cin >> n >> m;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            cin >> a[i][j];
            if(a[i][j])
                cnt[j]++;
        }
    }

    int k = n / 2;
    int timer = 0;
    for(int i=1; i<=m; i++)
    {
        if(cnt[i] >= k + 2)
        {
            ans++;
        }
        else
        {
            if(cnt[i] == k)
            {
                type[i] = 1;
                p.pb(i);
                id[i] = timer++;
            }
            else if(cnt[i] == k + 1)
            {
                type[i] = 2;
                p.pb(i);
                id[i] = timer++;
            }
        }
    }

    int sz = p.size();
    int full_mask = (1 << sz) - 1;

    for(int i=1;i<=n;i++)
    {
        int mask_person = 0;
        for(int j=0;j<sz;j++)
            if(a[i][p[j]])
        {
            mask_person |= (1<<j);
        }
        int zero = mask_person ^ full_mask;
        dp[zero].update(0,i);
    }

    for(int mask=full_mask;mask>=0;mask--)
    {
        for(int j=0;j<sz;j++)
            if((mask >> j) & 1)
        {
            int submask = mask ^ (1<<j);
            dp[submask].merge(dp[mask]);
        }
    }

    for(int mask=0;mask<=full_mask;mask++)
    {
        for(int j=0;j<sz;j++)
        {
            if((mask >> j) & 1)
            {
                int submask = mask ^ (1<<j);
                if(dp[submask].id1 != 0)
                    dp[mask].update(dp[submask].val1 + 1,dp[submask].id1);
                if(dp[submask].id2 != 0)
                    dp[mask].update(dp[submask].val2 + 1,dp[submask].id2);
            }
        }
    }

    for(int i=1; i<=n; i++)
    {
        int anscur = ans;
        vector<int> bucket;
        for(auto j : p)
        {
            if(a[i][j])
            {
                if(type[j] == 2)
                {
                    bucket.pb(id[j]);
                }
            }
            else
            {
                if(type[j] == 1)
                {
                    bucket.pb(id[j]);
                }
                else
                    anscur++;
            }
        }

        int mask = 0;
        for(auto bit : bucket)
            mask |= (1 << bit);

        anscur += bucket.size();

        int div;
        if(i == dp[mask].id1)
            div = dp[mask].val2;
        else
            div = dp[mask].val1;

        anscur -= div;
        cout << anscur << '\n';
    }
}
//Can i get a kiss? And can u make it last forever?
#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...