题目测评:https://www.luogu.org/problemnew/show/P3622

题目描述

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

你是动物园的公共主管。你要做的是,让每个来动物园的人都尽可能高兴。今天有一群小朋友来动物园参观,你希望能让他们在动物园度过一段美好的时光。但这并不是一件容易的事——有的动物有一些小朋友喜欢,有的动物有一些小朋友害怕。如,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:


输出样例#1:

5
输入样例#2:


输出样例#2:

6

说明

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

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

题解

这道题是状态压缩dp的进阶,不会状压dp的小盆友可以去看这篇博客

https://www.cnblogs.com/mxrmxr/p/9799832.html

......

好了。相信大家都学会状压dp了,那我们继续。

首先,看到这题,我们怎么知道它是用状压dp呢?

因为这里对于每个小朋友只能看到相邻的五个动物,对于每个位置我们可以改变移不移走开不开心的状态量很小,所以我们考虑状压DP。

其次,我们要搞出一个数组love[i][j],表示在i这个位置设置看到的5个动物有没有被移走(j用状压表示,0被移走,1没被移走)可以使得该位置多少个小朋友开心。

这个预处理很重要,也不是很好想,它的重要度堪比状态转移。

然后,考虑f[i][j]表示i位置状态为s时的最多小朋友开心数。

我们首先枚举对于1的前四个(对于n的后四个),然后之后根据f[i-1]一直搞dp,决策往上第5个(不会对目前状态影响)移不移。

则f[i][j]可以由第i-1个围栏移走和不移走两种状态转移得来:

至于方程的话,建议大家自己推一推,推完后再看我的方程。

据某位dalao说,这么写的时间复杂度O(2的10次方×n)

为大家呈现一下方程:f[i][j]=MAX(f[i-1][(j&15)<<1],f[i-1][(j&15)<<1|1])+love[i][j];(就知道你没自己推)

s&15是什么意思呢?

它的意思是找的对于现在状态的后四个对于上一个状态的前四个,为什么是15自己算一下15的二进制就知道了。

最后ans在f[n][S<<1|1]和f[n][S<<1]里面找大的,这道题就差不多了。

代码:

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,c,ans;
int love[][],f[][];
int MAX(int a,int b){return a>b?a:b;}
int main()
{
scanf("%d%d",&n,&c);
for(int i=;i<=c;i++)
{
int e,f,l;
scanf("%d%d%d",&e,&f,&l);
int like=,hate=;
for(int j=;j<=f;j++)
{
int x;
scanf("%d",&x);
x=(x-e+n)%n;
like|=(<<x);
}
for(int j=;j<=l;j++)
{
int y;
scanf("%d",&y);
y=(y-e+n)%n;
hate|=(<<y);
}
for(int j=;j<=;j++)
if((hate&j || ((^j)&like)))
love[e][j]++;
}
ans=;
for(int h=;h<;h++)
{
memset(f[],,sizeof(f[]));
f[][h<<]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=;j++)
{
f[i][j]=MAX(f[i-][(j&)<<],f[i-][(j&)<<|])+love[i][j];
}
}
ans=MAX(ans,MAX(f[n][h<<],f[n][h<<|]));
}
printf("%d",ans);
}

谢谢大家!

【[APIO/CTSC2007]动物园】状压DP的更多相关文章

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

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

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

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

  3. 状压dp学习笔记(紫例题集)

    P3451旅游景点 Tourist Attractions 这个代码其实不算是正规题解的(因为我蒟蒻)是在我们的hzoj上内存限制324MIB情况下过掉的,而且经过研究感觉不太能用滚动数组,所以那这个 ...

  4. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  5. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  6. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  7. [NOIP2016]愤怒的小鸟 D2 T3 状压DP

    [NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...

  8. 【BZOJ2073】[POI2004]PRZ 状压DP

    [BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...

  9. bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)

    数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...

随机推荐

  1. 【原创】官方文档-hive 启动命令

    [一起学Hive]之十六-Hive的WEB页面接口-HWI Apache Hive 管网 hive metrics hive常用命令整理 Hive学习之HiveServer2服务端配置与启动 启动hi ...

  2. html5移动开发的几大特性

    html5移动开发的出现让移动平台的竞争由系统平台转向了浏览器之间:移动端的IE.Chrome.FireFox.Safari,亦或是新出现的浏览器,谁能达到在移动端对HTML5更好的支持,谁就能在以后 ...

  3. hibernate缓存机制详细介绍

    hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别). 一:hibernate的 N+1问题 list()获得对象: 如果通过list()方法 ...

  4. 不同浏览器对于html5 audio标签和音频格式的兼容性

    音频格式 Chrome Firefox IE9 Opera Safari OGG 支持 支持 支持 支持 不支持 MP3 支持 不支持 支持 不支持 支持 WAV 不支持 支持 不支持 支持 不支持 ...

  5. Delphi IOS 上架

    http://docwiki.embarcadero.com/RADStudio/Seattle/en/IOS_Mobile_Application_Development http://docwik ...

  6. pl/sql Command Window

    由于工作需要,最近需要执行sql脚本,之前一直在用执行按钮操作,但最近公司制定了一套标准,其中就有执行sql脚本规范: 以前执行存存储过程: 现在修改存储过程如下: 第一步,打开对应窗口: 第二步,输 ...

  7. .Net Core 迁移之坑一 《WebAPI Get请求参数传入输入带有[]不识别问题》

    在Framwork 体系下 WebAPI项目 会有很多默认特性,例如:Get查询竟然支持三种数组查询方式 1.https://localhost:44390/api/values?status=1&a ...

  8. IE bug之location.href没有referer

    使用js实现跳转一般会用 location.href="www.google.com"; 这样在一般的浏览器中可以在服务器端正常的获取referer,但是如果是IE浏览器就不正常了 ...

  9. arm上sd卡热插拔问题的解决:

    首先,保证sd卡驱动是完好,但是sd卡却无法热插拔或者无法识别. 刚开始我的板子上,sd是能够读取的,但是却不支持热插拔,看了几天sd驱动,找到了问题的原因,是驱动中硬件引脚相关设置的问题,具体根绝个 ...

  10. 2-3 JAVA内存模型