洛谷P3622 动物园
题意:给定一个n个元素的圈,m个条件。满足一个条件需要选某些元素或不选另一些元素。
问最多能满足多少条件。每个条件所关联的元素,最远的两个距离不会超过5。
解:想了半天......
首先能想到断环成链DP。
然后某个时刻灵光一闪,突然发现可以状压最近的5个位置......这样枚举开始位置做32次DP就行了!
实现的时候发现只要枚举16种开始情况,状压4个位置...
转移就是考虑下一个位置选/不选。
注意细节......为什么有人20行A题,我写了160行呀...
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm> const int N = ; struct Node {
int p, fear, like;
int a[]; // 0 none 1 fear 2 like
}node[ * N]; int f[N][], n;
std::vector<int> v[N]; inline void exmax(int &a, int b) {
a < b ? a = b : ;
return;
} inline void out(int x, int tag) {
printf(" ");
for(int i = ; i < tag; i++) {
printf("%d", (x >> i) & );
}
printf(" ");
return;
} inline int check(Node x, int s) {
for(int i = ; i < ; i++) {
if(x.a[i] == && ((s >> i) & )) {
return ;
}
if(x.a[i] == && (((s >> i) & ) == )) {
return ;
}
}
return ;
} int main() { int m;
scanf("%d%d", &n, &m);
for(int i = , x; i <= m; i++) {
scanf("%d%d%d", &node[i].p, &node[i].fear, &node[i].like);
node[i].p += ;
while(node[i].p > n) {
node[i].p -= n;
}
for(int j = ; j <= node[i].fear; j++) {
scanf("%d", &x);
for(int k = , now = node[i].p + ; k >= ; k--) {
now--;
if(!now) {
now = n;
}
if(now == x) {
node[i].a[k] = ;
break;
}
}
}
for(int j = ; j <= node[i].like; j++) {
scanf("%d", &x);
for(int k = , now = node[i].p + ; k >= ; k--) {
now--;
if(!now) {
now = n;
}
if(now == x) {
node[i].a[k] = ;
break;
}
}
}
v[node[i].p].push_back(i);
}
/// input
int ans = ;
/// -----
///
for(int op = ; op < ; op++) { /// first four
memset(f, , sizeof(f));
for(int s = ; s < ; s++) {
if(s != op) {
f[][s] = -;
}
} for(int i = ; i < n; i++) {
for(int s = ; s < ; s++) {
if(f[i][s] == -) {
continue;
}
/// f[i][s] -> f[i + 1][t] int t = s >> , temp = f[i][s]; /// put 0 don't move
for(int j = ; j < v[i + ].size(); j++) {
/// node[v[i + 1][j]] and s
temp += check(node[v[i + ][j]], s);
}
exmax(f[i + ][t], temp);
// -------------------------------------
t = t | ( << ); /// put 1 move
temp = f[i][s];
for(int j = ; j < v[i + ].size(); j++) {
temp += check(node[v[i + ][j]], s | ( << ));
}
exmax(f[i + ][t], temp);
}
}
for(int s = ; s < ; s++) {
/// f[n][s]
int temp = f[n][s], now = s << ;
for(int i = ; i < ; i++) {
now = (now >> ) + (((op >> i) & ) << );
for(int j = ; j < v[i + ].size(); j++) {
temp += check(node[v[i + ][j]], now);
}
}
exmax(ans, temp);
}
}
printf("%d\n", ans);
return ;
}
AC代码
洛谷P3622 动物园的更多相关文章
- 洛谷[P3622] 动物园
状压DP 发现本题中,每个小朋友是否高兴仅取决于其后五个动物的情况,我们可以用状压DP解决本题 首先已处理 num[i][s] 表示对于位置 i ,状态为 s 时有多少在 s 的同学满意 转移方程很好 ...
- 洛谷 P2375 动物园
题目详情 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法 ...
- 题解 洛谷P3622/BZOJ1151【[APIO2007]动物园】
这一道题,我也是搞了很久才搞懂的(也就两个多小时). 感谢Rayment大佬的题解! 我们进入正题. 对于一个笼子里的动物,我们可以选择撤走或不撤走,可以用0和1来表示,很容易就想到二进制,想到状压d ...
- 洛谷 P3622 [APIO2007]动物园【状压dp】
看成网络流建图想了好久... 实际上5个是可以状压的 设f[i][k]为到第i个围栏状态为k的方案数,因为考虑到重复,设g[i][k]记录i开始,状态为k的孩子有几个 状态转移很好想:f[j][k]= ...
- 洛谷P2375 动物园
我要死了.这是我做过的最恶心的题之一. 天下第一的大毒瘤.有gay毒. 我不如熊猫好多年... 题意:给定字符串,求g[i],表示:[0, i]中满足该子串既是前缀又是后缀还不重叠的子串数. 解:题面 ...
- [洛谷P2375] [NOI2014]动物园
洛谷题目链接:[NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决 ...
- 【题解】洛谷P2375 [NOI2014] 动物园(KMP)
洛谷P2375:https://www.luogu.org/problemnew/show/P2375 思路 这道题可以说是完全刷新了本蒟蒻对KMP的理解 感觉对next数组的理解上升到一个新的高度 ...
- 洛谷2375 BZOJ 3670动物园题解
题目链接 洛谷链接 我们发现题目要我们求的num[i]东西本质上其实是 求有多少以i结尾的非前缀且能与前缀匹配的字符串,而且要求字符串长度小于(i/2) 我们先不考虑字符串长度的限制,看所有以i结尾的 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
随机推荐
- (理论篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝
为了快速构建项目,使用高性能框架是我的职责,但若不去深究底层的细节会让我失去对技术的热爱. 探究的过程是痛苦并激动的,痛苦在于完全理解甚至要十天半月甚至没有机会去应用,激动在于技术的相同性,新的框架不 ...
- jdbc操作根据bean类自动组装sql,天啦,我感觉我实现了hibernate
场景:需要将从ODPS数仓中计算得到的大额可疑交易信息导入到业务系统的mysql中供业务系统审核.最简单的方式是用阿里云的组件自动进行数据同步了.但是本系统是开放是为了产品化,要保证不同环境的可移植性 ...
- windows下docker启动.net core mvc随手记
docker基本命令: 查看当前的版本docker--version查看本地所有镜像:docker images查看当前正在运行的所有容器docker ps停止某个容器:docker stop 容器I ...
- LDAP-openldap服务部署和测试(YUM安装)
1. 概述2. 服务端部署过程2.1 软件包说明2.2 部署过程2.3 配置过程3. 测试4. 生成LDIF格式文件4.1 安装migrationtools工具4.2 用migrationtools生 ...
- CF 910 C. Minimum Sum
链接 [http://codeforces.com/group/1EzrFFyOc0/contest/910/problem/C] 题意 给你n个字符串,每个字符串的字符是a~j,每个字符都可以是0~ ...
- Java8之集合排序
1,List<Map<String,Object>>格式 //排序 Comparator<Map<String, Object>> comparator ...
- 第三次作业 (一)----------------------Visual Studio 2015的安装及单元测试
这是第三周的第一个作业,Visual Studio 2015的安装及单元测试. 我的电脑之前安装过Visual Studio 2015,但是在安装过程中我从来没有留意过各种注意事项,所集正好借此作业的 ...
- Linux内核分析第三周学习总结
Linux内核源码简介 arch/ 该目录中包含和硬件体系结构相关的代码,每种平台占一个相应的目录. 和32位PC相关的代码存放在x86目录下. 每种平台至少包含3个子目录:kernel(存放支持体系 ...
- eclipse中git的author和commiter的修改
项目目录,隐藏的文件.git的文件夹,config文件 eclipse-->右击项目--showin--system explorer.git 打开config文件加上 [user] name ...
- Practice3 阅读《构建之法》1-5章
第一章:概论 本章主要是讲了软件工程的基本概念,软件工程的最终目标是创造“足够好”的软件. 提出问题:什么是BUG?(出自1.2.5节) 答:就我个人而言,在许多游戏中也有许多的BUG,BUG这一词在 ...