#include <bits/stdc++.h>
using namespace std;
#define file "o"
#define ff(i, a, b) for(auto i=(a); i<=(b); ++i)
#define ffr(i, b, a) for(auto i=(b); i>=(a); --i)
#define nl "\n"
#define ss " "
#define pb emplace_back
#define fi first
#define se second
#define sz(s) (int)s.size()
#define all(s) (s).begin(), (s).end()
#define ms(a,x) memset(a, x, sizeof (a))
#define cn continue
#define re exit(0)
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
inline ll ran(ll l, ll r)
{
return uniform_int_distribution<ll> (l, r)(rng);
}
inline void rf()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
if(fopen(file".inp","r"))
{
freopen(file".inp","r",stdin);
freopen(file".out","w",stdout);
}
}
const int mod=1e9+7;
const int maxn=3e5+15;
const ll inf=1e16;
template<typename T> inline void add(T &x, const T &y)
{
x+=y;
if(x>=mod) x-=mod;
if(x<0) x+=mod;
}
template<typename T> inline bool maxi(T &a, T b)
{
if(a>=b) return 0;
a=b; return 1;
}
template<typename T> inline bool mini(T &a, T b)
{
if(a<=b) return 0;
a=b; return 1;
}
int n, m;
bool a[maxn][25];
int zero[maxn], cnt[25];
vi tmp[2];
pii id[(1<<20)+5];
struct cand{int val, p;} b1[(1<<20)+5], b2[(1<<20)+5];
inline void addc(cand &a, cand &b, const cand &x)
{
if(x.p==0 || a.p==x.p || b.p==x.p) return;
if(x.val>a.val) b=a, a=x;
else if(x.val>b.val) b=x;
}
inline void addp(pii &mask, int x)
{
if(x==0 || mask.fi==x || mask.se==x) return;
if(mask.fi==0) mask.fi=x;
else if(mask.se==0) mask.se=x;
}
inline void merge(pii &a, const pii &b)
{
addp(a, b.fi);
addp(a, b.se);
}
signed main()
{
rf();
cin>>n>>m;
ff(i, 1, n) ff(j, 0, m-1)
{
bool bit; cin>>bit; a[i][j]=bit;
if(bit) ++cnt[j];
else zero[i]|=(1<<j);
}
ff(i, 1, n) addp(id[zero[i] ], i);
ff(i, 0, m-1) ff(mask ,0, (1<<m)-1) if(!((mask>>i)&1))
{
int nmask=(mask|(1<<i));
merge(id[mask], id[nmask]);
}
int all=(1<<m)-1;
ff(mask, 0, all)
{
b1[mask]=b2[mask]={-1, 0};
int c=__builtin_popcount(mask);
if(id[mask].fi) addc(b1[mask], b2[mask], {c, id[mask].fi});
if(id[mask].se) addc(b1[mask], b2[mask], {c, id[mask].se});
}
ff(i, 0, m-1) ff(mask, 0, all) if((mask>>i)&1)
{
int sub=(mask^(1<<i) );
addc(b1[mask], b2[mask], b1[sub]);
addc(b1[mask], b2[mask], b2[sub]);
}
int sl=0;
ff(i, 0, m-1)
{
if(cnt[i]>=n/2+2) ++sl;
else if(cnt[i]<n/2) cn;
else tmp[cnt[i]-n/2].pb(i);
}
ff(boss, 1, n)
{
int ans=sl;
vi bit;
for(auto i:tmp[1])
{
if(!a[boss][i]) ++ans;
else bit.pb(i);
}
for(auto i:tmp[0]) if(!a[boss][i]) bit.pb(i);
sort(all(bit));
int mask=0;
for(auto i:bit) mask|=(1<<i);
int mx=0;
if(b1[mask].p!=0 && b1[mask].p!=boss) mx=b1[mask].val;
else if(b2[mask].p!=0 && b2[mask].p!=boss) mx=b2[mask].val;
if(mx<0) mx=0;
ans+=mx;
cout<<ans<<nl;
}
re;
}
Compilation message (stderr)
council.cpp: In function 'void rf()':
council.cpp:40:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
40 | freopen(file".inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
council.cpp:41:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
41 | freopen(file".out","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~| # | 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... |