天天看點

Luogu P3622 [APIO2007]動物園

#include <bits/stdc++.h>

using namespace std;
int N, C, E, F, L, x, ans, f[50010][32], w[50010][32];

int main(int argc, char const *argv[]) {
  cin >> N >> C;
  for (int i = 1; i <= C; i++) {
    scanf("%d%d%d", &E, &F, &L); int fear = 0, like = 0;
    for (int j = 1; j <= F; j++) scanf("%d", &x), fear |= (1 << ((x - E + N) % N));
    for (int j = 1; j <= L; j++) scanf("%d", &x), like |= (1 << ((x - E + N) % N));
    for (int j = 0; j < 32; j++) if ((~j & like) or (fear & j)) w[E][j]++;
  }
  for (int s = 0; s < 32; s++) {
    memset(f[0], -0x3f, sizeof f[0]); f[0][s] = 0;
    for (int j = 1; j <= N; j++) for (int k = 0; k < 32; k++)
      f[j][k] = max(f[j - 1][(k & 15) << 1], f[j - 1][(k & 15) << 1 | 1]) + w[j][k];
    ans = max(ans, f[N][s]);
  }
  cout << ans << endl;
}