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";
}
posted @   maburb  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示