[CF1616H] Keep XOR low

news/2024/12/27 16:04:00/文章来源:https://www.cnblogs.com/663B/p/18305742

Last dance。

最后一篇文章,就写我两年前就看过但不敢尝试的题目吧。

首先,两数异或 \(\le x\) 的条件看起来是好维护的,显然可以 Trie 树上跑一跑,但我们发现当 \(x\) 某一位是 \(1\) 的时候非常难受,情况变得非常复杂。此时我进行了一些尝试,尝试直接刻画合法的 \(S\) 的结构,未果。

把思路调回 Trie 树,继续分类讨论。一个比较暴力的想法是直接设 \(g(p,q)\) 表示在 \(p,q\) 子树内选,并且限制在 \(p,q\) 之间(不考虑 \(p,q\) 自己内部的限制)的方案数。

仔细地分类讨论可以发现,如果 \(x\) 的这一位是 \(1\)\(p\) 内选了 \(0\) 的和 \(q\) 内选了 \(0\) 的不会产生限制,\(p\) 内选了 \(1\) 的不会和 \(q\) 内选了 \(1\) 的产生限制。那么方案数就是 \(g(\mathrm{trie}[p][0], \mathrm{trie}[q][1])\times g(\mathrm{trie}[p][1], \mathrm{trie}[q][0])\)。具体实现需要去除空集。时间复杂度的话,考虑一个点只会以一种路径被遍历到,所以复杂度 \(\mathcal O(n\log v)\)

#include <bits/stdc++.h>
#define pb emplace_back
#define fir first
#define sec secondusing i64 = long long;
using pii = std::pair<int, int>;constexpr int maxn = 3e5 + 5, mod = 998244353;void add(int& x, int y) { if ((x += y) >= mod) x -= mod; return; }
void sub(int& x, int y) { if ((x -= y) < 0) x += mod; return; }
int inc(int x, int y) { return (x + y) >= mod ? (x + y - mod) : (x + y); }
int dec(int x, int y) { return (x < y) ? (x - y + mod) : (x - y); }
int n, lmt, trie[maxn * 30][2], siz[maxn * 30], sz, pw[maxn];void insert(int x) {int u = 1;for (int i = 29; ~i; --i) {int c = x >> i & 1;if (!trie[u][c]) trie[u][c] = ++sz;u = trie[u][c];++siz[u];}return;
}int calc(int x, int y, int bit) {if (!x || !y) return pw[siz[x] + siz[y]];if (x == y) {if (bit == -1) return pw[siz[x]];int c = lmt >> bit & 1;if (c) {return calc(trie[x][0], trie[x][1], bit - 1);} else {return dec(inc(calc(trie[x][0], trie[x][0], bit - 1), calc(trie[x][1], trie[x][1], bit - 1)), 1);}} else {if (bit == -1) return pw[siz[x] + siz[y]];int c = lmt >> bit & 1;if (c) {return 1ll * calc(trie[x][0], trie[y][1], bit - 1) * calc(trie[x][1], trie[y][0], bit - 1) % mod;} else {int rem = dec(inc(calc(trie[x][0], trie[y][0], bit - 1), calc(trie[x][1], trie[y][1], bit - 1)), 1);add(rem, 1ll * (pw[siz[trie[x][0]]] - 1) * (pw[siz[trie[x][1]]] - 1) % mod);add(rem, 1ll * (pw[siz[trie[y][0]]] - 1) * (pw[siz[trie[y][1]]] - 1) % mod);return rem;}}
}int main() {std::cin.tie(nullptr)->sync_with_stdio(false);std::cin >> n >> lmt, sz = 1;for (int i = 1; i <= n; ++i) {int y;std::cin >> y;insert(y);}for (int i = pw[0] = 1; i <= n; ++i) {pw[i] = 2 * pw[i - 1] % mod;}std::cout << (calc(1, 1, 29) - 1 + mod) % mod << '\n';return 0;
}

那么,在此结束吧。

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

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

相关文章

ss

ss ​​

web直播

步骤一:开通腾讯云直播服务 步骤二:获取推流URL 想要简单获取一个推流URL,可以参考文档:快速获得地址 想要了解推流地址和直播间ID的关系,可以参考文档:后台自动拼装 想要了解如果保护自己的推流地址不被盗用,可以参考文档:防盗链签名 步骤三:获取播放URL 步骤四:配置…

通过chrony实现内网自建时间同步服务器

服务端安装chrony服务端yum install -y chrony配置chrony服务端#chrony默认配置文件路径 # yum : 一般为/etc/chrony.conf # apt : 一般为/etc/chrony/chrony.conf #在chrony.conf中加入以下行 server ntp.aliyun.com iburst manual allow 0.0.0.0/0 local stratum 8测试chrony…

【YashanDB知识库】存储过程报错snapshot too old

问题描述 20231127上午客户反馈绩效系统20231125、20231126出现2次YAS-02020 snapshot too old的问题,测试也有类似问题。 该过程是客户新增的存储过程,目的是通过PRO_RUN_JOB作为主控,调度其他存储过程,后续不用其他调度引擎。 原因分析 错误信息收集分析 分析存储过程报错…

DeepVT论文阅读笔记

DeepVT: Deep View-Temporal Interaction Network for News Recommendation论文阅读笔记 Abstract 存在的问题: ​ 以往的研究大多只是直接应用新闻层面的表征进行用户建模,新闻的标题、摘要、分类等观点只是被隐含和压缩到新闻的单一向量中,这就使得不同新闻中的不同观点无…

直播预约丨《指标体系建设实战》第四期:如何构建全面的指标管理体系

指标是反映企业的各项核心业务活动、管理成效的数据体系,指标体系作为联结业务逻辑与数据实体的关键桥梁,是构建高质量数据统计的基础单元,并在量化业务绩效和效果评估中扮演着核心角色。 为了更好地服务于客户并提供切实可行的实践指导,自4月24日起,袋鼠云将推出全新《指…

shr不能创建出差单可能存在的问题

shr不能创建出差单可能存在的问题时间冲突 OTP设置问题​​

暑期集训shellcode5(手搓机器码)

拖进ida里面反汇编再让人工智能分析(我是废物)(后来给源码了,直接上源码) #include <string.h> #include <stdio.h> #include <stdlib.h> #include <inttypes.h> #include <capstone/capstone.h> #include <sys/mman.h>int upkeep() …

MySQL学习笔记——索引

索引 0.前言 本文是跟着网课学习的时候随手记录的一篇关于MySQL索引的学习笔记 1.索引概述 1.1.索引介绍 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样…

快速部署 HBase 测试环境

快速部署 HBase 测试环境 第一步:下载软件,在HBase官网下载最新版, 找到 bin,点击下载,比如我这里下载的是 hbase-2.5.6-bin.tar.gz 第二步:解压软件 $ tar -zxvf hbase-2.5.6-bin.tar.gz $ cd hbase-2.5.6第三步:启动软件 $ ./bin/start-hbase.sh $ ./bin/hbase-daemon…

【YashanDB知识库】用户密码带@字符时exp和imp无法使用

【问题分类】数据导入导出 【关键字】YAS-00404、数据导入导出、密码、特殊字符@、exp、imp 【问题描述】 当用户密码带@字符时,使用exp和imp导入导出数据,使用转义符仍然出现报错且yasql可以使用相同的转义方式正常登录 【问题原因分析】exp和imp的密码没有适配特殊字符 【解…

写了一个json小工具,希望大家体验(Mac平台)

用rust写了一个json小工具“JSON PICKER”,欢迎大家试用:https://github.com/davelet/json-picker/releases/tag/V0.2动机是平常开发的时候,经常遇到大段json,里面的很多字段是不需要的。我所在的项目组在接口对接上出现了reponse达到数兆字节的情况市面上已经有不少json工…