news 2026/7/28 14:33:55

BZOJ3003 LED题解(状压DP+最短路+差分)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
BZOJ3003 LED题解(状压DP+最短路+差分)

题目:BZOJ3003.
题目大意:给定一个长度为n nn序列a i a_iai与给定m mm种操作,a i a_iai初始全为0 00,每种操作给定一个长度,表示可以对这个长度的区间取反.现在要你用一定次数的操作把整个序列变成只有k kk个位置为1 11,其余全为0 00,求最少操作数.
数据组数T ≤ 10 T\leq 10T101 ≤ n ≤ 1 0 4 , 1 ≤ m ≤ 100 , 1 ≤ k ≤ 10 1\leq n\leq 10^4,1\leq m\leq 100,1\leq k\leq 101n104,1m100,1k10.

对于这种区间染色的题,我们发现区间染色的操作非常麻烦,所以考虑把操作和序列都进行异或差分,现在操作变成相隔一定长度的两个位置取反,同时最终的序列变成了最多2 k 2k2k个位置为1 11.

之后考虑把问题变为从终态到初态的最少步数,然后状压DP.设f [ S ] f[S]f[S]表示集合S SS中的位置为1 11其它位置为0 00需要的最少步数,那么可以列出转移:
f [ S ] = min ⁡ i , j ∉ S { f [ S ∪ { i , j } ] + g ( i , j ) } f[S]=\min_{i,j\notin S}\{f[S\cup\{i,j\}]+g(i,j)\}f[S]=i,j/Smin{f[S{i,j}]+g(i,j)}

其中g ( i , j ) g(i,j)g(i,j)表示把位置i ii和位置j jj同时消掉需要的最少步数,但是这个东西并不好求.

考虑若当前用长度为l e n 1 len_1len1的操作消掉了位置i ii,则位置i + l e n 1 i+len_1i+len1会变为1 11,之后用长度为l e n 2 len_2len2的操作消掉位置i + l e n 1 i+len_1i+len1,则位置i + l e n 1 i+len_1i+len1会变为0 00i + l e n 1 + l e n 2 i+len_1+len_2i+len1+len2变为1 11

我们会发现上述过程类似于一个最短路,对于每一个位置i ii和每一个区间长度j jj,则将位置i iii + j , i − j i+j,i-ji+j,ij两个位置连接起来,跑个最短路就完事了.

一个小优化,容易发现每次转移的时候位置( i , j ) (i,j)(i,j)中有一个位置是可以钦定而不枚举的,这样就可以少O ( k ) O(k)O(k)的时间复杂度了.

时间复杂度O ( T ( n m + 2 2 k k ) ) O(T(nm+2^{2k}k))O(T(nm+22kk)).

代码如下:

#include<bits/stdc++.h>using namespace std;#defineAbigail inline voidtypedeflonglongLL;constintN=10000,M=100,K=10,INF=(1<<30)-1;intnum[(1<<K*2)+9];voidGet_num(){for(inti=0;i<=K*2;++i)num[1<<i]=i;}intn,m,sk,a[N+9],len[M+9];intp[K*2+9],cp;voidGet_p(){cp=0;for(inti=1;i<=n;++i)if(a[i])p[++cp]=i;}structside{inty,next;}e[N*M*2+9];intlin[N+9],cs;voidIns(intx,inty){e[++cs].y=y;e[cs].next=lin[x];lin[x]=cs;}voidIns2(intx,inty){Ins(x,y);Ins(y,x);}voidGet_graph(){for(inti=1;i<=n;++i)lin[i]=0;cs=0;for(inti=1;i<=m;++i)for(intj=1;j<=n;++j){if(j-len[i]>=1)Ins(j,j-len[i]);if(j+len[i]<=n)Ins(j,j+len[i]);}}queue<int>q;intdis[K*2+9][N+9],vis[N+9];voidBfs_dis(intid,intst){for(inti=1;i<=n;++i)dis[id][i]=INF,vis[i]=0;dis[id][st]=0;vis[st]=1;q.push(st);for(;!q.empty();){intt=q.front();q.pop();for(inti=lin[t];i;i=e[i].next)if(!vis[e[i].y]){dis[id][e[i].y]=dis[id][t]+1;vis[e[i].y]=1;q.push(e[i].y);}}dis[id][st]=INF;}intdp[(1<<K*2)+9];voidGet_dp(){for(intg=0;g<1<<cp;++g)dp[g]=INF;dp[(1<<cp)-1]=0;for(intg=(1<<cp)-1;g>0;--g){if(dp[g]==INF)continue;intt0=g&-g;if(g-t0==0)continue;for(inti=g-t0;i;i-=i&-i){intt1=i&-i;dp[g^t0^t1]=min(dp[g^t0^t1],dp[g]+dis[num[t0]+1][p[num[t1]+1]]);}}}Abigailstart(){Get_num();}Abigailinto(){scanf("%d%d%d",&n,&sk,&m);++n;for(inti=1;i<=n;++i)a[i]=vis[i]=0;for(inti=1;i<=sk;++i){intx;scanf("%d",&x);if(vis[x])continue;vis[x]=1;a[x]^=1,a[x+1]^=1;}for(inti=1;i<=m;++i)scanf("%d",&len[i]);}Abigailwork(){Get_p();Get_graph();for(inti=1;i<=cp;++i)Bfs_dis(i,p[i]);Get_dp();}Abigailouto(){printf("%d\n",dp[0]==INF?-1:dp[0]);}intmain(){intT;start();scanf("%d",&T);while(T--){into();work();outo();}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/28 14:33:23

ajax 详解(GET,POST方式传输以其封装)

1&#xff0c;什么是ajax 2&#xff0c;为什么ajax这么火 特点 3&#xff0c;Ajax的工作原理 4&#xff0c;Ajax的工作流程 5&#xff0c;请求服务器调用方式GET&#xff0c;POST 6&#xff0c;同源策略&#xff0c;数据传输方式及接口设计原则 7&#xff0c;ajax操作.txt 格式…

作者头像 李华
网站建设 2026/7/28 14:33:05

超强盘点!2026年适配各学科的AI论文工具,精准输出不套壳

你是不是还在为写期刊论文、毕业论文或者职称论文而头疼&#xff1f;在动手写论文时&#xff0c;面对大量的文献资料简直像在大海里找针&#xff0c;格式规范又多又复杂&#xff0c;修改来修改去&#xff0c;常常让人没了耐心&#xff0c;写作进度慢得让人沮丧。其实&#xff0…

作者头像 李华
网站建设 2026/7/28 14:33:01

实测揭秘!2026 年适配多学科的 AI 论文写作工具究竟有哪些

到了2026年&#xff0c;越来越多的人开始尝试用AI写论文&#xff0c;尤其是写长篇的硕士或者博士论文。 但是&#xff0c;很多AI写论文的工具在面对这样的专业需求时&#xff0c;常常表现不够理想。比如说&#xff0c;有的AI论文生成工具写出来的内容缺乏理论上的深度&#xf…

作者头像 李华
网站建设 2026/7/28 14:32:57

C#转C++实战:内存管理、RAII与面向对象编程核心差异解析

1. 从C#到C&#xff1a;跨越托管与非托管的思维鸿沟如果你是一位有经验的C#开发者&#xff0c;现在需要踏入C的世界&#xff0c;尤其是面对像Visual Studio 2013这样的“经典”环境&#xff0c;你可能会感到既熟悉又陌生。熟悉的是IDE的布局&#xff0c;陌生的是背后那套完全不…

作者头像 李华
网站建设 2026/7/28 14:32:30

Claude Opus登顶AA-Briefcase:AI智能体如何突破复杂知识工作瓶颈

如果你最近在关注AI智能体的发展&#xff0c;可能会注意到一个有趣的现象&#xff1a;各大厂商都在推出自己的智能体平台&#xff0c;但真正能处理复杂知识工作的智能体却寥寥无几。这背后反映了一个核心问题&#xff1a; 当前大多数智能体框架更擅长执行简单任务&#xff0c;…

作者头像 李华
网站建设 2026/7/28 14:31:31

Adobe-GenP 3.0:终极Adobe全家桶免费激活指南

Adobe-GenP 3.0&#xff1a;终极Adobe全家桶免费激活指南 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 还在为Adobe Creative Cloud的高昂订阅费用烦恼吗&#xf…

作者头像 李华