题目描述

新建的圆形动物园是亚太地区的骄傲。圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围栏里有一种动物。

你是动物园的公共主管。你要做的是,让每个来动物园的人都尽可能高兴。今天有一群小朋友来动物园参观,你希望能让他们在动物园度过一段美好的时光。但这并不是一件容易的事——有的动物有一些小朋友喜欢,有的动物有一些小朋友害怕。如,Alex 喜欢可爱的猴子和考拉,而害怕拥牙齿锋利的狮子。而Polly 会因狮子有美丽的鬃毛而喜欢它,但害怕有臭味的考拉。

你可以选择将一些动物从围栏中移走以使得小朋友不会害怕。但你不能移走所有的动物,否则小朋友们就没有动物可看了。

每个小朋友站在大围栏圈的外面,可以看到连续的 5 个围栏。你得到了所有小朋友喜欢和害怕的动物信息。当下面两处情况之一发生时,小朋友就会高兴:

至少有一个他害怕的动物被移走

至少有一个他喜欢的动物没被移走

假如你将围栏 4 和 12 的动物移走。Alex 和 Ka-Shu 将很高兴,因为至少有一个他们害怕的动物被移走了。这也会使 Chaitanya 高兴,因为他喜欢的围栏 6 和8 中的动物都保留了。但是,Polly 和 Hwan 将不高兴,因为他们看不到任何他们喜欢的动物,而他们害怕的动物都还在。这种安排方式使得三个小朋友高兴。

现在,换一种方法,如果你将围栏 4 和 6 中的动物移走,Alex 和 Polly 将很高兴,因为他们害怕的动物被移走了。Chaitanya 也会高兴,虽然他喜欢的动物 6被移走了,他仍可以看到围栏 8 里面他喜欢的动物。同样的 Hwan 也会因可以看到自己喜欢的动物 12 而高兴。唯一不高兴的只有 Ka-Shu。

如果你只移走围栏 13 中的动物,Ka-Shu 将高兴,因为有一个他害怕的动物被移走了,Alex, Polly, Chaitanya 和 Hwan 也会高兴,因为他们都可以看到至少一个他们喜欢的动物。所以有 5 个小朋友会高兴。这种方法使得了最多的小朋友高兴。

输入输出格式

输入格式:

输入的第一行包含两个整数 N,C,用空格分隔。N 是围栏数(1≤N≤10 000),C是小朋友的个数(1≤C≤50 000)。围栏按照顺时针的方向编号为 1,2,3,…,N。

接下来的 C 行,每行描述一个小朋友,描述下面的形式给出:

E F L X1 X2 … XF Y1 Y2 … YL

其中:

E 表示小朋友可以看到的第一个围栏的编号(1≤E≤N),也就是说,小朋友可以看到的围栏为 E,E+1,E+2,E+3,E+4。注意,如果编号超过 N 将继续从 1 开始算。

如:当 N=14,E=13 时,小朋友可以看到的围栏为 13,14,1,2 和 3。 F 表示小朋友害怕的动物数。L 表示小朋友喜欢的动物数。

围栏 X1, X2, …, XF中包含小朋友害怕的动物。 围栏 Y1, Y2, …, YL中包含小朋友喜欢的动物。 X1, X2, …, XF, Y1, Y2, …, YL是两两不同的数,而且所表示的围栏都是小朋友可以看到的。

小朋友已经按照他们可以看到的第一个围栏的编号从小到大的顺序排好了(这样最小的E对应的小朋友排在第一个,最大的E对应的小朋友排在最后一个)。

注意可能有多于一个小朋友对应的 E 是相同的。

输出格式:

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

输入输出样例

输入样例#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

说明

第一个样例是题目描述中的例子,所有的 C=5 个小朋友都能高兴。第二个样

例是一个不能使得所有 C=7 个小朋友都高兴的例子。


状压dp

然而我想了半天才往状压上想

可以发现每个人都最多只能看见5个动物园内的情况

所以可以暴力枚举以i为开始往后5个的动物园的状态

这样,用f[i][j]表示以动物园i开始的5个动物园状态为j时小朋友的最大满意度

然后枚举状态,取前四位的状态,再枚举第5个动物园的状态就好辣

但是这些动物园是一个环

所以第n个的状态应该是和第1个的状态一样的

我们就再从外层枚举第1个动物园的状态就可以了

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
const int M = 50005 ;
const int N = 65 ;
using namespace std ;
inline int read() {
char c = getchar() ; int x = 0 , w = 1 ;
while(c>'9'||c<'0') { if(c=='-') w = -1 ; c = getchar() ; }
while(c>='0' && c<='9') { x = x*10+c-'0'; c = getchar() ; }
return x*w ;
}
int n , m ;
int f[M][N] , sit[M][N] , Ans = -1 ;
int main() {
n = read() ; m = read() ;
for(int i = 1 , e , fnum , lnum , x , y , fear , like ; i <= m ; i ++) {
e = read() ;
fnum = read() ; lnum = read() ;
fear = like = 0 ;
for(int j = 1 ; j <= fnum ; j ++) {
x = read() ;
x = (x - e + n)%n ;
fear |= (1<<x) ;
}
for(int j = 1 ; j <= lnum ; j ++) {
y = read() ;
y = (y - e + n)%n ;
like |= (1<<y) ;
}
for(int j = 0 ; j < (1<<5) ; j ++) {
if((~j & fear) || (j & like))
++sit[e][j] ;
}
}
for(int T = 0 ; T < (1<<5) ; T ++ ) {
memset(f[0] , -63 , sizeof(f[0])) ;
f[0][T] = 0 ;
for(int i = 1 ; i <= n ; i ++)
for(int j = 0 ; j < (1<<5) ; j ++)
f[i][j] = max(f[i - 1][(j&15)<<1] , f[i - 1][(j&15)<<1|1]) + sit[i][j] ;
Ans = max(Ans , f[n][T]) ;
}
printf("%d\n",Ans) ;
return 0 ;
}

[APIO2007]动物园的更多相关文章

  1. [APIO2007]动物园 --- 状压DP

    [APIO2007]动物园 题目描述 新建的圆形动物园是亚太地区的骄傲.圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围栏里有一种动物. 如下图所示: 你是动物园的公共主管.你要做的是,让每 ...

  2. P3622 [APIO2007]动物园

    题目链接 题意分析 这是一道状压\(DP\)的题 一个人只可以欣赏到\(5\)只动物 显然可以状压 我们用\(dp[i][j]\)表示当前\([i,i+4]\)中这\(5\)只动物的状态\(j\) 在 ...

  3. 【[APIO2007]动物园】

    我好\(sb\)啊,把\(>>\)打成\(<<\)结果就写了两节课 那个一个人只能看到五个动物显然很鬼畜 那我们就可以压这一维了 \(dp[i][s]\)表示从第\(i\)个位 ...

  4. 【题解】APIO2007动物园

    首先一眼感受到这题特别的性质……5个?这么小的,感觉就像是状压.脑补了一下,如果没有环的话应该很好做吧……有环怎么办?5真的很小的,随便乱搞肯定也可以.那就放在外面暴力枚举吧.然后正解就出来了. 然而 ...

  5. 题解 洛谷P3622/BZOJ1151【[APIO2007]动物园】

    这一道题,我也是搞了很久才搞懂的(也就两个多小时). 感谢Rayment大佬的题解! 我们进入正题. 对于一个笼子里的动物,我们可以选择撤走或不撤走,可以用0和1来表示,很容易就想到二进制,想到状压d ...

  6. 洛谷 P3622 [APIO2007]动物园【状压dp】

    看成网络流建图想了好久... 实际上5个是可以状压的 设f[i][k]为到第i个围栏状态为k的方案数,因为考虑到重复,设g[i][k]记录i开始,状态为k的孩子有几个 状态转移很好想:f[j][k]= ...

  7. Luogu [P3622] [APIO2007]动物园

    题目链接 比较费脑子的一道题 先说题目核心思想 : 状压dp 环的处理我们先不管. 我们设 dp[j][s] 表示 到达动物 j 且 [ j , j+5) 这五个动物状态为s时 最多能使多少小朋友开心 ...

  8. P3622 [APIO2007]【一本通提高状态压缩类动态规划】动物园

    广告 绿树公司 - 官方网站:https://wangping-lvshu.github.io/LvshuNew/ 绿树智能 - 官方网站:https://wangping-lvshu.github. ...

  9. 「疫期集训day2」高地

    硝烟从凡尔登高地的东方升起...我只知道这里会发生世界上前所未有的一次战役------凡尔登的法军士兵 今天运气挺好,早自习刚复习完数论和二分图,考试时又复习了状压和Tarjan 于是乎成绩惨不忍睹 ...

随机推荐

  1. 1sting 大数 递推

    You will be given a string which only contains ‘1’; You can merge two adjacent ‘1’ to be ‘2’, or lea ...

  2. 携程Apollo(阿波罗)配置中心在Spring Boot项目快速集成

    前提:先搭建好本地的单机运行项目:http://www.cnblogs.com/EasonJim/p/7643630.html 说明:下面的示例是基于Spring Boot搭建的,对于Spring项目 ...

  3. Windows 10 S中的Device Guard详解(上篇)

    本文探讨Windows 10 S(下称Win10S)中的Device Guard(设备保护,下称DG).我将提取策略,并弄清楚在默认Win10S系统上可以和不可以运行什么.我将在下一篇文章中介绍在不安 ...

  4. Outlook2010 没有Exchange Server,怎么自动回复邮件?

    步骤 1:创建邮件模板 单击“开始”>“新建邮件”. 在邮件正文中,键入要作为自动答复发送的邮件. 在邮件窗口中,单击“文件”>“另存为”. 在“另存为”对话框中的“保存类型”列表中,单击 ...

  5. C#如何设置窗体不能修改大小

    找到FormBorderStyle设置为FixedDialog即可                      

  6. osg提前定义几何体设置颜色

    注意尽管osg::shape不能够设置颜色,可是osg::shapedrawable能够.

  7. nginx-1.5.10 之mips编译到RT5350

    编译nginx-1.5.10一般须要下面库的支持:pcre,zlib,openssl 此次编译nginx-1.5.10使用的库版本号分别为pcre-8.34:openssl-1.0.0l:zlib-1 ...

  8. appium desktop

    Appium-desktop 下载地址:https://github.com/appium/appium-desktop/releases 一般功能 这些能力跨越多个驱动因素. 仅限Android 这 ...

  9. Android 布局自适应屏幕

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenFzNjI3NjExMzA=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  10. [Android Studio] 取消引用库打包出现异常-- provided dependencies can only be jars

    Warning: Project App: provided dependencies can only be jars. com.android.support:appcompat-v7:22.2. ...