给定一个序列,支持查询区间中等于gcd的数字有多少个,输出len−numlen−num。 n≤105n≤105 思路 一个区间等于gcd的数字个数取决于两个子区间的数字个数。判断即可 代码 #include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10; int a[N]; int n,m; struct node { int l,r;...
[1,1]的子区间只有[1,1],其gcd为30[1,5]的子区间有:[1,1]=30,[1,2]=30,[1,3]=10,[1,4]=10,[1,5]=10[2,2]=60,[2,3]=20,[2,4]=20,[2,5]=20[3,3]=20,[3,4]=20,[3,5]=20[4,4]=20,[4,5]=20[5,5]=20总共330[2,4]的子区间有:[2,2]=60,[2,3]=20,[2...
首先,区间 收敛到 的时间是 ,那么用维护区间内不同数字的数目的思路解决。 预处理所有右端点的 集合 枚举右端点,加入右端点 集合的贡献;如果在加入某个 值时发现之前出现过,那么就清掉之前的贡献,然后固定右端点区间查询即可。 区间维护随便用一个结构维护即可,树状数组、线段树都行 #include <bits/stdc++.h> ...
从入门的角度来说,线段树能高效地对一个区间内的数进行运算,这种运算可以是加法、乘法、gcd、min、max。这些运算都有一个共同点:满足结合律。从抽象代数的视角看就是:这些运算所在的代数系统构成一个半群。若线段树上的运算构成半群,则可以进行区间运算,不过这种线段树只支持区间修改(需要无效标记、懒标记)、区间查...