Description

新建的圆形动物园是亚太地区的骄傲。圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围栏里有一
种动物。如下图所示:
你是动物园的公共主管。你要做的是,让每个来动物园的人都尽可能高兴。今天有一群小朋友来动物园参观,你希
望能让他们在动物园度过一段美好的时光。但这并不是一件容易的事——有的动物有一些小朋友喜欢,有的动物有
一些小朋友害怕。如,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 个小朋友会高兴。这种方法使得了最多的小朋友高兴。
 
 

Input

输入的第一行包含两个整数N, C,用空格分隔。
N是围栏数(10≤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是相同的。

Output

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

Sample Input

10 10
1 1 1 3 2
2 1 0 4
3 1 1 5 6
4 1 1 7 6
5 1 0 6
6 1 2 9 8 10
7 1 0 10
8 1 0 8
9 1 1 1 2
10 1 0 2

Sample Output

10
 
把四个格压成一个状态。
能得到转移方程:dp[i][j]=max(dp[i-1][(j&15)<<1],dp[i-1][(j&15)<<1|1])+val[i][j])
其中j&15就是放弃最高位,并枚举上一位是1还是0.
val预处理很好理解。
然后就是这道题难点,处理环。
我们暴力枚举前五位,最后只取后五位和前五位相同的更新ans。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#define in(a) a=read()
#define REP(i,k,n) for(int i=k;i<=n;i++)
using namespace std;
inline int read(){
int x=,f=;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-;
for(;isdigit(ch);ch=getchar())
x=x*+ch-'';
return x*f;
}
int n,m,a,u,v,ans=;
int p[]={,,,,,};
int val[][],dp[][];
int main(){
in(n),in(m);
REP(i,,m){
in(a),in(u),in(v);
int like=,hate=;
REP(j,,u) like|=p[(read()-a+n)%n];
REP(j,,v) hate|=p[(read()-a+n)%n];
REP(j,,) if((like&j) || (hate&~j)) val[a][j]++;
}
REP(u,,){
REP(i,,) dp[][i]=-;
dp[][u]=;
REP(i,,n)
REP(j,,)
dp[i][j]=max(dp[i-][(j&)<<],dp[i-][(j&)<<|])+val[i][j];
ans=max(ans,dp[n][u]);
}
printf("%d",ans);
}

bzoj1151 动物园的更多相关文章

  1. [BZOJ1151][CTSC2007]动物园zoo 解题报告|DP|位运算

    Description 最近一直在为了学习算法而做题,这道题是初一小神犇让我看的.感觉挺不错于是写了写. 这道题如果是一条线的话我们可以构造一个DP f[i,j]表示以i为起点,i,i+1...i+4 ...

  2. [bzoj1151][CTSC2007]动物园zoo_状压dp

    动物园zoo 题目大意:https://www.lydsy.com/JudgeOnline/problem.php?id=1151 题解: 我们发现每个点只会往右延伸$5$个,这个数非常小. 再加上每 ...

  3. 2018.09.08 bzoj1151: [CTSC2007]动物园zoo(状压dp)

    传送门 状压dp好题啊. 可以发现这道题的状压只用压缩5位. f[i][j]表示当前在第i个位置状态为j的最优值. 显然可以由f[i-1]更新过来. 因此只用预处理在第i个位置状态为j时有多少个小朋友 ...

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

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

  5. BZOJ3670 [Noi2014]动物园

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  6. 网页动物园2.0发布,经过几个月的努力,采用JAVA编写!

    网页动物园2.0发布,经过几个月的努力,采用JAVA编写! 网页动物园2.0 正式发布!游戏发布 游戏名称: 网页动物园插件 游戏来源: 原创插件 适用版本: Discuz! X1.5 - X3.5 ...

  7. 小兔伴伴家庭动物园AR智能早教产品上市

    2016年6月,经过乐卓大家庭所有人的共同努力,公司旗下首款新品——小兔伴伴之<家庭动物园>3D智能学习卡正式面世. 每个孩子都应该在合适的时间去体验丰富的声音.色彩和动作,<家庭动 ...

  8. [本人开发的游戏] Discuz网页动物园插件1.0Beta发布!让积分流动起来!

        插件发布 插件名称: DZ网页动物园插件 插件来源: 原创插件 适用版本: Discuz! X3 语言编码: GBK简体 UTF8简体 BIG5繁体 UTF8繁体  最后更新时间: 2014- ...

  9. BZOJ-3670 动物园 KMP+奇怪的东西

    YveH爷再刷KMP,DCrusher看他刷KMP,跟着两个人一块刷KMP... 3670: [Noi2014]动物园 Time Limit: 10 Sec Memory Limit: 512 MB ...

随机推荐

  1. java精确除法运算(BigDecimal)

    除法运算的函数定义如下 BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode) ; scale为小数位数 ...

  2. bzoj千题计划285:bzoj2555: SubString

    http://www.lydsy.com/JudgeOnline/problem.php?id=2555 后缀自动机,用LCT维护parent树 一个串的出现次数 = parent 树 上 其所在状态 ...

  3. bzoj千题计划266:bzoj4872: [六省联考2017]分手是祝愿

    http://www.lydsy.com/JudgeOnline/problem.php?id=4872 一种最优解是 从大到小灯有亮的就灭掉 最优解是唯一的,且关灯的顺序没有影响 最优解 对每个开关 ...

  4. CS53 C 单调栈

    给出一个目标序列,初始序列为0,你有一种操作方式可以将某段值相同的区间全部加上一定的值,问得到目标序列的最小次数. 开始没注意要求值相同,想都不想就暴力了,后来发现对于每个峰,只要找每个相对峰顶的阶数 ...

  5. WebSockets Tutorial(教程一)WebSockets简介

    一.WebSockets简介 以字面意思来说,握手可以被定义为两个人抓住和握手右手,象征着问候,祝贺,同意或告别.在计算机科学中,握手是确保服务器与客户端同步的过程.握手是Web Socket协议的基 ...

  6. 模拟jQuery中的ready方法及实现按需加载css,js

    一.ready函数的实现 经常用jQuery类库或其他类库中的ready方法,有时候想想它们到底是怎么实现的,但是看了一下jQuery中的源码,涉及到的模块比较多,(水平有限)代码比较难看懂:自己结合 ...

  7. J2EE架构

    从整体上讲,J2EE是使用Java技术开发企业级应用的一种事实上的工业标准(Sun公司出于其自身利益的考虑,至今没有将Java及其相关技术纳入标准化组织的体系),它是Java技术不断适应和促进企业级应 ...

  8. 【转】VTL-vm模板的变量用法

    http://www.cnblogs.com/zengxlf/archive/2009/05/06/1451004.html 加载foot模块页 #parse("foot.vm") ...

  9. 无锁并发框架Disruptor学习入门

    刚刚听说disruptor,大概理一下,只为方便自己理解,文末是一些自己认为比较好的博文,如果有需要的同学可以参考. 本文目标:快速了解Disruptor是什么,主要概念,怎么用 1.Disrupto ...

  10. centos7,php7 安装mysqli扩展

    首先安装MySQL https://www.cnblogs.com/manzb/p/9560403.html   php7安装后没有安装mysqli扩展的话: 安装mysqli扩展 1.到php文件e ...