//题意:1e5区间查询【l,r】内的所有子区间有多少种不同的gcd值
//思路:离线BIT
//套路:问区间内所有子区间中有多少个数:从右端点小到大处理查询,维护值最近出现的下标
//对每个固定的右端点二分+RMQ维护向左滑动的 lft累计gcd与最右下标 gcd特性:lft大小nlogn
//这样我们离线处理的时候可以暴力遍历lft对每个gcd值转移到最右的位置 (这样保证每个gcd只算一次,而且不会漏解)
//查询是查位置l到r上的数字个数和
//修改是修改gcd值出现的位置
//比如6 3 8 3 3 6 考虑3这个数的位置变化
//查询
//1 2
//4 5
//1 5
//1 6
//查询的右端点为2时,将vis[gcd(a1,a2)=3]初始化到位置2
//查询的右端点为4时,将vis[gcd(a4,a4)=3]转移到位置4
//查询的右端点为5时,将vis[gcd(a4,a5)=3]转移到位置5
//查询的右端点为6时,将vis[gcd(a4,a5)=3]还是位置5
//这样 当右端点为5时我查询4 5,1 5就都不会漏解了(查询1 5 子区间gcd(a1,a2)的贡献放在了子区间gcd(a4,a5)上)
//代码思路:
//A 预处理ST
//B 预处理lft
//C BIT离线处理
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int vis[1000006]; int c[maxn];int n;//手抖写成bool类型
inline int lowbit(int x){return x&(-x);}
inline void add(int x,int d){if(x==0)return; while(x<=n)c[x]+=d,x+=lowbit(x);}
inline int ask(int x){int res=0;while(x)res+=c[x],x-=lowbit(x);return res;}
int dp[maxn][20];int a[maxn];int logg[maxn];
vector<pair<int,int> >lft[maxn];
struct node{int l,r,id;}q[maxn];
bool cmp(node a,node b){return a.r<b.r;}
int res[maxn];
void ST(int n)//区间GCD
{
for(int i=1;i<=n;i++)dp[i][0]=a[i],logg[i]=(int)log2(i);
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
{
int x=dp[i][j-1],y=dp[i+(1<<j-1)][j-1];
dp[i][j]=__gcd(x,y);
}
}
int RMQ(int l,int r)
{
int len=logg[r-l+1];
int x=dp[l][len],y=dp[r-(1<<len)+1][len];
return __gcd(x,y);
}
//二分 找转折点
int sch(int i,int l,int r,int qq)
{
int tem=0;
while(l<=r)
{
int m=l+r>>1;
if(RMQ(m,i)<qq)l=m+1;
else r=m-1,tem=m;
}
return tem;
}
void init(int n)//预处理lft
{
for(int i=1;i<=n;i++)
{
lft[i].clear();
int la=i;int qq=RMQ(i,i);int nxt=qq;
lft[i].push_back(make_pair(i,qq));
while(1)
{
int ans=sch(i,1,la,nxt);
if(ans==1)break;
nxt=RMQ(ans-1,i);
lft[i].push_back(make_pair(ans-1,nxt));
la=ans-1;
}
}
}
int main()
{
int qqq;
while(~scanf("%d %d",&n,&qqq))
{
memset(vis,0,sizeof(vis));memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
ST(n);init(n);
// for(int i=0;i<lft[1].size();i++)printf("%d %d\n",lft[1][i].first,lft[1][i].second);
for(int i=1;i<=qqq;i++)scanf("%d %d",&q[i].l,&q[i].r),q[i].id=i;
sort(q+1,q+1+qqq,cmp);
int r=1;
for(int i=1;i<=qqq;i++)
{
for(;r<=q[i].r;r++)
for(int j=0;j<lft[r].size();j++)
{
int pos=lft[r][j].first,gcd=lft[r][j].second;
//printf("pos=%d %d %d %d\n",r,pos,gcd,vis[gcd]);
if(pos>vis[gcd])
{
add(vis[gcd],-1);
add(pos,1);
vis[gcd]=pos;
//cout<<"???"<<endl;
}
}
//printf("q:%d %d %d %d\n",ask(q[i].r),ask(q[i].l-1),q[i].r,q[i].l);
res[q[i].id]=ask(q[i].r)-ask(q[i].l-1);
}
for(int i=1;i<=qqq;i++)printf("%d\n",res[i]);
}
}相关推荐
UE5.3像素流送Docker化部署:从Linux服务器搭建到云端实时渲染
本文详细介绍了在Linux服务器上使用Docker容器化部署UE5.3像素流送服务的完整流程。通过将虚幻引擎运行时、信令服务器和TURN服务打包为标准化镜像,利用Docker Compose进行编排,实现了云端实时渲染应用的快速部署、环境一致与弹性扩展,有效解决了传统部署中的环境依赖与运维难题。
HDU5869 Different GCD Subarray Query 离线查询/区间贡献
那么用维护区间内不同数字的数目的思路解决。
STM32CubeMX定时器进阶玩法:用编码器模式实现电机转速测量(附避坑清单)
本文详细介绍了如何使用STM32CubeMX配置定时器的编码器模式实现电机转速测量,包括硬件连接、CubeMX配置关键步骤、转速计算算法及常见问题解决方案。特别针对工业控制和机器人开发中的高精度需求,提供了实用的避坑清单和优化技巧,帮助开发者高效完成项目。
HDU 5869 Different GCD Subarray Query (数学gcd+树状数组离线查询)
精彩精彩真精彩!理解了题解的解法之后,本弱鸡不禁大拍大腿,直呼精彩。这题碰到的东西很多都是第一次见,学到了。 1、首先就是查询竟然还能保存下来排序后再查(传说中的离线查询? 2、遍历所有右端点(可能查询中有这个右端点,也可能没有),重心放在处理左端点上,好像右端点是来嵌套一样。 这种查询的方法以前没见过,今天学到了。 具体在这题里: 1、预处理出每个 i 和它前面的数会产生的gc
Transformer-Based Attention Networks for Continuous Pixel-Wise Prediction 基于Transformer注意力网络连续像素级与估计
Transformer-Based Attention Networks for Continuous Pixel-Wise Prediction 基于Transformer注意力网络的连续的像素级的
告别GitHub!手把手教你用Gitblit在Windows 10上搭建私人局域网Git服务器(附SourceTree配置)
本文详细介绍了如何在Windows 10环境下使用Gitblit搭建私有Git服务器,实现局域网内高效代码协作。通过轻量级的Gitblit解决方案,开发者可以享受数据完全自主、离线可用性和局域网高速访问等优势。文章包含从环境准备、安装部署到SourceTree配置的全流程指南,特别适合金融、医疗等敏感行业团队使用。
HDU5869 Different GCD Subarray Query (区间gcd 离线查询 + 线段树/树状数组)
题目链接: Different GCD Subarray Query 大致题意 有一个长度为n的序列, 从1~n编号, 每个位置都有一个元素值. 多次询问, 每次询问[l, r]区间, 在该区间内所有子数组能产生多少种不同的gcd. 解题思路 离线查询 + 树状数组/线段树 首先理解一下题意, 说白了就是每次询问有两层循环, i从l->r, j从i->r, 对于每一个子数组[i, j], 把所有元素求gcd, 放到一个set里. 最后问你set里有多少个元素. (所以读完发现了一个 n3还带lo
VTK四视图联动避坑指南:解决vtkImagePlaneWidget窗宽窗位同步与切片序号更新的那些坑
本文详细解析了VTK四视图联动开发中的关键技术点与常见问题,包括切片位置同步、窗宽窗位同步的实现原理及回调机制设计。针对开发中遇到的回调事件不触发、渲染性能低下等问题,提供了实用的解决方案和优化技巧,帮助开发者高效构建医学影像和科学可视化应用。
HDU-5869 树状数组+离线+预处理
思路讲的很详细的博客 预处理求区间[l,r]的gcd,固定r向左 如[1,3]->[3,3]->[2,3]->[1,2,3]这样才保证了求出了所有的区间内所有的gcd import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io...
gephi生成网络关系图_路网拓扑重建专题 (3) 网络图生成
城市道路网建模在获得基础路网之后,需要考虑道路交通网络的描述与表达问题。网络是将现实世界中的事物及其关系进行适当的抽象,构造成由节点和边按照一定规则组成的形式。一个实体网络可以由有限个“节点”集合与“边”集合构成的图表示,即网络表示为。对于一个由个节点组成的无权复杂网络,该图有邻接矩阵,这里。根据研究对象不同,建模方法主要包括原始法[1]和对偶法[2]两种,见图1,字母a-j为交叉口编号...
EtherCAT主站SOEM -- 0 -- 该EtherCAT主站SOEM专栏后续安排
SOEM(Simple Open EtherCAT Master)是一个开源的EtherCAT主站库,允许开发者构建自定义的EtherCAT主站应用程序。EtherCAT是一种实时以太网通信协议,广泛应用于工业自动化和机器控制领域。开源性质:SOEM是一个开源项目,这意味着开发者可以自由地查看、修改和分发代码。这使其成为工业自动化领域的一个强大工具,可以根据具体需求进行定制。EtherCAT主站实现:SOEM库提供了一个完整的EtherCAT主站实现,允许主站与多个EtherCAT从站设备进行通信。
HDU 5869(Problem 1002)GCD+树状数组
题意:长度n的序列, m个询问区间[L, R], 问区间内的所有子段的不同GCD值有多少种.题解:考虑固定左端点的不同GCD值,只有不超过logA种, 所以事件点只有nlogA个. 那么离散化处理, 按照区间右端点排序从小到大处理询问,用一个树状数组维护每个GCD值的最大左端点位置即可. 复杂度是O(nlogAlogn).这份题解里有两个难点:1、如何快速的离散化处理出固定的左端点的gcd;2
【Python_PySide6学习笔记(二十四)】菜单栏QMenuBar类的基本用法
此篇文章中介绍 PySide6 中 QMenuBar 类的基本用法,包括"创建菜单栏"、"创建一级菜单"、"创建二级菜单"等,会持续更新,有需要的读者可以点赞收藏,也欢迎在评论区进行讨论。
HDU - 5869 Different GCD Subarray Query 树状数组离线处理
传送门:HDU5869 题意:给出一个长度为n的序列和m次询问,每次询问给出l,r,求[l, r]区间内所有子序列不同gcd的个数。 思路:首先明确对于一个序列a[l...r]的所有以a[l]开头的子序列,所能得到的不同gcd的个数最多有log(a[l])个。那么这个题中我们就可以对于每一个位置,预处理出以该位置为结尾的所有不同gcd的最大左边界(即L至少要到这个位置才能在L~R这个区间中能形
visio安装包
Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。
精雕软件(JDpaint) 5.5 绿色版
精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版
HDU 5869 求区间中不同连续序列的gcd的个数(树状数组)
题意: 长度n的序列, m个询问区间[L, R], 问区间内的所有子段的不同GCD值有多少种. 思路: 区间GCD收敛的很快,所以直接暴力预处理出到每个数字截至的后缀串有哪些GCD以及它们的位置,就是每个数字向前看有哪些GCD出现,这个数量是很少的。 1.枚举区间的右坐标,然后枚举出所有的以这个为右坐标为区间左坐标。 2.并求出他们这个连续区间的gcd,去重,(即重复的不再记录) 3.
STM32F407中文手册
STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。
【Kruskal重构树+二维数点(离线BIT)】LOJ2865 IOI2018 狼人(werewolf)
【题目】 原题地址 给定一幅无向图,多次询问从SiS_iSi出发到TiT_iTi,是否存在一条路径Si−&amp;gt;x−&amp;gt;TiS_i-&amp;gt;x-&amp;gt;T_iSi−&gt;x−&gt;Ti,满足Si−&amp;gt;xS_i-&amp;gt;xSi−&gt;x经过的点编号≤x\leq x≤x,x−&a
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
P1972 [SDOI2009]HH的项链(离线&BIT)
P1972 [SDOI2009]HH的项链(离线&BIT) 思路 离线化+BIT,考虑将所有询问区间按rrr从小到大排序,对于某一个区间询问,若出现重复的数,我们只考虑最右边的那一个,因为重复种类只计算一次,这样排序后,正确性是对的,可以手膜几个例子。 时间复杂度:O(nlogn)O(nlogn)O(nlogn) ,BITBITBIT的常数非常小,所以跑起来很快。 code // Problem: P1972 [SDOI2009]HH的项链 // Contest: Luogu // URL: h
hdu5869 Different GCD Subarray Query(rmq+树状数组+gcd)
题目链接:点这里!!! 题意: 给你n个数,q个询问,对于每个询问[l,r]问你[l,r]里面所有子集构成多少种不同的gcd?l1 数据范围:n,q 题解: 比赛的时候傻逼了,用莫队去做,结果各种超时。。 赛后看了题解想了一下,发现其实用用树状数组就可以了,傻逼了。。 这道题我们对所有询问按右端点排序,然后离线来处理! 我们发现固定右端点向左gcd,最多有2
HDU 5869 Different GCD Subarray Query (离线处理 树状数组)
题意:给你一个长度为n的数组,q次询问区间[L, R], 求区间内的所有子段的不同gcd值有多少种. 思路:有个知识:固定一个数为右端点,区间所能形成的gcd最多有logn个。所以可以预处理出每个数为右端点所能形 成的gcd,相同gcd取左端点靠右的。这样对询问的R排序就能离线处理,用树状数组维护即可。 代码: #include using namespace std; c
hdu 5869 Different GCD Subarray Query
线段树
hdu5869Different GCD Subarray Query
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 题意:给定一个a数组,每次询问一个区间[l,r]求这个区间内所有子区间的gcd的种类。 分析:很容易想到,当我们固定右端点时在L减小的情况下gcd是递减的且最多形成loga[i]个不同的gcd,当我们固定右端点时对于不同的gcd有一个最大左端点(即L至少要到这个才能在L~R这个区间中能形成这个g
hdu 5869 区间内不同的GCD数(离线+树状数组)
题目:http://acm.split.hdu.edu.cn/showproblem.php?pid=5869 题意: 给定n个数的序列,有q个询问,每次询问一个区间中所有子区间所形成不同的gcd的数量。 分析: 这个题的本质和HDU 3333是一样的,HDU 3333要求计算区间内不同的数字有几个。 这题稍微变了一下,相当于原来扫描到i的之后是更新a[i]的情况,现在是更新log级
hdu5726 && hdu5869
hdu5726 GCD 题意:n个数,q次询问,每次询问给出(l,r),问区间的gcd,并且有多少个区间和这个区间gcd相同 题解:求区间啊gcd比较简单,直接线段树就可以,怎么求有多少个区间呢? 假设知道了处理到上一位的gcd都有哪些,那么通过上一位的gcd,就可以求出到本位的所有的gcd 性质,n个数,所有数可能组成的gcd,有大概log
HDU5869-Different GCD Subarray Query
Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
HDU 5869 Different GCD Subarray Query 树状数组 + 一些数学背景
http://acm.hdu.edu.cn/showproblem.php?pid=5869 题意:给定一个数组,然后给出若干个询问,询问[L, R]中,有多少个子数组的gcd是不同的。 就是[L, R]中不同区间的gcd值,有多少个是不同的。 给个样例 3 37 7 71 21 33 3 数学背景: 一个数字和若N个数字不断GCD,其结果只有loga[i]种,为什么呢?...
HDU5869 Different GCD Subarray Query(线段树&&离线处理) 2016大连网络赛
题意:给定一个a数组,每次询问一个区间[l,r]求这个区间内所有子区间的gcd的种类数目。 题解 : 对于这个题目我们发现是求一段连续区间不同gcd的个数,一定注意是连续,我们注意到对于连续的区间 gcd 下降的非常快。每次这个数至少除以2,这样的话,这个级别就变成了 logn 级别的处理了。我们就可以预处理出这个数向左有多少个不同的gcd 。这个怎么处理呢 ? 注意到 gcd (a,b,c)
200



被折叠的 条评论
为什么被折叠?



