【BZOJ3003】LED

Description

LED屏是由一个庞大的点阵小灯泡组成的,一开始每个小灯泡都不发光。每一行一共有N个小灯泡,依次标号为1~n。现在给定K个点,要求这K个点发光,其余点必须保持熄灭状态。而这块LED屏的操作方式各种奇葩,一共有L种操作方法,第i种表示你能将任意长度恰为A_i的连续一段灯泡的状态取反(灭变亮,亮变灭)。
已知LED屏一共有m行,为了节省时间,请你算出每一行达到目标状态所需的最少操作次数。

Input

    输入文件第一行一个数m,表示LED屏的行数。
    对于LED屏的每一行:
    第一行为n,k,l,意义见上。
    第二行为k个数,表示要求发光的k个点。
    第三行为l个数,表示l种操作方式。

Output

    对于LED屏的每一行:如果无法达到目标状态,输出-1,否则输出最少次数。

Sample Input

2
10 8 2
1 2 3 5 6 7 8 9
3 5
3 2 1
1 2
3

Sample Output

2
-1
【数据规模】
对于100%的数据,T≤10,N≤10000,K≤10,L≤100,1≤A_i≤N。

题解:一开始想网络流想了半天。。。结果是错的。

第一步很常用也很关键,我们将原序列差分,然后就变成了只有2k个关键点需要染黑,而每个操作可以看成是将两个距离为L的格子同时反色。这个过程比较类似于一个最短路的过程,我们将一个关键点染色,此时出现了一个多余的点,我们再将多余点不断反色直到走到了另一个关键点,此时我们可以看做这两个关键点成功配对,而代价就是从这个点走到另一个点的最短路。所以我们先预处理出任意两个关键点之间的最短路,然后DP。

设f[S]表示已经配对的点的状态为S的最小代价。转移时,我只需要们枚举S中最后那个点和谁配对即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int n,m,K,L;
bool vis[10010];
int op[30],w[30],v[110],dis[10010],f[30][30],g[1<<20],Log[1<<20];
queue<int> q;
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
inline void work()
{
n=rd(),K=rd(),L=rd(),m=0;
memset(f,0x3f,sizeof(f)),memset(g,0x3f,sizeof(g));
int i,j,a,u;
for(i=1;i<=K;i++)
{
op[i]=rd();
for(j=1;j<i;j++) if(op[j]==op[i]) break;
if(j==i) vis[op[i]]^=1,vis[op[i]+1]^=1;
}
for(i=1;i<=n+1;i++) if(vis[i]) w[m++]=i,vis[i]=0;
for(i=1;i<=L;i++) v[i]=rd();
sort(w,w+m);
for(i=0;i<m;i++) Log[1<<i]=i;
for(i=0;i<m;i++)
{
memset(dis,0x3f,sizeof(dis));
q.push(w[i]),dis[w[i]]=0;
while(!q.empty())
{
u=q.front(),q.pop();
for(j=1;j<=L;j++)
{
if(u+v[j]<=n+1&&dis[u+v[j]]==0x3f3f3f3f) dis[u+v[j]]=dis[u]+1,q.push(u+v[j]);
if(u-v[j]>=1&&dis[u-v[j]]==0x3f3f3f3f) dis[u-v[j]]=dis[u]+1,q.push(u-v[j]);
}
}
for(j=0;j<m;j++) if(i!=j) f[i][j]=dis[w[j]];
}
g[0]=0;
for(i=1;i<(1<<m);i++)
{
a=Log[i&-i];
for(j=a+1;j<m;j++) if((i>>j)&1) g[i]=min(g[i],g[i^(1<<j)^(1<<a)]+f[j][a]);
}
printf("%d\n",(g[(1<<m)-1]==0x3f3f3f3f)?-1:g[(1<<m)-1]);
}
int main()
{
int T=rd();
while(T--) work();
return 0;
}//2 10 8 2 1 2 3 5 6 7 8 9 3 5 3 2 1 1 2 3
//1 10 3 2 1 1 10 10 8

【BZOJ3003】LED BFS+状压DP的更多相关文章

  1. #12【BZOJ3003】LED BFS+状压DP

    题解: 看到区间修改先想一下差分 这题用差分是为了分析问题 现在的问题就变成了 原序列全为0,要使得特定的k个点变为1,每个操作改变x,y+1 然后我们会发现 对于二元组a,b我们要修改它,实际上是在 ...

  2. hdu 4856 Tunnels (bfs + 状压dp)

    题目链接 The input contains mutiple testcases. Please process till EOF.For each testcase, the first line ...

  3. HDU-4856 Tunnels (BFS+状压DP)

    Problem Description Bob is travelling in Xi’an. He finds many secret tunnels beneath the city. In hi ...

  4. 孤岛营救问题(BFS+状压DP)

    孤岛营救问题 https://www.luogu.org/problemnew/show/P4011 用状压DP标记拿到钥匙的数量 #include<iostream> #include& ...

  5. QDUOJ 来自xjy的签到题(bfs+状压dp)

    来自xjy的签到题   Description 爱丽丝冒险来到了红皇后一个n*n大小的花园,每个格子由'.'或'#'表示,'.'表示爱丽丝可以到达这个格子,‘#’表示爱丽丝不能到达这个格子,爱丽丝每1 ...

  6. HDU-3681-Prison Break(BFS+状压DP+二分)

    Problem Description Rompire is a robot kingdom and a lot of robots live there peacefully. But one da ...

  7. 【BZOJ 3049】【USACO2013 Jan】Island Travels BFS+状压DP

    这是今天下午的互测题,只得了60多分 分析一下错因: $dis[i][j]$只记录了相邻的两个岛屿之间的距离,我一开始以为可以,后来$charge$提醒我有可能会出现来回走的情况,而状压转移就一次,无 ...

  8. CodeForces 907E Party(bfs+状压DP)

    Arseny likes to organize parties and invite people to it. However, not only friends come to his part ...

  9. HDU 3247 Resource Archiver (AC自动机+BFS+状压DP)

    题意:给定 n 个文本串,m个病毒串,文本串重叠部分可以合并,但合并后不能含有病毒串,问所有文本串合并后最短多长. 析:先把所有的文本串和病毒都插入到AC自动机上,不过标记不一样,可以给病毒标记-1, ...

随机推荐

  1. 添加信任站点和允许ActiveX批处理

    有两种写法 1.如果是用IP reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMa ...

  2. GPU硬件加速原理 /转

    现代浏览器大都可以利用GPU来加速页面渲染.每个人都痴迷于60桢每秒的顺滑动画.在GPU的众多特性之中,它可以存储一定数量的纹理(一个矩形的像素点集合)并且高效地操作这些纹理(比如进行特定的移动.缩放 ...

  3. iOS错误整理--自定义按钮,给按钮内部赋值出现的错误

    一.练习中为了实现自定义按钮,按钮中的imageView和titleLabel默认是左右排列的.在练习中自定义为上下排列. *在以下方法中重新布局按钮中的子控件 - (void)layoutSubvi ...

  4. jQuery实现布局高宽自适应

    在页面布局(layout)时经常是上左右的框架布局并且需要宽.高度的自适应,div+css是无法实现(*hegz:div+css其实是可以实现的,利用jQuery比较容易实现浏览器的兼容性),所以需要 ...

  5. 【F12】修改 DevTools的主题

    1.点击setting

  6. 【转】WCF入门教程三[WCF的宿主]

    一.WCF服务应用程序与WCF服务库 我们在平时开发的过程中常用的项目类型有“WCF 服务应用程序”和“WCF服务库”. WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类契约的定 ...

  7. 使用什么工具连接MySQL Server

    字符界面:命令行终端(需MySQL Client) GUI界面:Navicat.MySQL Workbench 开发语言:使用相应语言的MySQL数据库驱动包或模块连接MySQL 我一般用的是命令行, ...

  8. 属性编辑器,即PropertyEditor-->Spring IoC

    在Spring配置文件里,我们往往通过字面值为Bean各种类型的属性提供设置值:不管是double类型还是int类型,在配置文件中都对应字符串类型的字面值.BeanWrapper填充Bean属性时如何 ...

  9. SVN中Revert changes from this revision 跟Revert to this revision

    譬如有个文件,有十个版本,假定版本号是1,2,3,4,5,6,7,8,9,10. Revert to this revision: 如果是在版本6这里点击“Revert to this revisio ...

  10. 【matlab】运动目标检测之"背景差分算法“

    clear; clc; i1=imread('D:\Work\1.png'); i2=imread('D:\Work\2.png'); i1=rgb2gray(i1); i2=rgb2gray(i2) ...