题解:CF2146D2 Max Sum OR (Hard Version)

news/2025/9/29 13:13:11/文章来源:https://www.cnblogs.com/Tomwsc/p/19118569

好题。

思路

首先贪心的考虑,对于两个数 \(x\)\(y\),必然是当 \(x\)\(y\) 后二进制里全为 \(1\) 是最优的,在下文中我们称其为互补。知道这个结论Easy Version就可以直接从 \(r\) 开始往 \(0\) 枚举,对于每个数都取互补的数即可。

void solve() {int l, r;ll res = 0;cin >> l >> r;vector<int> ans(r + 1);vector<bool> flag(r + 1);for (int i = r; i >= l; i--) {if (flag[i]) continue;int cnt = 0;for (int j = 0; j <= log2(i); j++) {if (!((1 << j) & i)) {cnt += (1 << j);}}res += (cnt | i);ans[i] = cnt;ans[cnt] = i;flag[i] = flag[cnt] = true;}cout << res * 2 << "\n";for (int i = 0; i <= r; i++) {cout << ans[i] << " \n"[i == r];}
}

回到本题,因为 \(l\ge 0\),所以上面的贪心方法需要改进。容易得到,二进制中的相同的高位都是可以去掉的,所以我们只需要考虑剩下的位即可。考虑手玩几组数据,当 \(l=2\)\(r=7\) 时如下:

\[010_2\\ 011_2\\ 100_2\\ 101_2\\ 110_2\\ 111_2 \]

观察发现此时仍然可以得到两组互补的数,即:\((2, 5)\)\((3, 4)\)。此时考虑先把这两组的答案计算上,这样互补的数中的每一位都用上了,所以一定不劣。那剩下的数怎么办呢?

\[\textcolor{red}{11}0_2\\ \textcolor{red}{11}1_2\\ \]

注意到标红部分属于二进制中相同的高位,于是乎把它们去掉,然后便得到了:

\[0_2\\ 1_2\\ \]

于是又得到了一对互补的数。

根据上述手玩的过程,我们归纳出一个方法:

对于一段区间 \([l, r]\),在去除二进制中相同的高位后,必然可以被划分成两个区间 \([l, pos]\)\((pos, r]\),其中第一个区间中的数在二进制表示下的最高位为 \(0\),第二个区间中的数在二进制表示下的最高位为 \(1\)。此时,不妨令 \(pos - l + 1 \ge r - pos\)。在这种情况下,\((pos, r]\) 这段区间中的数一定可以与第一个区间中进行互补匹配,于是将匹配的数计算进答案,然后令 \(r\leftarrow 2\times pos - r\),将区间右边界缩小。若 \(pos - l + 1 < r - pos\),则令 \(l\leftarrow 2\times pos - l + 2\)

\(r\leftarrow 2\times pos - r\)\(l\leftarrow 2\times pos - l + 2\) 是怎么来的?

还是上面那组样例:

\[010_2\\ 011_2\\ 100_2\\ 101_2\\ 110_2\\ 111_2 \]

此时的 \(pos=3\),容易发现互补的匹配是从 \(pos\) 开始对称的,即:

\[(3, 4)\\ (2, 5)\\ \]

所以我们可以得到在计算完所有完美匹配后的 \(l\)\(r\) 应该缩小到哪里。此时就有:

  • \(pos - l + 1 \ge r - pos\),则 \(r\leftarrow pos-(r-pos)=2\times pos-r\)
  • \(pos - l + 1 < r - pos\),则 \(l\leftarrow pos + pos - l + 1 + 1 = 2\times pos - l + 2\)

最后的问题便不断的缩小,终止边界为 \(l\ge r\)注意,若 \(l=r\) 则还要计算一个数或上它本身的情况。

在将相同的高位删除时需要带一个 \(\log\),所以总时间复杂度为:\(O(n\log V)\)\(V\) 为取值上限。

代码

部分地方的式子和文中有一些差别,但不影响理解(AC 记录)。

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define i128 __int128
#define inf (1ll << 62)
#define PII pair<int, int>
#define pb push_back
#define fi first
#define se second
using namespace std;void solve() {ll l, r, d = 0, res = 0;cin >> l >> r;ll x = r, y = l;vector<int> ans(r - l + 1);while (r > l) {// cerr << l << " " << r << "\n";ll l1 = l + d, r1 = r + d;int num = 0;for (int i = 30; i >= 0; i--) {int ok = -1;bool vis = false;for (int j = l; j <= r; j++) {if (ok == -1) {ok = ((1 << i) & j);} else if (ok != ((1 << i) & j)) {vis = true;for (int k = l; k <= r; k++) {if ((1 << i) & k) num++;}break;}}if (vis) break;d += ok;}l = l1 - d;r = r1 - d;if (num >= (r - l) / 2 + 1) {int pos = r - num, pos1 = l + (pos - l) * 2 + 1;res += (pos1 - l + 1) * d;for (int i = l, j = pos1; i <= j; i++, j--) {ans[i + d - y] = j + d;ans[j + d - y] = i + d;res += (i | j);if (i != j) res += (i | j);}l = pos1 + 1;} else  {int pos = r - num + 1, pos1 = r - (r - pos) * 2 - 1;res += (r - pos1 + 1) * d;for (int i = r, j = pos1; i >= j; i--, j++) {ans[i + d - y] = j + d;ans[j + d - y] = i + d;res += (i | j);if (i != j) res += (i | j);}r = pos1 - 1;}}if (r == l) {res += r + d;ans[r + d - y] = r + d;}cout << res << "\n";for (int i = 0; i <= x - y; i++) {cout << ans[i] << " \n"[i == x - y];}
}int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t = 1;cin >> t;while (t--) {solve();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/921848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么做网站报价表网络营销运营策划

文章目录 Redis快速入门1.初识Redis1.1.认识NoSQL1.1.1.结构化与非结构化1.1.2.关联和非关联1.1.3.查询方式1.1.4.事务1.1.5.总结 1.2.认识Redis1.3.安装Redis1.3.1.依赖库1.3.2.上传安装包并解压1.3.3.启动1.3.4.默认启动1.3.5.指定配置启动1.3.6.开机自启 1.4.Redis桌面客户端…

深入解析:4、urbane-commerce 认证请求 DTO 设计规范

深入解析:4、urbane-commerce 认证请求 DTO 设计规范pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

实用指南:基于MATLAB的8QAM调制解调仿真与BER性能分析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

NVIDIA 开源 Audio2Face:音频生成逼真面部动画;Gemini Live API 支持思考能力 丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、…

做服务的网站起名成都做网站设

你的意思是 小明和 888888这样的学号都是从数据中来的&#xff1f;然后要展现到前端页面中其实有很多方法&#xff1a;一. 直接全HTML拼接(你可能想到的方法)// 假设 有 name 和 xueID 分别代表名字和学号的变量var HTMLbankname xueID name 上学校&#xff0c;天天不迟到&…

德州网站开发培训网站建设产品需求文档

11月3日&#xff0c;2022 杭州 云栖大会上&#xff0c;阿里云智能总裁张建锋表示&#xff0c;以云为核心的新型计算体系正在形成&#xff0c;软件研发范式正在发生新的变革&#xff0c;Serverless 是其中最重要的趋势之一&#xff0c;阿里云将坚定推进核心产品全面 Serverless…

广州做护肤品的网站重庆宣传网站怎么做

01 pair的定义和结构 在C中&#xff0c;pair是一个模板类&#xff0c;用于表示一对值的组合&#xff0c;它位于头文件中。 pair类的定义如下: template<class T1,class T2>struct pair{T1 first;//第一个值T2 second;//第二个值// 构造函数pair();pair(const T1& X…

【数据结构】冒泡、选择、插入、希尔排序的完成

【数据结构】冒泡、选择、插入、希尔排序的完成pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

GPTEngineer:AI 驱动的Web应用创建平台

GPTEngineer:AI 驱动的Web应用创建平台2025-09-29 12:49 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block …

江西住房和城乡建设部网站中国建筑考试网官网首页

阿里云今年有双十一活动吗&#xff1f;不好说&#xff0c;因为去年就没有。阿里云双11优惠活动是一项大型的促销活动&#xff0c;每年都有&#xff0c;但是去年没有双十一活动&#xff0c;不知道今年2023年阿里云是否有双11优惠活动。但是阿里云百科aliyunbaike.com猜想&#x…

C++----红黑树 - 详解

C++----红黑树 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "…

选对强大的技术底座:一篇文章讲透虚拟机与容器核心差异

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

mp4/图片转gif

mp4转gif ffmpeg -f gif -i name.gif output.mp4 ffmpeg -i output.mp4 -vf palettegen palette.png ffmpeg -i output.mp4 -i palette.png -lavfi paletteuse name.gif基于png图片生成调色板 ffpmpeg -i xx_Wait.gif …

详细介绍:09.【Linux系统编程】“文件“读写操作,Linux下一切皆文件!

详细介绍:09.【Linux系统编程】“文件“读写操作,Linux下一切皆文件!pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: …

数据类型-元组

元组(不可变类型):info = tuple()#空元组  info = (1,2,3,"guohan") 公共功能:1.索引:info[0] = 12.切片:info [0:3] = (1,2,3)3.步长:info [::2] = (1,3)4.for循环:for i in info:5.len: len(in…

深入解析:招聘:解决方案架构师 - 中国北京(混合办公)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

个人用云计算学习笔记 --14( Linux 逻辑卷管理、Linux 交换空间管理) - 教程

个人用云计算学习笔记 --14( Linux 逻辑卷管理、Linux 交换空间管理) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fa…

除了网页外 网站还需要东莞有哪些好企业

我一个朋友的网站&#xff0c;5月份时候被攻击了&#xff0c;然后他找我帮忙看看&#xff0c;我看他的网站、网上查资料&#xff0c;不看不知道&#xff0c;一看吓一跳&#xff0c;最近几年这网络安全形势真是不容乐观&#xff0c;在网上查了一下资料&#xff0c;1、中国信息通…

自然灾害vr学习机:山体滑坡+泥石流避险+洪涝逃生+地震逃生+台风避险+雷电避险 - 详解

自然灾害vr学习机:山体滑坡+泥石流避险+洪涝逃生+地震逃生+台风避险+雷电避险 - 详解2025-09-29 12:37 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; o…

站点搭建使用socket登陆wordpress源码

它是一个全面的、企业应用开发一站式的解决方案&#xff0c;贯穿表现层、业务层、持久层。但是 Spring仍然可以和其他的框架无缝整合。 1 Spring 特点 轻量级控制反转面向切面容器框架集合 2 Spring 核心组件 3 Spring 常用模块 4 Spring 主要包 5 Spring 常用注解 bean…