Submission #1159667

#TimeUsernameProblemLanguageResultExecution timeMemory
1159667ace5Council (JOI23_council)C++20
0 / 100
1145 ms17080 KiB
#include <bits/stdc++.h>

using namespace std;

const int maxn = 300005,maxm = 21;

bool a[maxm][maxn];
pair<int,int> dp[1<<maxm];
int x[1<<maxm];
pair<int,int> mx[1<<maxm];
int cou[maxm];
int tnum[maxn];

pair<int,int> mrg(pair<int,int> a,pair<int,int> b)
{
    set<int> k;
    k.insert(a.first);
    k.insert(a.second);
    k.insert(b.first);
    k.insert(b.second);
    auto it = k.end();
    it--;
    pair<int,int> res;
    res.first = *it;
    it--;
    res.second = *it;
    return res;
}

int getr(int i,int x)
{
    if(i == -1)
    {
        return 100;
    }
    return __builtin_popcount(x | tnum[i]);
}

pair<int,int> mrg2(pair<int,int> a,pair<int,int> b,int d)
{
    set<int> k;
    k.insert(a.first);
    k.insert(a.second);
    k.insert(b.first);
    k.insert(b.second);
    vector<int> ans;
    for(auto c:k)
        ans.push_back(c);
    sort(ans.begin(),ans.end(),[&](int x,int y){return getr(x,d) < getr(y,d);});
    pair<int,int> res = {ans[0],ans[1]};
    return res;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n,m;
    cin >> n >> m;
    for(int i = 0;i < (1<<m);++i)
        dp[i] = {-1,-1};
    for(int i = 0;i < n;++i)
    {
        int num = 0;
        for(int j = 0;j < m;++j)
        {
            cin >> a[j][i];
            cou[j] += a[j][i];
            num += a[j][i] * (1<<j);
        }
     //   cout << num << ' ';
        dp[num] = {i,-1};
        x[num] ++;
        tnum[i] = num;
    }
    for(int j = 0;j < m;++j)
    {
        for(int i = 0;i < (1<<m);++i)
        {
            if((i & (1<<j)) == 0)
            {
                dp[i ^ (1<<j)] = mrg(dp[i^(1<<j)],dp[i]);
            }
        }
    }
    for(int j = 0;j < (1<<m);++j)
    {
        mx[j] = dp[j];
    }
    for(int j = 0;j < m;++j)
    {
        for(int i = (1<<m)-1;i >= 0;--i)
        {
            if((i & (1<<j)))
            {
                mx[i ^ (1<<j)] = mrg2(mx[i^(1<<j)],mx[i],(i^(1<<j)));
            }
        }
    }
    for(int i = 0;i < n;++i)
    {
        int ans = 0;
        for(int j = 0;j < m;++j)
        {
            cou[j] -= a[j][i];
        }
        int mask = (1<<m)-1;
        for(int j = 0;j < m;++j)
        {
            if(cou[j] > n/2)
            {
                ans ++;
            }
            if(cou[j] == n/2)
            {
                mask ^= (1<<j);
            }
        }
        for(int j = 0;j < m;++j)
        {
            cou[j] += a[j][i];
        }
        pair<int,int> c = mx[mask];
        if(c.first == i)
        {
            ans += m-getr(c.second,mask);
        }
        else
            ans += m-getr(c.first,mask);
        cout << ans << "\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...