#zYDPybttg050405. 1596:动物园
1596:动物园
好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
原题来自:APIO 2007
新建的圆形动物园是亚太地区的骄傲。圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围栏里有一种动物。围栏按照顺时针编号为 。
你是动物园的公关主管。今天有一群小朋友来到动物园参观,每个小朋友可以看到连续的 个围栏(从某个围栏 开始,顺时针数 个)。你得到了所有小朋友喜欢和害怕的动物信息。当下面两处情况之一发生时,小朋友就会高兴:
- 至少有一个他害怕的动物被移走;
- 至少有一个他喜欢的动物没被移走。
你可以选择将一些动物从围栏中移走(但不能太多,否则动物太少),目标是让尽量多的小朋友高兴。
输入给出 (围栏数)和 (小朋友数),以及每个小朋友的信息(看到的第一个围栏 ,害怕的动物数 和喜欢的动物数 ,以及具体的害怕和喜欢的围栏列表)。输出最多可以让多少个小朋友高兴。
输入格式
输入的第一行包含两个整数 ,用空格分隔。
接下来的 行,每行描述一个小朋友的信息,格式如下:
E F L X1 X2 ... XF Y1 Y2 ... YL
其中:
- 表示该小朋友可以看到的第一个围栏编号,他可以看到的围栏为 (若编号超过 则从 开始继续编号);
- 表示该小朋友害怕的动物数;
- 表示该小朋友喜欢的动物数;
- 是他害怕的动物所在的围栏编号;
- 是他喜欢的动物所在的围栏编号。
所有 和 互不相同,且都在该小朋友可以看到的 个围栏内。
小朋友已经按照他们可以看到的第一个围栏的编号 从小到大排好序(相同 则按输入顺序)。
输出格式
输出一个整数,表示最多可以让多少个小朋友高兴。
样例
样例输入 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
这是题目描述中的示例,通过选择合适的移走动物方案,可以让所有 个小朋友高兴。
一种方案:只移走围栏 中的动物。
样例输入 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
对于该数据,无法让所有 个小朋友都高兴,最多可以让 个小朋友高兴。
数据范围
对于全部数据:
时空限制
- 时间:
- 内存:
提示
此题为 环形 DP + 状态压缩 问题。
核心:每个小朋友只能看到连续的 个围栏,所以我们可以用状压 DP 表示这连续 个围栏中哪些移走( 表示移走, 表示保留)。
思路:
- 将环形问题转化为线性问题:枚举前 个围栏的状态(共 种),然后递推计算;
- 设 表示考虑前 个围栏,且第 个围栏开始往前连续 个围栏的状态为 (二进制最低位表示围栏 的状态,次低位表示围栏 ,以此类推),前 个围栏对应的最大高兴小朋友数;
- 转移:从 转移到 ,其中 的高 位与 的低 位相同(即状态滑动窗口);
- 在转移时,计算第 个围栏对应的所有以 为起始的小朋友是否高兴(即看 对应的 个围栏状态是否满足该小朋友的条件);
- 由于是环形,最后需要检查枚举的初始状态是否与末尾状态兼容。
条件判断: 对于一个小朋友,设他看到的 个围栏为 ,对应状态 的相应位为 ( 表示移走)。
- 若 害怕的围栏 对应的位为 ,则小朋友高兴;
- 否则,若 喜欢的围栏 对应的位为 ,则小朋友高兴;
- 否则,小朋友不高兴。
复杂度:
- 状态数:;
- 转移:每个状态转移到两个新状态(因为新的一位是 或 );
- 判断小朋友是否高兴可预处理每个围栏作为起点时的判断函数。
总复杂度 ,可以接受。