Submission #1111678

#TimeUsernameProblemLanguageResultExecution timeMemory
1111678flashmtCouncil (JOI23_council)C++17
100 / 100
787 ms123468 KiB
#include <bits/stdc++.h>
using namespace std;
const int M = 20;

vector<int> id[1 << M];

void dfs(int bit, int mask, int curId)
{
  if (size(id[mask]) >= 2)
    return;

  if (bit < 0)
  {
    id[mask].push_back(curId);
    return;
  }

  dfs(bit - 1, mask, curId);
  if (mask >> bit & 1)
    dfs(bit - 1, mask ^ 1 << bit, curId);
}

int main()
{
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  vector<int> cntCol(m);
  vector<vector<int>> a(n, vector<int>(m));
  vector<int> maskA(n);
  for (int i = 0; i < n; i++)
  {
    int mask = 0;
    for (int j = 0; j < m; j++)
    {
      cin >> a[i][j];
      if (a[i][j]) cntCol[j]++;
      else mask |= 1 << j;
    }
    dfs(m - 1, mask, i);
  }

  vector<pair<int, int>> f(1 << m, make_pair(0, -1));
  auto f2 = f;
  for (int mask = 1; mask < 1 << m; mask++)
    if (!empty(id[mask]))
    {
      int bit = __builtin_popcount(mask);
      f[mask] = {bit, id[mask][0]};
      if (size(id[mask]) == 2)
        f2[mask] = {bit, id[mask][1]};
    }

  auto update = [&](pair<int, int> u, int mask)
  {
    if (u > f[mask])
    {
      if (f[mask].second != u.second)
        f2[mask] = f[mask];
      f[mask] = u;
    }
    else if (f[mask].second != u.second)
    {
      f2[mask] = max(f2[mask], u);
    }
  };

  for (int i = 0; i < m; i++)
    for (int mask = 1; mask < 1 << m; mask++)
      if (mask >> i & 1)
      {
        update(f[mask ^ 1 << i], mask);
        update(f2[mask ^ 1 << i], mask);
      }

  int need = n / 2;
  for (int i = 0; i < n; i++)
  {
    int importantMask = 0, approved = 0;
    for (int j = 0; j < m; j++)
    {
      cntCol[j] -= a[i][j];
      if (cntCol[j] == need) importantMask |= 1 << j;
      else if (cntCol[j] > need) approved++;
    }

    int best = f[importantMask].second != i ? f[importantMask].first : f2[importantMask].first;
    cout << approved + best << '\n';

    for (int j = 0; j < m; j++)
      cntCol[j] += a[i][j];
  }
}
#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...