solution 如果只要求区间查询的话,我们的区间gcd就等于每个小区间的gcd的gcd,可以用ST表或者线段树直接维护。 但是这个题多了修改操作,我们就不能直接维护区间gcd了,因为它不支持区间修改,很显然,一个区间的每个数都加上一个数x,那么这个区间的最大公约数显然不一定是x+len。 我们考虑gcd的性质 首先,根据更相减损...
小细节:线段树建树的时候一定要从00开始建树,因为pre[gcd]pre[gcd]是有可能等于00的。 代码: #include<bits/stdc++.h> #define int long long using namespace std; const int maxn=100005; int a[maxn],n,T; struct node { int p,g; }; struct qq { int l,r,id; }q[maxn]; struct t { ...
For each case, you need to output “Case #:t” at the beginning.(with quotes, t means the number of the test case, begin from 1). For each query, you need to output the two numbers in a line. The first number stands for gcd(al,al+1,...,ar) and the second number stands for...
但是我们发现,这样没法查询任意区间。因为消除贡献的计算会导致叶节点发生变化。但是我们发现有一个东西很符合我们想要的效果:固定右端点查询区间,每加入 个右端点就会构成新序列,但与先前的序列有较大重叠。那么显然我们可以用可持久化权值线段树维护这个东西。 在质因数分解的时候,记录质因数幂次最后出现的位置,并判断...
题意:有一个环,有1~N编号,m次操作,将a位置的值改为b,问你这个环当前最小连续和多少(不能全取也不能不取) 思路:用线段树维护一个区间最值连续和.我们设出两个变量Lmin,Rmin,Mmin表示区间左边最小连续和,右边最小连续和,区间最小连续和,显然这可以通过这个方式更新维护. 现在我们已经可以维护一个区间最值...
我们只需要开一棵线段树来维护差分数组gcd 但是我们发现最前边的这个b我们维护的是当前这个点的差分值 所以这就说明我们还需要开一个东西来维护每一个点的值 而且还要支持区间修改(树状数组是一个好东西) 2|0code /* Auther:_Destiny time:2020.5.6 */ #include <bits/stdc++.h> #define ll long long #def...
那我们可以先线段树维护区间差分数组的gcdgcd 再单独维护一个单点值 最后合起来计算一下gcdgcd就可以了 复杂度O(nlog2n)O(nlog2n) #include<bits/stdc++.h>usingnamespacestd;#defineint long longinlineintread(){charch=getchar();intres=0,f=1;while(!isdigit(ch)){if(ch=='-')f=-1;ch=getcha...
【hdu5381】维护区间内所有子区间的gcd之和-线段树 题意:给定n个数,m个询问,每次询问一个区间内所有连续子区间的gcd的和。n,m<=10^5 题解: 这题和之前比赛的一题很像。我们从小到大枚举r,固定右端点枚举左端点,维护的区间最多只有log段。为什么?以为长区间的gcd肯定是短区间gcd的约数,并且要是不同的话...
对于操作2,求的是区间[l,r][l,r]内|ti−ti−1|(l+1)≤i≤j|ti−ti−1|(l+1)≤i≤j的最大值,也就是差分数组的d[i]d[i]的最大值。因子考虑用线段树维护|d[i]||d[i]|的最大值 对于操作3, gcd(tl,tl+1,tl+2,…,tr)=gcd(tl,|tl+1−tl|,…,|tr−tr−1|)gcd(tl,...
1.很显然,假设minmin是区间最小值,maxmax是区间最大值,那么min+k(r−l)=maxmin+k(r−l)=max 2.区间相邻两个数之差的绝对值的gcd=kgcd=k 3.区间没有重复的数 前两个条件 线段树直接维护就好了→_→ 第三个条件: 对于每个权值开个setset,值为位置(离散化标号) ...