Hello 2025 C. Trip to the Olympiad
题意:给你一个区间[l, r], 你要在里面选三个数a, b, c, 使得两两异或值的和最大。
按位考虑,每一位最多被加两次(讨论一下所有情况就懂了),那么如果我们可以构造出来把能加两次的位都加两次,是不是就可以了?
首先对于l和r相同的前缀,我们选的数也一定是这个前缀,这是不能变的。那么我们找到l和r第一个不同的位,让a = xxx1000000... b = xxx0111111..这样a和b异或会把后面的位贡献一次,因为他们每一位都不同,那么我们c取任意数都可以把其他位都异或出来一次。
点击查看代码
void solve() {
i64 l, r;
std::cin >> l >> r;
i64 a = 0, b = 0, c = 0;
for (i64 i = 30; i >= 0; -- i) {
if ((l ^ r) >> i) {
a += 1 << i;
b += (1 << i) - 1;
break;
} else {
if (l >> i & 1) {
a += 1 << i;
b += 1 << i;
}
}
}
c = l;
while (c == a || c == b) {
++ c;
}
std::cout << a << " " << b << " " << c << "\n";
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具