#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)
{
pair<int,int> ans = a;
if(ans.first == -1)
{
ans = b;
}
else if(ans.second == -1)
{
if(b.first != -1)
ans.second = b.first;
}
return ans;
}
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)
{
//cout << dp[j].first << ' ' << dp[j].second << "\n";
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];
}
//cout << ans << ' ' << mask << ' ' << mx[mask].first << ' ' << mx[mask].second << "\n";
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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |