CF1895D

analysis

看到这个类似差分的样子,想着对它进行转化,通过对题目给出的式子进行变形,我们可以得到下面的式子。

ai=bibi+1

bi+1=biai=bi1ai1ai=(j=1iaj)b1

cij=1iaj

得到原式:bi=ci1b1

所以我们要关心的只有 b1 这一个值。然后我们可以想到要维护异或最大值,不难想到用 01-trie 解决它。

code time

flush 是因为我用的快读快写中的 getchar 和 putchar 是自己手写的,所以有这个函数,大家可以直接忽略。(想了想还是得放一下我这 for 家族,不然看不懂/lh)

#define ll long long #define rl register ll #define fom(i, a) for(rl i=a; i; -- i) #define foa(i, a, b) for(rl i=a; i < b; ++ i) #define fos(i, a, b) for(rl i=a; i <= b; ++ i) #define fop(i, a, b) for(rl i=a; i >= b; -- i) const ll N = 2e6 + 10; ll n, idx, tr[2][N], a[N], s[N]; inline void insert(ll x) { ll p = 0; fop(i, 30, 0) { bool u = x & (1 << i); if(!tr[u][p]) tr[u][p] = ++ idx; p = tr[u][p]; } } inline ll check(ll x) { ll p = 0, res = 0; fop(i, 30, 0) { bool u = x & (1 << i); if(tr[!u][p]) res |= (1 << i), p = tr[!u][p]; else p = tr[u][p]; } return res; } int main() { // freopen("1.in", "r", stdin); read(n); insert(0); foa(i, 1, n) read(a[i]); foa(i, 1, n) s[i] = s[i - 1] ^ a[i], insert(s[i]); foa(i, 0, n) if(check(i) < n) { ww(i), ws; foa(j, 1, n) ww(i ^ s[j]), ws; return flush(), 0; } return flush(), 0; }

__EOF__

本文作者carp
本文链接https://www.cnblogs.com/carp-oier/p/CF1895D.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   carp_oier  阅读(27)  评论(0编辑  收藏  举报
相关博文:
·  CF1895
·  CF1895B
·  CF1875D
·  CF1850F
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示