先发掘性质: 1.xor和gcd均满足交换律与结合率. 2.前缀gcd最多只有O(log)个. 但并没有什么数据结构能同时利用这两个性质,结合Q=10000,考虑分块. 对每块记录这几个信息: 1.块内所有数的gcd与异或和. 2.将块内所有前缀异或和放入一个数组排序. 查询时从前往后遍历每个块: 1.若当前块不使gcd改变,二分查找是否存在答案. 2.若改变,暴力查找答案. 复杂度(设块大小为S,值域为M): 1.修改复杂度$O(S\log S)$ 2.查询复杂度$O(S\log M+\fra…
[BZOJ4028][HEOI2015]公约数数列 Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. MODIFY id x: 将 a_{id} 修改为 x. 2. QUERY x: 求最小的整数 p (0 <= p < n),使得 gcd(a_0, a_1, ..., a_p) * XOR(a_0, a_1, ..., a_p) = x. 其中 XOR(a_0, a_1, ..., a_p) 代表…
4028: [HEOI2015]公约数数列 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4028 Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: MODIFY id x: 将 a_{id} 修改为 x. QUERY x: 求最小的整数 p (0 <= p < n),使得 gcd(a_0, a_1, ..., a_p) * XOR(a_0,…
前缀gcd的变化次数是log的,考虑对每一种gcd查询,问题变为查询一段区间是否存在异或前缀和=x/gcd. 无修改的话显然可以可持久化trie,但这玩意实在没法支持修改.于是考虑分块. 对于每一块将其中所有块内异或前缀和排序.查询时先看这块与上一块相比gcd有没有变化,如果有对其中每个位置暴力查询,否则在排序后的数组中二分.修改时暴力改每一块的前缀gcd及异或和,被修改的块暴力重构排序数组即可. #include<iostream> #include<cstdio> #inclu…
Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. MODIFY id x: 将 a_{id} 修改为 x. 2. QUERY x: 求最小的整数 p (0 <= p < n),使得 gcd(a_0, a_1, ..., a_p) * XOR(a_0, a_1, ..., a_p) = x. 其中 XOR(a_0, a_1, ..., a_p) 代表 a_0, a_1, ..., a_p 的异或和,g…
题意 题目链接 分析 首先明确 \(xor\) 运算和 \(\rm gcd\) 没有联系! 注意到一个数字取 \(\rm gcd\) 且保证每次取 \(\rm gcd\) 值都会变小的话,最多取 \(\log\) 次. 比较显然,如果每次都变小的话至少都除以了因子 \(2\) ,变为原来的二分之一. 所以考虑一个暴力分块,记录每一块的 \(\rm gcd\) G[i].异或和X[i].前缀异或和. 如果 \({\rm gcd}(lastgcd,G[i])=lastgcd\) ,那么直接在该块记录…
[BZOJ4028][HEOI2015]公约数数列(分块) 题面 BZOJ 洛谷 题解 看一道题目就不会做系列 首先\(gcd\)最多只会有\(log\)种取值,所以我们可以暴力枚举出所有可能的\(gcd\). 那么我们现在按照步骤要解决两个问题.第一个是怎么动态维护\(gcd\)的取值,第二个是怎么动态维护异或和. 我们考虑分块. 只维护块内的前缀\(gcd\)和前缀异或和,这样子每次修改只需要暴力重构块. 每次询问的时候如果块内的\(gcd\)不变,那么二分答案,找找有没有满足条件的异或和.…
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=4028 4028: [HEOI2015]公约数数列 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1177  Solved: 456[Submit][Status][Discuss] Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. MODIFY…
看样子分块题应该做的还不够. 题目描述 设计一个数据结构. 给定一个正整数数列 \(a_0, a_1, \ldots , a_{n-1}\),你需要支持以下两种操作: MODIFY id x: 将 \(a_{\mathrm{id}}\) 修改为 \(x\). QUERY x: 求最小的整数 \(p(0 \leq p < n)\),使得 \(\gcd(a_0, a_1, ..., a_p) \cdot \operatorname{XOR}(a_0, a_1, ..., a_p) = x\). 其中…
-by luogu 不会啊.... 然后%了一发题解, 关键是 考虑序列{$a_n$}的前缀gcd序列, 它是单调不升的,且最多只会改变$log_2N$次,因为每变一次至少除2 于是,当我们询问x时: 对每一段满足前缀gcd不变的部分: 可以用map之类的直接查询这个区间中前缀xor值等于$x\over gcd$的最小下标: 但我们还有单点修改, 考虑分块,——随便分个根号块就好 对每块 维护块从左端到右端元素的xor和, 维护块中左端到右端元素的gcd值, 对每个元素 维护从他所在块的左端点到…