当前位置: 首页 > news >正文

CF165E题解

传送门:https://www.luogu.com.cn/problem/CF165E

题意简述:给定一个数组,对于每个数寻找任意一个与其位与为 \(0\) 的数。

字典树上貌似不太可做,找找看性质。我们只需要保证当前数为 \(1\) 的位为 \(0\),而为 \(0\) 的位置没有限制条件。例如一个数和 \((1011)_2\) 位与为 \(0\),那么显然与 \((1001)_2\) 位与为 \(0\),因为他在相同位置少了个 \(1\)

我们不妨可以预处理出整个数组每个数可能与其位与为 \(0\),最紧的数,也就是在可为 \(1\) 的位置上都放上 \(1\)。与某个数位与为 \(0\) 的数,只能由最紧的数去除若干个 \(1\) 得到。对于每个可行的数,去除二进制为 \(1\) 的位置把自身的答案给到下一个更松的数,显然无后效性,可以用动态规划解决这个问题。

方程很简单:令 \(f_i\) 表示原数组中一个位与 \(i\)\(0\) 的数,初始 \(f_{a_i \oplus INF}=a_i\),转移:\(f_i=f_{i|(1<<j)}\),当发现第一个合法位置break掉。

#include <bits/stdc++.h>const int N = 2e6 + 1, inf = (1 << 22) - 1;using namespace std;int f[inf + 1], a[N];int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);memset(f, -1, sizeof f);int n;cin >> n;for (int i = 1; i <= n; ++i) {cin >> a[i];f[inf ^ a[i]] = a[i];}for (int num = inf; ~num; --num) {for (int i = 0; i <= 21; ++i) {if (~f[num]) break;if ((num >> i & 1) == 0) f[num] = f[num | 1 << i];}}for (int i = 1; i <= n; ++i) cout << f[a[i]] << ' ';return 0;
}
http://www.jsqmd.com/news/482530/

相关文章:

  • 腾讯 CodeBuddy + WorkBuddy:从写代码到管周报,一个 AI 生态通吃全场景
  • 从图灵测试到大模型:人工智能的演进之路(最近open claw及重看流浪地球有感)
  • 随笔2
  • 数字世界的攻防战:网络安全的演进之路
  • 提示工程架构师的提示优化复盘:自监督学习的3个成功因素
  • 差分算法(java)
  • Python 中 Pydantic库 是什么,怎么用?
  • 输入(java)
  • 从 0 到 1 跑通 LangChain (TypeScript版)
  • vibecoding知识库
  • 懒更新|单点查询
  • Windows下安装Claude Code,使用API Key方式调GLM
  • uvicorn,一个无敌的 Python 库!
  • CRUD思维:开发者的通用问题解决锚点
  • d3地图
  • 搭建私有 Matrix 聊天服务器 - yi
  • ezrop
  • 《PCRDiffusion: Diffusion Probabilistic Models for Point Cloud Registration》论文
  • 量化交易系列(八):OKX 搞了个 AI Trade Agent,是普通人的机会还是手续费收割机?
  • 实现DevOps需要的工具
  • Python 搭建 FastAPI 项目
  • 网络自动化学习-基于H3C模拟器的Netconf基础准备与练习
  • 宁夏中宁玺赞枸杞实测:红柳沟庄园好枸杞,闭眼入不踩坑! - 宁夏壹山网络
  • 深入研究大数据领域的数据清洗算法与模型
  • 总要有个地方能够存放当前的自我
  • 操作系统引论
  • 小马智行Robotaxi接入腾讯出行,联手腾讯未来何在?
  • Stack pivot (leave_ret详解)
  • 京东自营家装来了,用AI进军家装未来何在?
  • P8635 [蓝桥杯 2016 省 AB] 四平方和【枚举+打表】