广告

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

绿树智能 - 官方网站:https://wangping-lvshu.github.io/LvshuZhineng/

(现在使用,人人均可获得300元大奖)

[APIO2007] 动物园

题目描述

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

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

Alex

\texttt{Alex}

Alex 喜欢可爱的猴子和考拉,而害怕拥牙齿锋利的狮子。而

Polly

\texttt{Polly}

Polly 会因狮子有美丽的鬃毛而喜欢它,但害怕有臭味的考拉。你可以选择将一些动物从围栏中移走以使得小朋友不会害怕。但你不能移走所有的动物,否则小朋友们就没有动物可看了。每个小朋友站在大围栏圈的外面,可以看到连续的

5

5

5 个围栏。你得到了所有小朋友喜欢和害怕的动物信息。当下面两处情况之一发生时,小朋友就会高兴:

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

例如,考虑下图中的小朋友和动物:

  • 假如你将围栏

    4

    4

    4 和

    12

    12

    12 的动物移走。

    Alex

    \texttt{Alex}

    Alex 和

    Ka-Shu

    \texttt{Ka-Shu}

    Ka-Shu 将很高兴,因为至少有一个他们害怕的动物被移走了。这也会使

    Chaitanya

    \texttt{Chaitanya}

    Chaitanya 高兴,因为他喜欢的围栏

    6

    6

    6 和

    8

    8

    8 中的动物都保留了。但是,

    Polly

    \texttt{Polly}

    Polly 和

    Hwan

    \texttt{Hwan}

    Hwan 将不高兴,因为他们看不到任何他们喜欢的动物,而他们害怕的动物都还在。这种安排方式使得三个小朋友高兴。

  • 现在,换一种方法,如果你将围栏

    4

    4

    4 和

    6

    6

    6 中的动物移走,

    Alex

    \texttt{Alex}

    Alex 和

    Polly

    \texttt{Polly}

    Polly 将很高兴,因为他们害怕的动物被移走了。

    Chaitanya

    \texttt{Chaitanya}

    Chaitanya 也会高兴,虽然他喜欢的动物

    6

    6

    6 被移走了,他仍可以看到围栏

    8

    8

    8 里面他喜欢的动物。同样的 Hwan 也会因可以看到自己喜欢的动物

    12

    12

    12 而高兴。唯一不高兴的只有

    Ka-Shu

    \texttt{Ka-Shu}

    Ka-Shu。

  • 如果你只移走围栏

    13

    13

    13 中的动物,

    Ka-Shu

    \texttt{Ka-Shu}

    Ka-Shu 将高兴,因为有一个他害怕的动物被移走了,

    Alex

    \texttt{Alex}

    Alex,

    Polly

    \texttt{Polly}

    Polly,

    Chaitanya

    \texttt{Chaitanya}

    Chaitanya 和

    Hwan

    \texttt{Hwan}

    Hwan 也会高兴,因为他们都可以看到至少一个他们喜欢的动物。所以有

    5

    5

    5 个小朋友会高兴。这种方法使得了最多的小朋友高兴。

输入格式

输入的第一行包含两个整数

N

N

N,

C

C

C,用空格分隔。

N

N

N 是围栏数(

10

N

1

0

4

10 \le N \le 10^4

10≤N≤104),

C

C

C 是小朋友的个数(

1

C

5

×

1

0

4

1 \le C \le 5\times 10^4

1≤C≤5×104)。

围栏按照顺时针的方向编号为

1

,

2

,

3

,


,

N

1,2,3,\cdots,N

1,2,3,⋯,N。

接下来的

C

C

C 行,每行描述一个小朋友的信息,以下面的形式给出:

E

,

F

,

L

,

X

1

,

X

2

,


,

X

F

,

Y

1

,

Y

2

,


,

Y

L

E, F, L ,X_1, X_2 ,\cdots ,X_F ,Y_1 ,Y2 ,\cdots ,Y_L

E,F,L,X1​,X2​,⋯,XF​,Y1​,Y2,⋯,YL​。

其中:

E

E

E 表示这个小朋友可以看到的第一个围栏的编号(

1

E

N

1 \le E \le N

1≤E≤N),换句话说,该小朋友可以看到的围栏为

E

E

E,

E

+

1

E+1

E+1,

E

+

2

E+2

E+2,

E

+

3

E+3

E+3,

E

+

4

E+4

E+4。

注意,如果编号超过

N

N

N 将继续从

1

1

1 开始算。

如:当

N

=

14

N=14

N=14,

E

=

13

E=13

E=13 时,这个小朋友可以看到的围栏为

13

,

14

,

1

,

2

13,14,1, 2

13,14,1,2 和

3

3

3。

F

F

F 表示该小朋友害怕的动物数。

L

L

L 表示该小朋友喜欢的动物数。

围栏

X

1

,

X

2

,


,

X

F

X_1, X_2, \cdots, X_F

X1​,X2​,⋯,XF​ 中包含该小朋友害怕的动物。

围栏

Y

1

,

Y

2

,


,

Y

L

Y1, Y2, \cdots, Y_L

Y1,Y2,⋯,YL​ 中包含该小朋友喜欢的动物。

X

1

,

X

2

,


,

X

F

,

Y

1

,

Y

2

,


,

Y

L

X_1, X_2, \cdots, X_F, Y_1, Y_2, \cdots, Y_L

X1​,X2​,⋯,XF​,Y1​,Y2​,⋯,YL​ 是两两不同的整数,而且所表示的围栏都是该小朋友可以看到的。

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

E

E

E 对应的小朋友排在第一个,最大的

E

E

E 对应的小朋友排在最后一个)。

注意可能有多于一个小朋友对应的

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

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

说明/提示

数据范围
对于

100

%

100\%

100% 的数据,

10

N

1

0

4

10 \le N \le 10^4

10≤N≤104,

1

C

5

×

1

0

4

1 \le C \le 5\times 10^4

1≤C≤5×104,

1

E

N

1 \le E \le N

1≤E≤N。

样例说明

  • 第一个样例是题目描述中的例子,所有的

    C

    =

    5

    C=5

    C=5 个小朋友都能高兴。

  • 第二个样例是一个不能使得所有

    C

    =

    7

    C=7

    C=7 个小朋友都高兴的例子。

Code

#include <bits/stdc++.h>
using namespace std;
int n, m, ans, f[50001][40], num[50001][40]; int main()
{
cin >> n >> m;
for (int i = 1, j, E, F, L, t, sta1, sta2; i <= m; ++i)
{
for (cin >> E >> F >> L, j = 1, sta1 = sta2 = 0; j <= F; ++j)
cin >> t, t = (t - E + n) % n, sta1 |= 1 << t;
for (j = 1; j <= L; ++j)
cin >> t, t = (t - E + n) % n, sta2 |= 1 << t;
for (j = 0; j < 32; ++j)
if ((j & sta1) || (~j & sta2))
++num[E][j];
}
for (int i = 0; i < 32; ans = max(f[n][i], ans), ++i)
{
memset(f[0], -0x3f, sizeof(f[0])), f[0][i] = 0;
for (int j = 1; j <= n; ++j)
for (int k = 0; k < 32; ++k)
f[j][k] = max(f[j - 1][(k & 15) << 1], f[j - 1][(k & 15) << 1 | 1]) + num[j][k];
}
cout << ans;
return 0;
}

P3622 [APIO2007]【一本通提高状态压缩类动态规划】动物园的更多相关文章

  1. 【BZOJ2734】【HNOI2012】集合选数(状态压缩,动态规划)

    [BZOJ2734][HNOI2012]集合选数(状态压缩,动态规划) 题面 Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所 ...

  2. 【NOIP2017】宝藏(状态压缩,动态规划)

    [NOIP2017]宝藏(状态压缩,动态规划) 题面 洛谷 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路 ...

  3. 洛谷P2258 子矩阵 题解 状态压缩/枚举/动态规划

    作者:zifeiy 标签:状态压缩.枚举.动态规划 题目链接:https://www.luogu.org/problem/P2258 这道题目状态压缩是肯定的,我们需要用二进制来枚举状态. 江湖上有一 ...

  4. 插头DP(基于连通性状态压缩的动态规划问题)(让你从入门到绝望)

    今天,我,Monkey king 又为大家带来大(ju)佬(ruo)的算法啦!--插头DP 例题(菜OJ上的网址:http://caioj.cn/problem.php?id=1489): 那么,这道 ...

  5. HOJ-2662Pieces Assignment(状态压缩,动态规划)

    Pieces Assignment Source : zhouguyue Time limit : 1 sec Memory limit : 64 M Submitted : 415, Accepte ...

  6. 【NOI2001】炮兵阵地(状态压缩,动态规划)

    题面 题面中有图片的存在,所以就贴个地址把 题解 简单题,,,, 原来一直觉得不会做... 现在发现是一道傻逼题 暴力压两行的状态 发现就需要滚一维. 然后暴力检查一下状态的可行性 DP检查MAX就可 ...

  7. 【BZOJ1087】【SCOI2005】互不侵犯(状态压缩,动态规划)

    题面 这种傻逼题懒得粘贴了... 题解 傻逼题 \(f[i][j][k]\)表示当前第\(i\)列,当前放置状态为\(j\),已经放了\(k\)个 暴力判断状态合法性,暴力判断转移合法性,然后统计答案 ...

  8. HDU-4539郑厂长系列故事——排兵布阵(状态压缩,动态规划)

    郑厂长系列故事--排兵布阵 Time Limit : 10000/5000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total ...

  9. caioj1495: [视频]基于连通性状态压缩的 动态规划问题:Formula 2

    本来想写一天插头的,但是这题太难受(绝望)500+的代码量..我选择下午放松一下. 先ORZ一下苏大佬(yz的cdq啊%%%%%)居然把cdq论文里面的题抠出来出数据放在c站(呵呵真是个悲伤的故事不过 ...

随机推荐

  1. Linux服务器如何识别移动硬盘?

    序言 通常我们使用的移动硬盘或U盘一般都是ntfs或fat32的文件系统,常跟服务器打交道的小伙伴,会经常遇到把移动硬盘或U盘上的数据拷贝到Linux服务器上.绝大多数Linux发行版内核支持fat3 ...

  2. 前端面试 -Vue2系列

    vue 1为啥用Vue? 1MVVM 数据的双向绑定 2指令系统 不需要操作DOM 3组件化 2v-show和v-if.v-for v-show 通过 display:none 隐藏元素,DOM还在. ...

  3. AspNetCore7.0源码解读之UseMiddleware

    Use​Middleware​Extensions 前言 本文编写时源码参考github仓库主分支. aspnetcore提供了Use方法供开发者自定义中间件,该方法接收一个委托对象,该委托接收一个R ...

  4. 如何用好Nginx的gzip指令

    说一段废话 压缩响应数据有什么作用呢?问的好:从用户体验和IT成本两方面回答这个问题: 用户体验上 网速一定的情况下,传输10MB数据比传输5MB数据的时间快了一半.所以传输数据越小用户加载页面就越快 ...

  5. Linux的快捷使用(不断更新中)

    Linux 命令行提示符 ~代表当前目录,即家目录,#是超级用户提示符,如果是普通用户使用$ 基本快捷键的使用 移动光标命令 Ctrl+A:移动光标到开头 Ctrl+E:移动光标到结尾 Ctrl+F: ...

  6. 『现学现忘』Git基础 — 23、Git中的撤销操作

    目录 1.撤销操作说明 2.撤销工作区中文件的修改 3.撤销暂存区中文件的修改 4.总结 1.撤销操作说明 我们在使用Git版本管理时,往往需要撤销某些操作.比如说我们想将某个修改后的文件撤销到上一个 ...

  7. controller-tool的简单使用

    介绍 在上一篇code-generator简单介绍中重点介绍了如何使用code-generator来自动生成代码,通过自动生成的代码可以帮助我们像访问k8s内置资源那样来操作我们的CRD,其实就是帮助 ...

  8. 图解Dijkstra算法+代码实现

    简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的 ...

  9. 技术分享 | 云原生多模型 NoSQL 概述

    作者 朱建平,TEG/云架构平台部/块与表格存储中心副总监.08年加入腾讯后,承担过对象存储.键值存储,先后负责过KV存储-TSSD.对象存储-TFS等多个存储平台. NoSQL 技术和行业背景 No ...

  10. 安装Nmap到CentOS(YUM)

    Nmap是Linux下的网络扫描工具,我们可以扫描远端主机上那些端口在开放状态. 运行环境 系统版本:CentOS Linux release 7.3.1611 (Core) 软件版本:无 硬件要求: ...