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 ...
随机推荐
- LPCTSTR和LPTSTR和char *究竟有什么区别
LPSTR = char* LPCSTR = const char* LPTSTR: 如果定义了UNICODE宏,那么LPTSTR = wchar_t*否则LPTSTR = char* LPCTSTR ...
- Python运维开发基础08-文件基础
一,文件的其他打开模式 "+"表示可以同时读写某个文件: r+,可读写文件(可读:可写:可追加) w+,写读(不常用) a+,同a(不常用 "U"表示在读取时, ...
- Python小程序之「读取站点地图 自动为Gitalk创建Issues」
首发于个人博客 想获得更好的阅读体验,烦请移步⬆️ 前言 前些天给博客加了评论功能,试了Disqus.Valine等一干评论系统,最后还是选择了在大陆相对友好而且符合技术博客风格的Gitalk.但是由 ...
- 微信H5支付常见问题汇总
常见问题 一.回调页面 正常流程用户支付完成后会返回至发起支付的页面,如需返回至指定页面,则可以在MWEB_URL后拼接上redirect_url参数,来指定回调页面. 如,您希望用户支付完成后跳转至 ...
- 27-python 画图
绝佳教程:http://pyecharts.org/#/zh-cn/prepare?id=%E4%BD%BF%E7%94%A8%E4%B8%BB%E9%A2%98安装 pyecharts pip in ...
- 微软AntiXSS防止xss攻击类库
AntiXSS,由微软推出的用于防止XSS攻击的一个类库,可实现输入白名单机制和输出转义. AntiXSS最新版的下载地址:http://wpl.codeplex.com 下载安装之后,安装目录下有以 ...
- Python操作mysql之模块pymysql
pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持3.x版本. 本文环境 python3.6.1 Mysql ...
- 协程库st(state threads library)原理解析
协程库state threads library(以下简称st)是一个基于setjmp/longjmp实现的C语言版用户线程库或协程库(user level thread). 这里有一个基本的协程例子 ...
- 高性能mysql第三版(文摘)
第1章 mysql架构与历史 1.1处理和存储相分离,用户可以选择合适的存储引擎 1.2并发控制 表锁:开销小 行级锁:开销大 1.3事务 acid特性:原子性,一致性,隔离性,持久性 1.4 多版本 ...
- 8.7 正确使用索引(no)
一 索引未命中 并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果,我们在添加索引时,必须遵循以下问题 1 范围问题,或者说条件不明确,条件中出现这些符号或关键字:& ...