尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

P13714 淘汰(Hard ver.)

P13714 淘汰(Hard ver.)
📅 发布时间:2026/6/18 9:43:49
思路:考虑DP,对于每一位存在关键操作,操作后该位不再变化,之前该位状态无关紧要。设$f_S$表示集合$S$的位未固定,不在$S$的位已固定且与$y$相同的最小花费。预处理$g_S$,即集合$S$上与$y$相同的AND操作的最小费用,通过高位前缀和求解(因取$\min$无需容斥),OR操作同理。转移时枚举$S$补集的子集$T$,对AND操作,要求$y$在$T$位置均为$0$,可选AND操作在$T$位置为$0$且在$S$中为$1$的位置为$1$;OR操作类似。时间复杂度$O(2^k k + 3^k)$ 。

P13714 淘汰(Hard ver.)

题意

略。

思路

参考第一篇题解。

先想了一些最短路的东西,但是复杂度好像怎么都不行。


于是考虑 DP。

对于任意一位,在某一个操作(称为这一位的关键操作)之后,这一位就不再变化。

对于任意一位,在它的关键操作之前,这一位是什么不重要。因为我们的操作一定是霸道地把这一位设为 0/1。

设 \(f_S\) 表示集合为 \(S\) 的位已经固定。那么集合 \(S\) 的位置,与 \(y\) 相同。不属于集合 \(S\) 的位置,随便。

转移。枚举 \(S\) 的补集/的子集 \(T\),钦定这次操作将要固定集合 \(T\) 的位置。

对于 AND 操作为例,要求 \(y\) 在 \(T\) 的位置,均为 \(0\)。可选的 AND 操作,需要满足在 \(T\) 的位置均为 \(0\),且在 \(S\) 中为 \(1\) 的位置,均为 \(1\)。即在 \(T\) 和 (\(S\) 中为 \(1\)) 的位置上,要与 \(y\) 相同。

对于 OR 操作是类似的。

我们预处理出 \(g_S\),表示在集合 \(S\) 上与 \(y\) 相同的 AND 操作,的最小费用。这个可以高位前缀和求。而且因为是取 \(\min\) 操作,所以不用容斥。

对于 OR 操作是类似的。

时间复杂度 \(O(2^k k + 3^k)\)。

code

为了方便写代码,代码中状态定义如下:

  • \(f_S\) 表示集合为 \(S\) 的位置还没有固定,不属于集合 \(S\) 的位置已经固定,且与 \(y\) 相同,的最小花费。
  • \(ga_S\) 表示集合为 \(S\) 的位置可以与 \(y\) 不相等,不属于集合 \(S\) 的位置一定与 \(y\) 相等,的 AND 操作,的最小花费。
  • \(gb_S\) 为 OR 操作,其他同上。
#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
namespace wing_heart {constexpr int K=16,N=(1<<K)+7;constexpr ll infll=0x3f3f3f3f3f3f3f3f;void _min(ll &a,ll b) { a=min(a,b); }int T;struct pii {int w,x;}a[N],b[N];int n;int k;int s,t;ll f[N],ga[N],gb[N]; // S 尚未确定(其他=t),S 可以与 y 不相等(and),同前(or)void main() {sf("%d",&T);while(T--) {sf("%d%d%d%d",&n,&k,&s,&t);int x;rep(i,1,n) sf("%d",&x), a[i].x=x;rep(i,1,n) sf("%d",&x), b[i].x=x;rep(i,1,n) sf("%d",&x), a[i].w=x;rep(i,1,n) sf("%d",&x), b[i].w=x;memset(ga,0x3f,sizeof(ll)<<k);memset(gb,0x3f,sizeof(ll)<<k);rep(i,1,n) _min(ga[a[i].x^t],a[i].w);rep(i,1,n) _min(gb[b[i].x^t],b[i].w);rep(i,0,(1<<k)-1) {rep(j,0,k-1) if(!((i>>j)&1)) {_min(ga[i|(1<<j)],ga[i]);_min(gb[i|(1<<j)],gb[i]);}}memset(f,0x3f,sizeof(ll)<<k);int p = s^t; rep(i,p,(1<<k)-1) if((i|p) == i) f[i]=0;per(i,(1<<k)-1,0) if(f[i]!=infll) {for(int j=i;j;j=(j-1)&i) { // 确定 jif(!(t&j)) _min(f[i^j],f[i]+ga[(((~i)&(~t))|(i^j))&((1<<k)-1)]);if((t&j)==j) _min(f[i^j],f[i]+gb[((~i)&t)|(i^j)]);}}if(f[0]==infll) puts("-1");else pf("%lld\n",f[0]);}}
}
int main() {#ifdef LOCALfreopen("in.txt","r",stdin);freopen("my.out","w",stdout);#endifwing_heart :: main();
}

本文来自博客园,作者:wing_heart,转载请注明原文链接:https://www.cnblogs.com/wingheart/p/19219676

相关新闻

  • Windows 10 本地部署工作流自动化工具 n8n
  • Gary Yen教授在BICTA2025做主旨汇报并访问本课题组
  • 关于AI元人文构想与价值工程生态系统的全面研究报告

最新新闻

  • NETCANFD以太网转CANFD设备:工业通信互联互通的硬核解决方案
  • 实战解析:Hunyuan3D-2本地部署与云端方案深度对比,如何选择最适合你的3D生成环境?
  • HDLC总线模式冲突检测原理与MPC857T PowerQUICC实战配置
  • 软考备考资料分享
  • 如何免费搭建个人专属媒体中心?Jellyfin完整使用指南
  • SST39VF/LF并行NOR Flash在嵌入式低功耗高可靠系统中的应用与实战

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号