广告

绿树公司 - 官方网站: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. 【Docker入门】Docker的常用命令

    ​ ​ 了解和安装完docker之后,我们学习一下docker的常用命令就和当初学linux命令一样,放心命令其实大致相同只不过细节不同. 一.Docker启动类命令 1.启动docker:syste ...

  2. python写一个能变身电光耗子的贪吃蛇

    python写一个不同的贪吃蛇 写这篇文章是因为最近课太多,没有精力去挖洞,记录一下学习中的收获,python那么好玩就写一个大一没有完成的贪吃蛇(主要还是跟课程有关o(╥﹏╥)o,课太多好烦) 第一 ...

  3. Android开发的开始

    Android 软件 手机软件哦,目前只有一层外壳,进一步功能等待开发. 下载地址

  4. logging日志模块详细,日志模块的配置字典,第三方模块的下载与使用

    logging日志模块详细 简介 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么 了,但是当我需要看大量的地方或者在一个文件中查看的时 ...

  5. 【雅礼集训 2017 Day2】棋盘游戏

    loj 6033 description 给一个\(n*m\)的棋盘,'.'为可通行,'#'为障碍.Alice选择一个起始点,Bob先手从该点往四个方向走一步,Alice再走,不能走走过的点,谁不能动 ...

  6. [KDTree]数列

    NKOJ传送门 describtion 给你一个序列,每个序列有编号(它本身的位置),标识符,数值. 有4种操作 op=0:l,r,x,y将编号在[l,r]的数值x+y op=1:l,r,x,y将标识 ...

  7. Dubbo本地存根是什么,Dubbo本地伪装又是什么?

    真正的大师永远怀着一颗学徒的心 哈喽!大家好,我是小奇,一位程序员界的学徒 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 前言 书接上回,昨天打了 ...

  8. 【ASP.NET Core】配置应用程序地址的N多种方法

    下面又到了老周误人子弟的时间,今天要误大伙的话题是:找找有多少种方法可以设置 ASP.NET Core 应用的地址,即 URL. 精彩马上开始! 1.UseUrls 方法 这是一个扩展方法,参数是可变 ...

  9. c++ 树状数组

    关于树状数组 树状数组,即 Binary Indexed Tree ,主要用于维护查询前缀和 属于 log 型数据结构 和线段树比较 都是 log 级别 树状数组常数.耗费的空间.代码量都比线段树小 ...

  10. c++ 超长整数加法 高精度加法

    c++ 超长整数加法 高精度加法 实现思路 不能直接使用加法,因为int和long long都已超出最大数据表示范围 数据读入采用string类型,读入后将数据的每一位存储到vector中 vecto ...