BZOJ3003 差分+状压
来源:互联网 发布:凡科网站seo 编辑:程序博客网 时间:2024/06/15 05:53
给定一个长度为n的01序列以及L个整数
首先,这类选择一段区间操作的题可以把序列差分。于是我们把给出的末状态差分,然后考虑把每次操作也差分,于是每次操作就是选择两个位置差为
然后我们对所有的
接着考虑把所有的位置给状压,然后每次取两个数对。但是这样是
#include<bits/stdc++.h>#define inf ~0u>>2using namespace std;const int N=2e4+5;inline int read(){ int x=0;char ch=getchar(); while(ch<'0'||ch>'9'){ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x;}int T,n,k,l; int a[N],c[N],pos[N],f[N],g[(1<<22)];int cnt; queue<int>q;int main(){#ifdef Devil_Gary freopen("in.txt","r",stdin);#endif T=read(); while(T--){ cnt=0,n=read(),k=read(),l=read(); for(int i=1;i<=k;i++) a[i]=read(); sort(a+1,a+k+1); k=unique(a+1,a+k+1)-(a+1); a[0]=-1,a[k+1]=n+2; for(int i=1;i<=k;i++) { if(a[i]!=a[i-1]+1) pos[cnt++]=a[i]; if(a[i]!=a[i+1]-1) pos[cnt++]=a[i]+1; } sort(pos,pos+cnt); for(int i=1;i<=n;i++) f[i]=inf; for(int i=1;i<=l;i++) c[i]=read(); for(int i=1;i<=l;i++) f[c[i]]=1,q.push(c[i]); while(!q.empty()){ int o=q.front();q.pop(); for(int i=1;i<=l;i++){ if(o+c[i]<=n&&f[o+c[i]]==inf){ f[o+c[i]]=f[o]+1; q.push(o+c[i]); } if(o-c[i]>=1&&f[o-c[i]]==inf){ f[o-c[i]]=f[o]+1; q.push(o-c[i]); } } } for(int s=1,o;s<(1<<cnt);s++){ o=0,g[s]=inf; for(int i=0;i<cnt;i++) if(s&(1<<i)){ o=i;break; } for(int i=o+1;i<cnt;i++) if(s&(1<<i)) g[s]=min(g[s],g[s^(1<<i)^(1<<o)]+f[pos[i]-pos[o]]); } printf("%d\n",g[(1<<cnt)-1]==inf?-1:g[(1<<cnt)-1]); }}
阅读全文
0 0
- BZOJ3003 差分+状压
- 差分
- 差分
- 差分
- 差分阻抗-什么是差分?
- 【图-差分约束】 差分约束
- 分糖果 差分约束
- 差分约束系统
- 什么是差分信号?
- 差分信号详解
- 差分信号放大
- 关于差分信号
- 差分电路
- 差分信号
- 差分约束系统
- 差分曼彻斯特编码
- 差分约束系统
- 差分约束系统
- Pycharm远程访问ssh,远程访问服务器(xshell访问服务器)
- Linux的五个查找命令:find,locate,whereis,which,type
- 整理下这两天写一个支付通道的MockServer-20171103
- 2017.11.2工作日记
- 学习:C#连接数据库
- BZOJ3003 差分+状压
- 图像库
- Mac 取消 launchpad图标 上的下载季度条命令
- Docker Machine 创建 Azure 虚拟主机
- ZOJ 3224
- 给你不一样的引导页
- Qt Designer一打开就无法工作的解决办法
- Another app is currently holding the yum lock; waiting for it to exit..
- pom文件依赖依赖一直报错?不妨试试这个神器