CF79D Password
题意:给定长度为n的0/1序列,初始值都为0。你每次可以在给定的l个长度中的\(a_i\)并将序列中长度为\(a_i\)的部分取反。使得最终状态为\(x_1\)~\(x_k\),求最少取反次数。
分析:看到这种区间整体变化的题,我们应该直觉想到差分(也可能想到线段树
先求出差分后的数组,然后每次操作相当于对距离为\(a_i\)的两点取反。
我们可以用类似求最短路的方法求出取反i,j位的最小操作次数。
因为最后为1的位置 \(\leq\) 10,所以操作的次数 \(\leq\) 20。
所以就可以大力状压了,方程见代码。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int dp[1<<20], num[1<<20], low[1<<20], f[10005], dis[10005], mn[22][22], len[105], cnt[22];
int n, k, l, tot=0;
queue<int> q;
inline int read()
{
int x=0,f=1; char ch=getchar();
for (; ch<'0' || ch>'9'; ch=getchar()) if (ch=='-') f=-1;
for (; ch>='0' && ch<='9'; ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
return x*f;
}
void Get_Shortest_Path(int rt)
{
memset(dis, 0x3f, sizeof(dis)); dis[cnt[rt]]=0;
q.push(cnt[rt]);
while (!q.empty())
{
int u=q.front(); q.pop();
for (int i=1; i<=l; i++)
{
if (u+len[i]<=n+1 && dis[u+len[i]]>dis[u]+1)
{dis[u+len[i]]=dis[u]+1; q.push(u+len[i]);}
if (u-len[i]>0 && dis[u-len[i]]>dis[u]+1)
{dis[u-len[i]]=dis[u]+1; q.push(u-len[i]);}
}
}
for (int i=1; i<=tot; i++) mn[rt][i]=dis[cnt[i]];
}
int main()
{
n=read(); k=read(); l=read();
for (int i=1; i<=k; i++) {int x=read(); f[x]=1;}
for (int i=1; i<=n+1; i++) if (f[i]^f[i-1]) cnt[++tot]=i;//差分
for (int i=1; i<=l; i++) len[i]=read();
for (int i=1; i<=tot; i++) Get_Shortest_Path(i);//预处理取反i,j位的最小操作次数
low[1]=0; for (int i=2; i<(1<<tot); i++) low[i]=low[i>>1]+1;//预处理log_2
for (int i=1; i<(1<<tot); i++) num[i]=num[i-(i&-i)]+1;//预处理二进制位数
memset(dp, 0x3f, sizeof(dp)); dp[0]=0;
for (int i=0; i<(1<<tot); i++)
{
if (num[i]&1) continue;
int j=((1<<tot)-1)^i; j=low[j&-j]+1;
for (int k=j+1; k<=tot; k++)
dp[i|(1<<(j-1))|(1<<(k-1))]=
min(dp[i|(1<<(j-1))|(1<<(k-1))],
dp[i]+mn[j][k]);
}//状压
printf("%d\n",dp[(1<<tot)-1]==inf?-1:dp[(1<<tot)-1]);
return 0;
}
CF79D Password的更多相关文章
- Luogu 3943 星空
原题是CF79D Password 很妙的题. 首先我们发现区间操作不太好弄,我们想办法把它转化成单点操作,这样子处理的办法会多一点. 方法当然是差分了. 定义差分数组$b_i = a_i \^ a_ ...
- 一句话题解&&总结
CF79D Password: 差分.两点取反,本质是匹配!最短路+状压DP 取反是套路,匹配是发现可以把操作进行目的化和阶段化,从而第二次转化问题. 且匹配不会影响别的位置答案 sequence 计 ...
- 打开程序总是会提示“Enter password to unlock your login keyring” ,如何成功关掉?
p { margin-bottom: 0.1in; line-height: 120% } 一.一开始我是按照网友所说的 : rm -f ~/.gnome2/keyrings/login.keyrin ...
- your password has expired.to log in you must change it
今天应用挂了,log提示密码过期.客户端连接不上. 打开mysql,执行sql语句提示密码过期 执行set password=new password('123456'); 提示成功,但客户端仍然连接 ...
- MySql Access denied for user 'root'@'localhost' (using password:YES) 解决方案
关于昨天下午说的MySQL服务无法启动的问题,解决之后没有进入数据库,就直接关闭了电脑. 今早打开电脑,开始-运行 输入"mysql -uroot -pmyadmin"后出现以下错 ...
- [上架] iOS "app-specific password" 上架问题
当你的 Apple ID 改用双重认证密码时,上架 iOS App 需要去建立一个专用密码来登入 Apple ID 才能上架. 如果使用 Application Loader 上传时,得到这个讯息: ...
- [LeetCode] Strong Password Checker 密码强度检查器
A password is considered strong if below conditions are all met: It has at least 6 characters and at ...
- mysql 错误 ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number 解决办法
MySQL创建用户(包括密码)时,会提示ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number: 问题原因: ...
- phpmyadmin #1045 - Access denied for user 'root'@'localhost' (using password: NO)
phpmyadmin访问遇到1045问题 #1045 - Access denied for user 'root'@'localhost' (using password: NO) 解决办法 找到p ...
随机推荐
- windows 关机 重启 命令
关机 shutdown -s -t 0 重启 shutdown -r -t 0 重启电脑windows 立即关机 shutdown -s 三十分钟后关机 shutdown -s -t 30 举例说明一 ...
- gzip是一种数据格式,deflate是一种压缩算法
gzip是一种数据格式,默认且目前仅使用deflate算法压缩data部分:deflate是一种压缩算法,是huffman编码的一种加强. deflate与gzip解压的代码几乎相同,可以合成一块代码 ...
- 7.25 9figting!
TEXT 87 Fund management基金管理 A Miller's tale 米勒传奇(陈继龙编译) Dec 7th 2006 From The Economist print edit ...
- C# 6.0可能的新特性及C#发展历程[转]
C# 6.0可能的新特性及C#发展历程[转] 年10月份发布了,对应的是.Net Franework 4.5.1. 或者3年,更新增加的东西会比较多,所以对于C# 6.0,还是有一些期待的. 下面 ...
- maven 中的依赖
- 图解Java常用数据结构(一)
最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...
- Borg Maze(BFS+MST)
Borg Maze http://poj.org/problem?id=3026 Time Limit: 1000MS Memory Limit: 65536K Total Submissions ...
- 完全使用ASP.NET实现的省市区级联效果
本功能特点:下级的显示和数据的加载都是由上一级下拉框的SelectedIndexChanged触发的,在上级下拉框没有选择之前,下级不会出现,用户体验比较好.无刷新方面,采用AJAX技术,在数据选择的 ...
- jdk版本问题
今天遇到很郁闷的问题jdk 版本是1.6 如何设置1.8 记录一下 可以设置环境变量设置jdk版本问题再就是在 1.java工具设置jdk版本问题 2.grandle 设置要注意 3.生成环境设置j ...
- .net 分布式架构之分布式锁实现(转)
分布式锁是控制分布式系统之间同步访问共享资源的一种方式.在分布式系统中,常常需要协调他们的动作.如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防 ...