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

P15078 [ICPC 2024 Chengdu R] Expanding Array 题解

思路解析

考虑分类讨论。

题目中给到我们三种运算:按位与、按位或、按位异或。

分类

按位与

先来看一下按位与的定义:

参与运算的两数各对应的二进位相与。只有对应的两个二进位都为 \(1\) 时,结果位才为 \(1\)。否则,结果位为 \(0\)

举几个例子:

\[5 \ \& \ 3 = (101)_2 \ \& \ (011)_2 = (001)_2 = 1 \]

\[4 \ \& \ 3 = (100)_2 \ \& \ (011)_2 = (000)_2 = 0 \]

\[4 \ \& \ 2 = (100)_2 \ \& \ (010)_2 = (000)_2 = 0 \]

发现了吗?按位与的结果都是不增的,所以对于相邻的两数 \(x_1\)\(x_2\),有 \(x_1 \ \& \ x_2 \leq x_1,x_2\)

那么也就是说,进行按位与操作后,结果只能放在 \(x_1\)\(x_2\) 左边,接下来就不用考虑。

按位或

类似于按位与,再看一下按位或的定义:

将两个整数的二进制位逐位进行逻辑或运算,当两个对应位中至少有一个为 \(1\) 时,结果位为 \(1\),否则为 \(0\)

依旧举几个例子:

\[5 \ |\ 3 = (101)_2 \ | \ (011)_2 = (111)_2 = 7 \]

\[4 \ |\ 3 = (100)_2 \ | \ (011)_2 = (111)_2 = 7 \]

\[4 \ |\ 2 = (100)_2 \ | \ (010)_2 = (110)_2 = 6 \]

发现了吗?按位或的结果都是不降的,所以对于相邻的两数 \(x_1\)\(x_2\),有 $ x_1,x_2 \le x_1 \ |\ x_2$。

那么也就是说,进行按位或操作后,结果只能放在 \(x_1\)\(x_2\) 右边,接下来的结果还是要暂时搁置的,等一下还是要处理。

按位异或

最后来看一下按位异或的定义:

当且仅当两个输入值不同时,异或运算输出为 \(1\),否则输出为 \(0\),即同为 \(0\),异为 \(1\)

仍旧举几个例子:

\[5 \ \oplus \ 3 = (101)_2 \ \oplus \ (011)_2 = (110)_2 = 6 \]

\[4 \ \oplus \ 3 = (100)_2 \ \oplus \ (011)_2 = (111)_2 = 7 \]

\[4 \ \oplus \ 4 = (100)_2 \ \oplus \ (100)_2 = (000)_2 = 0 \]

发现了吗?按位异或的结果并没有单调性,这里的结果也暂时搁置。

讨论

观察到题目中说可以进行任意次操作,那么如果相邻的两数所产生的结果会扰动其他的数的话,那么这个问题的答案一定难以求解,所以相邻两数结果仅和这两个数本身相关,如何证明这个结论呢?

考虑利用容斥原理解决问题,如该维恩图所示:

其左边的圆表示 \(A\) 的位,右边的圆表示 \(B\) 的位。也就是说黄色部分代表的是 \(A\)\(B\) 共有的位,红色部分代表的是 \(A\) 独有的位,蓝色部分代表的是 \(B\) 独有的位,空白部分是 \(A\)\(B\) 都没有的位。

那么也就是说,黄色是按位与的结果,红色、黄色、蓝色之和是按位或的结果,红色部分和蓝色部分之和是按位异或的结果。

所以,空白部分不会被任何一种运算所得到,也就是不会产生新的位,所以相邻两数的结果不会影响其他数。

所以,我们总共有 \(3\) 种颜色,总的种数是 \(C_3^1 + C_3^2 + C_3^3 = 7\)(没有 \(C_3^0\) 的原因是必须和 \(A\)\(B\) 有关,肯定不会太多,进行讨论:

  • 黄色:\(A \ \& \ B\)
  • 红色:\((A \ | \ B) \ \oplus \ B\)
  • 蓝色:\((A \ | \ B) \ \oplus \ A\)
  • 红色和黄色:\(A\)
  • 蓝色和黄色:\(B\)
  • 红色和蓝色:\(A \ \oplus \ B\)
  • 红色、黄色、蓝色之和:\(A \ |\ B\)

只需要用 mapset 等容器记录并去重即可。

代码实现

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
int n, la;
set<int> s;
namespace Tangyixiao {inline void solve() {cin >> la;s.insert(0);for (int i = 2, x; i <= n; ++i) {cin >> x;s.insert(x);s.insert((x | la) ^ la);s.insert((x | la) ^ x);s.insert(x | la);s.insert(x & la);s.insert(x ^ la);s.insert(la);la = x;}cout << s.size();return;}inline void init() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin >> n;return;}
} // namespace Tangyixiao
main() {Tangyixiao::init();Tangyixiao::solve();return 0;
}
http://www.jsqmd.com/news/307835/

相关文章:

  • 抢票系统设计
  • 2026年工程管理软件推荐:项目分散场景深度评测,解决成本超支与协同痛点并附排名
  • 2026年专业防爆箱优质供应商推荐指南
  • 2026年工程管理软件推荐:横向对比与稳定性评价,涵盖现场管理与远程办公多元场景
  • 学霸同款8个AI论文工具,自考论文格式规范轻松搞定!
  • 2026年市场比较好的清障车实力厂家排行榜,常奇清障车/帕菲特清障车/直臂高空作业车/高空作业车,清障车实力厂家哪家好
  • 2026优质防火门推荐榜安全合规之选
  • 学长亲荐!MBA必备TOP8 AI论文工具测评
  • 学长亲荐9个AI论文平台,继续教育学生必备!
  • 盘点2026年武汉地区优质加气块定制生产商,排行前列的加气块10年质保有保障
  • 深度解析商用咖啡机器人关键技术与2026年主流产品应用指南
  • 2026国内最新药材采购供货厂家top5推荐!江西等地优质道地药材/医药流通/药都服务企业权威榜单发布,合规高效助力中医药采购
  • 2026年钢板仓成型设备品牌排名,这些厂家值得关注
  • 2026年好用的CZ型钢一体机设备品牌,推荐靠谱供应商
  • 闪唤到家家政公司专业吗,哈尔滨地区性价比高不高?
  • 聊聊哈尔滨下水道疏通、地漏疏通,哪家口碑好、性价比高且靠谱?
  • 2026年湖南地区医用冷冻冷藏防爆冰箱供应商排名,靠谱品牌推荐
  • 2026年元宵机器供应企业排名,靠谱的厂家费用怎么算
  • 寻找优质扩香器?不妨看看这些口碑工厂,藤条精油/疗愈香氛/蜡烛香薰/蜡片香氛/固体香氛/旅行香氛,扩香器ODM厂家推荐
  • 构建一个高精度 Flutter 计时器:深入解析 Timer、状态同步与 UI 响应式设计
  • 专科生必看!10个高效降AIGC工具推荐,轻松降低AI痕迹
  • 2026年杭州评价好的母猫绝育医院哪家好,宠物医生/宠物骨科/母猫绝育/宠物医院/宠物眼科,猫咪绝育医生专家推荐
  • 2025导电滑环工厂排名出炉!谁才是行业佼佼者?过孔滑环/电环/光纤滑环/旋转接头/气电滑环,导电滑环生产厂家如何选
  • mfc40loc.dll文件在系统内缺少 无法运行问题 免费下载
  • mfc70chs.dll文件丢失找不到 免费下载方法分享
  • 2026 年最新家电维修品牌推荐排行榜:空调维修 / 冰箱维修 / 洗衣机维修 / 太阳能维修/ 燃气灶维修优质服务商平台权威榜单
  • 2026年评价高的电梯公司推荐:电梯保养、电梯更新、鲁泰电梯保养、鲁泰电梯改造、鲁泰电梯更新、鲁泰电梯维修、电梯改造选择指南
  • 看看天津企业合规法律服务律所,口碑好的有哪些
  • 2026年京津冀鲁人力资源外包推荐厂商排名,靠谱的品牌有哪些
  • 深入解析:LeetCode算法日记 - Day 108: 01背包