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,…
任意门: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…
之前看了好几次都没什么思路,今天下定决心把这题切了. 观察到$0-x$的gcd最多变化log次,因为它每次变化一定至少要去掉一个质因子,所以我们可以枚举gcd. 因为数据范围比较小,所以想到了分块. 设T为块的大小. 维护块首到块里每个位置的gcd和xor,再把xor排序. 修改的时候暴力改就行,复杂度$TlogT$. 询问的时候如果gcd在这个块里变化了,就把这个块暴力扫一遍,否则说明gcd在这个块里不变,相当于在区间里查是否有某个特定的值,随便二分一下,复杂度$T log inf+\frac…
[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) 代表…
先发掘性质: 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]公约数数列(分块) 题面 BZOJ 洛谷 题解 看一道题目就不会做系列 首先\(gcd\)最多只会有\(log\)种取值,所以我们可以暴力枚举出所有可能的\(gcd\). 那么我们现在按照步骤要解决两个问题.第一个是怎么动态维护\(gcd\)的取值,第二个是怎么动态维护异或和. 我们考虑分块. 只维护块内的前缀\(gcd\)和前缀异或和,这样子每次修改只需要暴力重构块. 每次询问的时候如果块内的\(gcd\)不变,那么二分答案,找找有没有满足条件的异或和.…
前缀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…
-by luogu 不会啊.... 然后%了一发题解, 关键是 考虑序列{$a_n$}的前缀gcd序列, 它是单调不升的,且最多只会改变$log_2N$次,因为每变一次至少除2 于是,当我们询问x时: 对每一段满足前缀gcd不变的部分: 可以用map之类的直接查询这个区间中前缀xor值等于$x\over gcd$的最小下标: 但我们还有单点修改, 考虑分块,——随便分个根号块就好 对每块 维护块从左端到右端元素的xor和, 维护块中左端到右端元素的gcd值, 对每个元素 维护从他所在块的左端点到…
不错的分块题 gcd和xor其实并没有联系 这里,xor的按位性质没有半点卵用 gcd的性质却很关键: 一个数组,前缀gcd最多logn个不同的 gcd不太多,(暴力的基础) 所有考虑分块. 分块,每个块维护:每个点的块内前缀gcd,块内前缀xor,每个块保存前缀所有块的gcd 修改暴力修改涉及到的信息 查询,挨个找块,lasgcd前面几个块的gcd,lasxor前面几个块的xor, 如果i块的前缀gcd==lasgcd,说明整个块内的gcd都是lasgcd.有nd=X/lasgcd^lasxo…
看样子分块题应该做的还不够. 题目描述 设计一个数据结构. 给定一个正整数数列 \(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\). 其中…
题意 题目链接 分析 首先明确 \(xor\) 运算和 \(\rm gcd\) 没有联系! 注意到一个数字取 \(\rm gcd\) 且保证每次取 \(\rm gcd\) 值都会变小的话,最多取 \(\log\) 次. 比较显然,如果每次都变小的话至少都除以了因子 \(2\) ,变为原来的二分之一. 所以考虑一个暴力分块,记录每一块的 \(\rm gcd\) G[i].异或和X[i].前缀异或和. 如果 \({\rm gcd}(lastgcd,G[i])=lastgcd\) ,那么直接在该块记录…
4028: [HEOI2015]公约数数列 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 865  Solved: 311[Submit][Status][Discuss] Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. MODIFY id x: 将 a_{id} 修改为 x. 2. QUERY x: 求最小的整数 p (0 <= p < n),使…
zrt当年是怎么想到的--. 思路: 考虑把序列分块 对于每块 存xor[i] 表示从本块开头到i的前缀异或和 把它扔进set里 存gcd[i]表示从本块开头到i的前缀gcd. 如果这一块的GCD和整个的gcd的gcd是一样的 从set里找ans 否则暴力.. GCD最多log种 所以是复杂度是O(nsqrt(n)logn)的 //By SiriusRen #include <cmath> #include <set> #include <cstdio> #includ…
题面: 传送门 有洛谷就尽量放洛谷链接呗,界面友好一点 思路: 和HDU1695比较像,但是这一回有50000组数据,直接莫比乌斯反演慢慢加的话会T 先解决一个前置问题:怎么处理a,c不是1的情况? 很简单,容斥原理搞之 我们设f(x,y)代表gcd(i,j)==e(1<=i<=x,1<=j<=y)的无序数对(i,j)的个数 那么本题答案相当于f(d,b)-f(c-1,b)-f(a-1,d)+f(a-1,c-1) 再来看反演超时的问题 我们注意到原反演过程中,f(1)==mu(i)…
题意:去除数列中的一个数字,使去除后数列中所有数字的gcd尽可能大. 分析:这个题所谓的Coprime Sequence,就是个例子而已嘛,题目中没有任何语句说明给定的数列所有数字gcd一定为1→_→,队友这样解读题目导致我们队的思路完全想歪了,当时真的脑子发懵,为啥没再读一遍题= = 1.求出一个数列的gcd跟计算顺序没关系. 2.如果求去掉下标为i的数字后整个数列的gcd,直接将该数字前的所有数字的gcd(prefix[i-1])和该数字后所有数字的gcd(suffix[i+1])再求一下g…
Portals 分块需注意的问题 数组大小应为,因为最后一个块可能会超出的范围. 当操作的区间在一个块内时,要特判成暴力修改. 要清楚什么时候应该+tag[t] 数列分块入门 1 给出一个长为的数列,以及个操作,操作涉及区间加法,单点查值. //数列分块入门 1 #include <cstdio> #include <cmath> inline char gc() { static char now[1<<16],*S,*T; if(S==T) {T=(S=now)+f…
闲话 莫队算法似乎还是需要一点分块思想的......于是我就先来搞分块啦! 膜拜hzwer学长神犇%%%Orz 这九道题,每一道都堪称经典,强力打Call!点这里进入 算法简述 每一次考试被炸得体无完肤之后,又听到讲题目的Dalao们爆出一句 数据不大,用分块暴力搞一下就AC了 的时候,我就会五体投地,不得翻身...... 分块?暴力?真的有如此玄学? 直到现在我还是觉得它很笨拙,但要熟练运用(尤其是打大暴力部分分的时候),绝非易事. 没错,分块是优化的暴力,更轻松地资瓷在线,是一种算法思想,主…
题目链接:https://loj.ac/problem/6278 题目大意:中文题目 具体思路:数列分块模板题,对于更新的时候,我们通过一个辅助数组来进行,对于原始的数组,我们只是用来加减,然后这个辅助数组的作用就是对每一块进行排序,当查询的时候,如果不是整块的,我们直接通过a数组来记录,对于整块的,我们直接通过排序的辅助数组进行二分查找就可以了. 注意每一次更新,除了整块的,我们都需要进行对b数组这一整块的重新赋值,因为只是部分赋值的话,b数组已经排序了,这样的话数组的下标对应的数就已经改变了…
数列分块是莫队分块的前置技能,练习一下 1.loj6277 给出一个长为n的数列,以及n个操作,操作涉及区间加法,单点查值. 直接分块+tag即可 #include <bits/stdc++.h> #define ll long long #define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) #define pp pair<int,int> #define rep(ii,a,b) for(int ii=a;ii&…
Preface 最后一题我一直觉得用莫队是最好的. 数列分块入门 7--区间乘法,区间加法,单点询问 还是很简单的吧,比起数列分块入门 7就多了个区间乘. 类似于线段树,由于乘法的优先级高于加法,因此我们先乘后加. 具体的,我们对于每一个块再额外维护一个乘法标记,每次乘法时同时更新乘法/加法标记. CODE #include<cstdio> #include<cctype> #include<cmath> #include<algorithm> using…
Preface 个人感觉这中间的三题是最水的没有之一 数列分块入门 4--区间加法,区间求和 这个也是很多数据结构完爆的题目线段树入门题,但是练分块我们就要写吗 修改还是与之前类似,只不过我们要维护每一块内元素的和,注意这个要实时更新 这样就可以轻松水过了. CODE #include<cstdio> #include<cctype> #include<cmath> using namespace std; const int N=50005,BLO=250; int…
Preface 分块,一个神奇的暴力算法.可以把很多\(O(n^2)\)的数据结构题的暴力优化到常数极小的\(O(n\sqrt n)\).当一些毒瘤题无法用线段树,主席树,平衡树,树状数组......等\(O(n\ logn)\)方法写出时当然在你不会写这些算法的时候用大力分块骗分是再好不过的方法了! 当然分块的大致思想比较简单,我们看一下: /Here is Pic 1 但是由于分块在实际应用中有不同的方法,所以让我们来找各种各样的板子题来练练手吧. 数列分块入门 1--区间加法,单点查值 这…
昨天对着代码看了一晚上 然后今天终于在loj上过了 数列分块入门9题撒花★,°:.☆( ̄▽ ̄)/$:.°★ . 然后相当玄学 块的大小调成\(\sqrt{n}\)会TLE,改成150就过了 啧 然后就是用map离散化之后的值不能直接比较大小 锅锅锅 #include <cstdio> #include <algorithm> #include <cstring> #include <vector> #include <map> #include…
#6277. 数列分块入门 1 内存限制:256 MiB时间限制:100 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计讨论 3 测试数据 题目描述 给出一个长为 n 的数列,以及 n 个操作,操作涉及区间加法,单点查值. 输入格式 第一行输入一个数字 n. 第二行输入 n 个数字,第 i 个数字为 ai,以空格隔开. 接下来输入 n 行询问,每行输入四个数字 opt.l.r.c,以空格隔开. 若 opt=0,表示将位于 [l,r]的之间的数字都加 c…
#6285. 数列分块入门 9 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给出一个长为 nn 的数列,以及 nn 个操作,操作涉及询问区间的最小众数. 输入格式 第一行输入一个数字 nn. 第二行输入 nn 个数字,第 ii 个数字为 a_iai​,以空格隔开. 接下来输入 nn 行询问,每行输入两个数字 ll.rr,以空格隔开. 表示查询位于 [l,r][l,r] 的数字…
#6284. 数列分块入门 8 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给出一个长为 nn 的数列,以及 nn 个操作,操作涉及区间询问等于一个数 cc 的元素,并将这个区间的所有元素改为 cc. 输入格式 第一行输入一个数字 nn. 第二行输入 nn 个数字,第 i 个数字为 a_iai​,以空格隔开. 接下来输入 nn 行询问,每行输入三个数字 ll.rr.cc,以空格…
#6283. 数列分块入门 7 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给出一个长为 nn 的数列,以及 nn 个操作,操作涉及区间乘法,区间加法,单点询问. 输入格式 第一行输入一个数字 nn. 第二行输入 nn 个数字,第 ii 个数字为 a_iai​,以空格隔开. 接下来输入 nn 行询问,每行输入四个数字 \mathrm{opt}opt.ll.rr.cc,以空格隔开…
#6282. 数列分块入门 6 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 1   题目描述 给出一个长为 nn 的数列,以及 nn 个操作,操作涉及单点插入,单点询问,数据随机生成. 输入格式 第一行输入一个数字 nn. 第二行输入 nn 个数字,第 ii 个数字为 a_iai​,以空格隔开. 接下来输入 nn 行询问,每行输入四个数字 \mathrm{opt}opt.ll.rr.cc,以空格…
#6281. 数列分块入门 5 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 5   题目描述 给出一个长为 nn 的数列 a_1\ldots a_na1​…an​,以及 nn 个操作,操作涉及区间开方,区间求和. 输入格式 第一行输入一个数字 nn. 第二行输入 nn 个数字,第 ii 个数字为 a_iai​,以空格隔开. 接下来输入 nn 行询问,每行输入四个数字 \mathrm{opt},…