bzoj3508: 开灯
题解
设\(b[i]=a[i]\ xor\ a[i+1]\)
我们可以发现,修改只会改变\(b[l-1]\)和\(b[r]\)
然后发现\(b[i]=1\)的点最多\(2*k\)个
状压\(dp\)
Code
void bfs(int s) {
memset(vis, 0, sizeof(vis));
vis[s] = 1; q.push(make_pair(s, 0));
while (!q.empty()) {
int u = q.front().first, d = q.front().second; q.pop();
if (b[u]) g[num[s]][num[u]] = d;
for (int i = 1; i <= l; i++) {
if (u + a[i] <= n && !vis[u + a[i]])
vis[u + a[i]] = 1, q.push(make_pair(u + a[i], d + 1));
if (u - a[i] >= 0 && !vis[u - a[i]])
vis[u - a[i]] = 1, q.push(make_pair(u - a[i], d + 1));
}
}
}
void solve() {
n = gi<int>(), k = gi<int>(), l = gi<int>();
memset(b, 0, sizeof(b)); tot = 0;
for (int i = 1; i <= k; i++) b[gi<int>()] = 1;
for (int i = 0; i <= n; i++)
if (b[i] ^= b[i + 1])
num[i] = tot++;
for (int i = 1; i <= l; i++) a[i] = gi<int>();
int lim = 1 << tot;
memset(g, 0x3f, sizeof(g));
memset(f, 0x3f, sizeof(f));
for (int i = 0; i <= n; i++)
if (b[i]) bfs(i);
f[0] = 0;
for (int i = 1, p; i < lim; i++) {
p = 0; while (!(i & 1 << p)) p++;
for (int j = p + 1; j < tot; j++)
if (i & 1 << j)
f[i] = min(f[i], f[i ^ 1 << p ^ 1 << j] + g[j][p]);
}
printf("%d\n", f[lim - 1] > inf ? -1 : f[lim - 1]);
return ;
}
bzoj3508: 开灯的更多相关文章
- BZOJ3508 开灯 & [校内NOIP2018模拟20181027] 密码锁
Time Limit: 10 Sec Memory Limit: 128 MB Description xx作为信息学界的大神,拥有众多的粉丝.为了感谢众粉丝的爱戴,xx决定举办一场晚会.为了气派,x ...
- 【BZOJ3508】开灯
[BZOJ3508]开灯 题面 bzoj 题解 其实变为目标操作和从目标操作变回来没有区别,我们考虑从目标操作变回来. 区间整体翻转(\(\text{Xor}\;1\))有点难受,我们考虑将这个操作放 ...
- 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的倍数的房间 ...
随机推荐
- (五)lucene之特定项搜索和查询表达式
需求:模糊搜索. 前提: 本例中使用lucene 5.3.0 package com.shyroke.lucene; import java.io.File; import java.io.File ...
- 转:让PIP源使用国内镜像,提升下载速度和安装成功率
转载,自己记录使用,原文http://www.cnblogs.com/microman/p/6107879.html 对于Python开发用户来讲,PIP安装软件包是家常便饭.但国外的源下载速度实在太 ...
- 表空间 oracle
--create table create table table_name ( column1 varchar2(20) not null, column2 number(8) not null, ...
- Django 之一些request封装的常用功能
一些常用的request对象属性 介绍 HTTP 应用的信息是通过 请求报文 和 响应报文 传递的,关于更多的相关知识,可以阅读<HTTP权威指南>获得. 其中 请求报文 由客户端发送,其 ...
- UDP及操作系统理论
UDP介绍 udp协议又称用户数据报协议 在OSI七层模型中,它于TCP共同存在于传输层 仅用于不要求可靠性,不要求分组顺序且数据较小的简单传输,力求速度 UDP结合socket用法 1.创建sock ...
- CSS图片Img等比例缩放且居中显示
常用来做图片放大显示的遮罩层imgScale HTML <div id="imgScale" > <img src=""> </d ...
- vue的$nextTick使用后的js代码执行顺序问题
一.问题产生背景: 父组件已经获得子组件实例,并能直接触发子组件的方法,在父组件中调用了子组件的两个方法 // 父组件调用子组件,this.picker是获取的子组件整个实例,先调用update,再调 ...
- Error:Unable to start the daemon process. This problem might be caused by incorrect configuration of
我试了修改或者配置gradle文件没有成功解决的 ,所以试了这个解决方案 试了下这个是可以解决的. 变量名 _JAVA_OPTIONS 变量值 -Djava.net.preferIPv4Sta ...
- MySQL脏读、虚读、幻读
事务的特性: 原子性:指处于同一个事务中的多条语句是不可分割的. 一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态.比如转账,转账前两个账户余额之和为2k,转账之后也应该是2K. 隔离 ...
- 《数据结构与算法之美》 <06>栈:如何实现浏览器的前进和后退功能?
浏览器的前进.后退功能,我想你肯定很熟悉吧? 当你依次访问完一串页面 a-b-c 之后,点击浏览器的后退按钮,就可以查看之前浏览过的页面 b 和 a.当你后退到页面 a,点击前进按钮,就可以重新查看页 ...