题解:

看到区间修改先想一下差分

这题用差分是为了分析问题

现在的问题就变成了

原序列全为0,要使得特定的k个点变为1,每个操作改变x,y+1

然后我们会发现

对于二元组a,b我们要修改它,实际上是在找连续的区间相连,所以实质上是最短路

为什么要差分了才能这么做呢

因为原来的区间修改可能中间涉及了有效点而变得复杂

现在每次有效操作不会影响到中间的有效点

接下来状压dp这是显然的

对于每一个状态,枚举二元组(确定其中一个值,枚举另一个值)

这是因为被确定的这个值一定是其中一个二元组

在做这个之前,还需要证明的是三元组,4元组。。。是无效的

首先奇数是不可能的

看一下四元组,一定是可以拆分成两个无关的二元组

非常的智障的是我写最短路的时候只往一边走。。 应该要往两边扩展

#include <bits/stdc++.h>
using namespace std;
int T,n,m,k;
int len[],s[];
#define rg register
#define IL inline
#define N 10100
#define N2 1100000
#define INF 1e9
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
char ss[<<],*A=ss,*B=ss;
inline char gc(){return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;}
template<class T>void read(T&x){
rg int f=,c;while(c=gc(),c<||<c)if(c=='-')f=-;x=c^;
while(c=gc(),<c&&c<)x=(x<<)+(x<<)+(c^);x*=f;
}
bool ff[N],f[N];
queue<int> q;
int dis[][N],dp[N2];
int main()
{
freopen("noi.in","r",stdin);
freopen("noi.out","w",stdout);
std::ios::sync_with_stdio(false);
read(T);
for (rg int TT=;TT<=T;TT++)
{
memset(ff,,sizeof(ff));
int kk=;
read(n); read(m); read(k);
rg int x,y;
for (rg int i=;i<=m;i++)
read(x),ff[x]^=,ff[x+]^=;
for (rg int i=;i<=n+;i++)
if (ff[i]) s[++kk]=i;
for (rg int i=;i<=kk;i++)
for (rg int j=;j<=n+;j++)
dis[i][j]=INF;
for (rg int i=;i<=k;i++) read(len[i]);
for (rg int i=;i<N2;i++) dp[i]=INF;
for (rg int i=;i<=kk;i++)
{
memset(f,,sizeof(f));
q.push(s[i]); dis[i][s[i]]=;
while (!q.empty())
{
rg int x=q.front(); q.pop();
for (rg int j=;j<=k;j++)
if (x-len[j]>&&f[x-len[j]])
{
dis[i][x-len[j]]=dis[i][x]+;
f[x-len[j]]=;
q.push(x-len[j]);
}
for (rg int j=;j<=k;j++)
if (x+len[j]<=n+&&f[x+len[j]])
{
dis[i][x+len[j]]=dis[i][x]+;
f[x+len[j]]=;
q.push(x+len[j]);
}
}
}
/* for (int i=1;i<=kk;i++)
{
cout<<endl<<endl;
for (int j=1;j<=n;j++)
cout<<dis[i][j]<<" ";
} */
for (rg int i=;i<=kk;i++)
for (rg int j=;j<i;j++)
{
int x=(<<(i-))|(<<(j-));
dp[x]=dis[i][s[j]];
}
for (rg int i=;i<=(<<kk)-;i++)
{
rg int x;
for (rg int j=;j<kk;j++)
if ((i>>j)&)
{
x=j+; break;
}
for (rg int j=;j<kk;j++)
if ((i>>j)&&&j+!=x)
{
y=(<<j)|(<<(x-));
dp[i]=min(dp[i],dp[y]+dp[i^y]);
}
}
/* for (rg int i=1;i<=(1<<kk)-1;i++)
for (rg int j=i;j;j=i&(j-1))
{
for
dp[i]=min(dp[i],dp[j]+dp[i^j]);
} */
dp[(<<kk)-]==INF?cout<<-<<endl:cout<<dp[(<<kk)-]<<endl;
}
return ;
}

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

  1. 【BZOJ3003】LED BFS+状压DP

    [BZOJ3003]LED Description LED屏是由一个庞大的点阵小灯泡组成的,一开始每个小灯泡都不发光.每一行一共有N个小灯泡,依次标号为1~n.现在给定K个点,要求这K个点发光,其余点 ...

  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. Python分析网页中的<a>标签

    soup = BeautifulSoup(html,"html.parser") html=soup.select("table a") for k in ht ...

  2. html 替换元素

    参考博客:http://www.cnblogs.com/wkylin/archive/2011/05/12/2044328.html 可替换元素也是行内元素 替换元素是浏览器根据其标签的元素与属性来判 ...

  3. Linux安装后首次设置root密码

    ① 1.sudo password root //给指定用户设置密码 2.sudo passwd root //给指定用户设置密码 ②su root //切换到指定用户

  4. register 用法注意与深入--【sky原创】

    register 用法注意与深入:   gcc -o test  test.c   这样编译的话会报错的,因为寄存器变量是不能取地址的,只有内存的变量才能取地址 寄存器变量取的是虚拟地址   #inc ...

  5. HTML学习笔记05-文本格式化

    HTML格式化标签 HTML使用标签<b>与<i>对输出的文本进行格式,如:粗体or斜体 这些HTML标签称为格式化标签 <!DOCTYPE HTML> <h ...

  6. centos6.5环境搭建openvp服务器及windows客户端搭建及配置详解

    1.环境搭建 说明: vpn client 192.168.8.16/24 openvpn server: eth0: 192.168.8.41 eth1: 172.16.1.10 app serve ...

  7. centos6.5下编译安装mariadb-10.0.20

    源码编译安装mariadb-10.0.20.tar.gz 一.安装cmake编译工具 跨平台编译器 # yum install -y gcc* # yum install -y cmake 解决依赖关 ...

  8. [Android四大组件之二]——Service

    Service是Android中四大组件之一,在Android开发中起到非常重要的作用,它运行在后台,不与用户进行交互. 1.Service的继承关系: java.lang.Object → andr ...

  9. 测试开发之前端——No6.HTML5中的键盘事件

    键盘事件 由键盘触发的事件. 适用于所有 HTML 5 元素: 属性 值 描述 onkeydown script 当按下按键时运行脚本 onkeypress script 当按下并松开按键时运行脚本 ...

  10. 【linux】16进制格式查看命令hexdump

    test.txt内容 asdfsg ewtwfsdf1Hello World! hexdump -Cv test.txt   输出 |asdfsg ewtwfsdf1| 6c 6c 6f 6f 6c ...