Submission #1356967

#TimeUsernameProblemLanguageResultExecution timeMemory
1356967avighnaCouncil (JOI23_council)C11
100 / 100
380 ms31064 KiB
#include <stdio.h>

#define N 300000
#define M 20

int a[N], votes[M], cnt[1 << M][2], p[1 << M], dp[1 << M][4];

int popcount(int x) { return __builtin_popcount(x); }
int max(int a, int b) { return a > b ? a : b; }
void swap(int *a, int *b) { *a ^= *b, *b ^= *a, *a ^= *b; }

void add(int m, int v, int i) {
  if (dp[m][2] == i) {
    dp[m][0] = max(dp[m][0], v);
  } else if (dp[m][3] == i) {
    dp[m][1] = max(dp[m][1], v);
  } else {
    if (v >= dp[m][0]) {
      dp[m][1] = dp[m][0], dp[m][3] = dp[m][2];
      dp[m][0] = v, dp[m][2] = i;
    } else if (v >= dp[m][1]) {
      dp[m][1] = v, dp[m][3] = i;
    }
  }
  if (dp[m][0] < dp[m][1]) {
    swap(&dp[m][0], &dp[m][1]), swap(&dp[m][2], &dp[m][3]);
  }
}

int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; ++i) {
    for (int j = 0, x; j < m; ++j) {
      scanf("%d", &x);
      a[i] = (a[i] << 1) | x;
      votes[m - j - 1] += x;
    }
    int b = ~a[i] & ((1 << m) - 1);
    if (p[b] < 2) {
      cnt[b][p[b]++] = i;
    }
  }

  for (int i = 0; i < m; ++i) {
    for (int mask = (1 << m) - 1; mask >= 0; --mask) {
      if (mask & 1 << i) {
        for (int j = 0; j < p[mask]; ++j) {
          if (p[mask ^ 1 << i] < 2) {
            cnt[mask ^ 1 << i][p[mask ^ 1 << i]++] = cnt[mask][j];
          }
        }
      }
    }
  }

  for (int mask = 0; mask < 1 << m; ++mask) {
    for (int i = 0; i < p[mask]; ++i) {
      add(mask, popcount(mask), cnt[mask][i]);
    }
  }
  for (int i = 0; i < m; ++i) {
    for (int mask = 0; mask < 1 << m; ++mask) {
      if (mask & 1 << i) {
        add(mask, dp[mask ^ 1 << i][0], dp[mask ^ 1 << i][2]);
        add(mask, dp[mask ^ 1 << i][1], dp[mask ^ 1 << i][3]);
      }
    }
  }

  for (int i = 0; i < n; ++i) {
    int cur = 0, mask = 0;
    for (int j = 0; j < m; ++j) {
      if (votes[j] - !!(a[i] & 1 << j) == n >> 1) {
        mask |= 1 << j;
      }
      cur += votes[j] - !!(a[i] & 1 << j) > n >> 1;
    }
    printf("%d\n", cur + dp[mask][dp[mask][2] == i]);
  }
}

Compilation message (stderr)

council.c: In function 'main':
council.c:32:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   32 |   scanf("%d%d", &n, &m);
      |   ^~~~~~~~~~~~~~~~~~~~~
council.c:35:7: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   35 |       scanf("%d", &x);
      |       ^~~~~~~~~~~~~~~
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...