Submission #1147399

#TimeUsernameProblemLanguageResultExecution timeMemory
1147399Hamed_GhaffariCouncil (JOI23_council)C++20
100 / 100
347 ms18908 KiB
#include<bits/stdc++.h>
using namespace std;

using pii = pair<int, int>;
using ppp = pair<pii, pii>;

#define X first
#define Y second
#define maxs(a,b) (a=max(a,b))

const int MXN = 3e5+3;
const int MXM = 20;

int n, m, cnt[MXM];
int a[MXN];

ppp dp[1<<MXM];

void upd(ppp &x, pii y) {
  if(y.X>x.X.X) {
    if(x.X.Y!=y.Y) {
      x.Y = x.X;
    }
    x.X = y;
  }
  else if(y.X>x.Y.X && y.Y!=x.X.Y)
    x.Y = y;
}
void upd(ppp &x, ppp y) {
  upd(x, y.X);
  upd(x, y.Y);
}

int32_t main() {
  cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
  cin >> n >> m;
  for(int msk=0; msk<(1<<m); msk++) dp[msk] = {{-1,-1}, {-1,-1}};
  for(int i=0; i<n; i++) {
    for(int j=0,x; j<m; j++) {
      cin >> x;
      if(x) {
        a[i] ^= 1<<j;
        cnt[j]++;
      }
    }
    upd(dp[((1<<m)-1)^a[i]], {__builtin_popcount(((1<<m)-1)^a[i]), i});
  }
  for(int i=0; i<m; i++)
    for(int msk=0; msk<(1<<m); msk++)
      if(!(msk>>i&1))
        upd(dp[msk], {{dp[msk^(1<<i)].X.X-1, dp[msk^(1<<i)].X.Y},
                      {dp[msk^(1<<i)].Y.X-1, dp[msk^(1<<i)].Y.Y}});
  for(int i=0; i<m; i++)
    for(int msk=0; msk<(1<<m); msk++)
      if(msk>>i&1)
        upd(dp[msk], dp[msk^(1<<i)]);
  for(int msk=0; msk<(1<<m); msk++) {
    if(dp[msk].X.Y!=-1) dp[msk].X.X = __builtin_popcount(msk) - dp[msk].X.X;
    if(dp[msk].Y.Y!=-1) dp[msk].Y.X = __builtin_popcount(msk) - dp[msk].Y.X;
  }
  for(int i=0; i<n; i++) {
    int ans = 0, msk=0;
    for(int j=0; j<m; j++)
      if(cnt[j]-(a[i]>>j&1) > n/2) ans++;
      else if(cnt[j]-(a[i]>>j&1) == n/2) msk ^= 1<<j;
    if(dp[msk].X.Y==i) cout << ans + __builtin_popcount(msk) - dp[msk].Y.X << '\n';
    else cout << ans + __builtin_popcount(msk) - dp[msk].X.X << '\n';
  }
  return 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...