【BZOJ3508】开灯
【BZOJ3508】开灯
题面
题解
其实变为目标操作和从目标操作变回来没有区别,我们考虑从目标操作变回来。
区间整体翻转(\(\text{Xor}\;1\))有点难受,我们考虑将这个操作放在差分数组上,也就是说令\(a\)为原数组,\(c\)为差分数组,\(c_i=a_{i-1}\text{Xor}\;a_i\)。
那么我们就相当于让差分数组上的数全变为\(0\),而一次操作就相当于让一对\(1\)消掉或一对\(0,1\)位置互换。
而两个\(1\)在其他位置消掉和在某个\(1\)的位置消掉是没有区别的,多个\(1\)也一样,所以我们可以直接\(bfs\)预处理每对点消掉的贡献。
而差分数组最多\(2K\)个\(1\),状压每个点有没有被消掉即可。
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (ch != '-' && (ch > '9' || ch < '0')) ch = getchar();
if (ch == '-') w = -1 , ch = getchar();
while (ch >= '0' && ch <= '9') data = data * 10 + (ch ^ 48), ch = getchar();
return w * data;
}
const int INF = 0x3f3f3f3f;
const int MAX_N = 40005, MAX_M = 105;
int N, K, M;
int b[MAX_M];
bool used[MAX_N], g[MAX_N];
int st[30], tp;
int cost[30][30], dep[MAX_N];
queue<int> que;
void bfs(int s, int *dis) {
memset(dep, 0, sizeof(dep));
dep[s] = 1;
que.push(s);
while (!que.empty()) {
int x = que.front(); que.pop();
for (int i = 1; i <= M; i++) {
if (x + b[i] <= N && !dep[x + b[i]]) dep[x + b[i]] = dep[x] + 1, que.push(x + b[i]);
if (x - b[i] >= 1 && !dep[x - b[i]]) dep[x - b[i]] = dep[x] + 1, que.push(x - b[i]);
}
}
for (int i = 0; i < tp; i++) dis[i] = dep[st[i]] - 1;
}
int f[1 << 20];
int main () {
#ifndef ONLINE_JUDGE
freopen("cpp.in", "r", stdin);
#endif
int Q = gi();
while (Q--) {
memset(used, 0, sizeof(used)); tp = 0;
N = gi() + 1, K = gi(), M = gi();
for (int i = 1; i <= K; i++) used[gi()] = 1;
for (int i = 1; i <= M; i++) b[i] = gi();
for (int i = 1; i <= N; i++) g[i] = used[i] ^ used[i - 1];
for (int i = 1; i <= N; i++) if (g[i]) st[tp++] = i;
for (int i = 0; i < tp; i++) bfs(st[i], cost[i]);
memset(f, 0x3f, sizeof(f));
f[0] = 0;
for (int S = 0; S < (1 << tp) - 1; S++) {
for (int i = 0; i < tp; i++) {
if (S >> i & 1) continue;
for (int x = i + 1; x < tp; x++) {
if ((S >> x & 1) == 0 && (cost[i][x] != -1)) {
int tmp = (S | (1 << i) | (1 << x));
f[tmp] = min(f[tmp], f[S] + cost[i][x]);
}
}
break;
}
}
printf("%d\n", f[(1 << tp) - 1] == INF ? -1 : f[(1 << tp) - 1]);
}
return 0;
}
【BZOJ3508】开灯的更多相关文章
- BZOJ3508 开灯 & [校内NOIP2018模拟20181027] 密码锁
Time Limit: 10 Sec Memory Limit: 128 MB Description xx作为信息学界的大神,拥有众多的粉丝.为了感谢众粉丝的爱戴,xx决定举办一场晚会.为了气派,x ...
- bzoj3508: 开灯
题目链接 题解 设\(b[i]=a[i]\ xor\ a[i+1]\) 我们可以发现,修改只会改变\(b[l-1]\)和\(b[r]\) 然后发现\(b[i]=1\)的点最多\(2*k\)个 状压\( ...
- c语言实现开灯问题
开灯问题: 有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依 ...
- Jquery开灯关灯效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 9509 开灯(dfs)
9509 开灯 时间限制:1000MS 内存限制:65535K提交次数:0 通过次数:0 题型: 编程题 语言: G++;GCC Description 有16的开关分别控制16盏灯,开关排列成 ...
- NYOJ 题目77 开灯问题(简单模拟)
开灯问题 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 ...
- 洛谷 P1876 开灯(思维,枚举,规律题)
P1876 开灯 题目背景 该题的题目是不是感到很眼熟呢? 事实上,如果你懂的方法,该题的代码简直不能再短. 但是如果你不懂得呢?那...(自己去想) 题目描述 首先所有的灯都是关的(注意是关!),编 ...
- 【Luogu1876】开灯(数论)
[Luogu1876]开灯(数论) 题面 题目描述 首先所有的灯都是关的(注意是关!),编号为1的人走过来,把是一的倍数的灯全部打开,编号为二的的把是二的倍数的灯全部关上,编号为3的人又把是三的倍数的 ...
- POJ 1218 THE DRUNK JAILER(类开灯问题,完全平方数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2188 题目大意:n为5-100之间的一个数,代表有多少间牢房,刚开始所有房间打开,第一轮2的倍数的房间 ...
随机推荐
- 027 奥展项目涉及的javascipt知识点笔记
1.获取指定div标签内的所有input标签 let inputs = document.getElementById("inspect-part1").getElementsBy ...
- vue router 常用操作
1. 普通路由 const routes = [ { path: '/index', component: index } ] 2. 重定向 redirect const routes = [ { ...
- R数据挖掘 第二篇:基于距离评估数据的相似性和相异性
聚类分析根据对象之间的相异程度,把对象分成多个簇,簇是数据对象的集合,聚类分析使得同一个簇中的对象相似,而与其他簇中的对象相异.相似性和相异性(dissimilarity)是根据数据对象的属性值评估的 ...
- mac下搭建Apache服务器环境
mac下自带了一个Apache服务环境,所以不需要另外去下载,直接配置就好了. 一.启动Apache服务 在终端下输入 sudo apachectl start , 启动Apache服务.在浏览器输入 ...
- 来看一下Java中“-”与equeals的区别
简介: == ==是比较两个变量的值,如果是基本数据类型,那么就是比较的基本数据的大小值 情况一 int a=1; int b=1; System.out.println(a==b); 以上图中:== ...
- WIN10 报错 "此共享需要过时的SMB1协议,而此协议是不安全"的解决方法
发现新安装的win10能看到其他计算机,但不能共享其他计算的共享文件/夹,出现如下情况:在浏览器里输入:\IP 不能访问到计算机的共享文件夹,或者在桌面上新建一个指向到其他计算机共享文件/夹的快捷方式 ...
- tcp / udp 协议及其实现的socket
一.tcp协议 1.1 基本知识 特点: 可靠,慢,全双工通信 建立连接时:三次握手 断开连接时:四次挥手 在建立起连接之后 发送的每一条信息都有回执 为了保证数据的完整性,还有重传机制 长连接:会一 ...
- vue自带开发环境,生产环境,自己搭建测试环境
git 码云地址: https://gitee.com/qichangshui_admin/vueAddTest 参考地址: https://www.jianshu.com/p/bfcfe5fc253 ...
- Flex,Flash,AS3,AIR的关系和区别
转自:http://www.admin10000.com/document/156.html 本文详细介绍了 Flash.Flex.AS3.AIR 的关系和区别.希望对初学者有帮助. AS3 Acti ...
- 如何提高你的移动开发中AS3/AIR性能
Shawn Blais 让我了解到如何在移动平台上对AS3代码进行优化.他的博客(http://esdot.ca/site/category/blog)只有十来篇文章,但都是些很意思的信息,尤其适合我 ...