#zYDPybttg050405. 1596:动物园

1596:动物园

好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:


题目描述

原题来自:APIO 2007

新建的圆形动物园是亚太地区的骄傲。圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围栏里有一种动物。围栏按照顺时针编号为 1,2,,N1,2,\dots,N

你是动物园的公关主管。今天有一群小朋友来到动物园参观,每个小朋友可以看到连续的 55 个围栏(从某个围栏 EE 开始,顺时针数 55 个)。你得到了所有小朋友喜欢和害怕的动物信息。当下面两处情况之一发生时,小朋友就会高兴:

  1. 至少有一个他害怕的动物被移走;
  2. 至少有一个他喜欢的动物没被移走。

你可以选择将一些动物从围栏中移走(但不能太多,否则动物太少),目标是让尽量多的小朋友高兴。

输入给出 NN(围栏数)和 CC(小朋友数),以及每个小朋友的信息(看到的第一个围栏 EE,害怕的动物数 FF 和喜欢的动物数 LL,以及具体的害怕和喜欢的围栏列表)。输出最多可以让多少个小朋友高兴。


输入格式

输入的第一行包含两个整数 N,CN, C,用空格分隔。

接下来的 CC 行,每行描述一个小朋友的信息,格式如下:

E F L X1 X2 ... XF Y1 Y2 ... YL

其中:

  • EE 表示该小朋友可以看到的第一个围栏编号,他可以看到的围栏为 E,E+1,E+2,E+3,E+4E, E+1, E+2, E+3, E+4(若编号超过 NN 则从 11 开始继续编号);
  • FF 表示该小朋友害怕的动物数;
  • LL 表示该小朋友喜欢的动物数;
  • X1,X2,,XFX_1, X_2, \dots, X_F 是他害怕的动物所在的围栏编号;
  • Y1,Y2,,YLY_1, Y_2, \dots, Y_L 是他喜欢的动物所在的围栏编号。

所有 XiX_iYjY_j 互不相同,且都在该小朋友可以看到的 55 个围栏内。

小朋友已经按照他们可以看到的第一个围栏的编号 EE 从小到大排好序(相同 EE 则按输入顺序)。


输出格式

输出一个整数,表示最多可以让多少个小朋友高兴。


样例

样例输入 1

14 5
2 1 2 4 2 6
3 1 1 6 4
6 1 2 9 6 8
8 1 1 9 12
12 3 0 12 13 2

样例输出 1

5

样例说明 1

这是题目描述中的示例,通过选择合适的移走动物方案,可以让所有 55 个小朋友高兴。

一种方案:只移走围栏 1313 中的动物。


样例输入 2

12 7
1 1 1 1 5
5 1 1 5 7
5 0 3 5 7 9
7 1 1 7 9
9 1 1 9 11
9 3 0 9 11 1
11 1 1 11 1

样例输出 2

6

样例说明 2

对于该数据,无法让所有 77 个小朋友都高兴,最多可以让 66 个小朋友高兴。


数据范围

对于全部数据:

  • 10N10410 \le N \le 10^4
  • 1C5×1041 \le C \le 5 \times 10^4
  • 1EN1 \le E \le N

时空限制

  • 时间:1000 ms1000 \text{ ms}
  • 内存:524288 KB524288 \text{ KB}

提示
此题为 环形 DP + 状态压缩 问题。

核心:每个小朋友只能看到连续的 55 个围栏,所以我们可以用状压 DP 表示这连续 55 个围栏中哪些移走(11 表示移走,00 表示保留)。

思路

  1. 将环形问题转化为线性问题:枚举前 55 个围栏的状态(共 25=322^5=32 种),然后递推计算;
  2. dp[i][S]dp[i][S] 表示考虑前 ii 个围栏,且第 ii 个围栏开始往前连续 55 个围栏的状态为 SS(二进制最低位表示围栏 ii 的状态,次低位表示围栏 i1i-1,以此类推),前 ii 个围栏对应的最大高兴小朋友数;
  3. 转移:从 dp[i1][S]dp[i-1][S'] 转移到 dp[i][S]dp[i][S],其中 SS' 的高 44 位与 SS 的低 44 位相同(即状态滑动窗口);
  4. 在转移时,计算第 ii 个围栏对应的所有以 ii 为起始的小朋友是否高兴(即看 SS 对应的 55 个围栏状态是否满足该小朋友的条件);
  5. 由于是环形,最后需要检查枚举的初始状态是否与末尾状态兼容。

条件判断: 对于一个小朋友,设他看到的 55 个围栏为 p1,p2,p3,p4,p5p_1,p_2,p_3,p_4,p_5,对应状态 SS 的相应位为 b1,b2,b3,b4,b5b_1,b_2,b_3,b_4,b_511 表示移走)。

  • \exists 害怕的围栏 XjX_j 对应的位为 11,则小朋友高兴;
  • 否则,若 \exists 喜欢的围栏 YjY_j 对应的位为 00,则小朋友高兴;
  • 否则,小朋友不高兴。

复杂度

  • 状态数:O(N×25)O(N \times 2^5)
  • 转移:每个状态转移到两个新状态(因为新的一位是 0011);
  • 判断小朋友是否高兴可预处理每个围栏作为起点时的判断函数。

总复杂度 O(N×32)O(N \times 32),可以接受。