HDU - 5869 Different GCD Subarray Query(树状数组或线段树+rmq)

hdu 5869 - 树状数组 + 离线 + 离散(扩展) 解题思路:首先这题a[i]值最大1e6所以可以不用考虑离散化,但是为了方便数据扩大我强行再加了一个log(n)复杂度进行数据离散化。所以现在的复杂度应该是nlog(n)*log(n),不离散的话一个log(n)就可以了。vec[i]数组保存保存区间右界为i的所有gcd情况和该gcd最后出现的位置,那么从i位置一直向左扫gcd肯定是会越来越小的或者不变,变小的话最少变小2倍,所以一个前缀gcd个数不... 阅读详情

题目:给你一组数, 然后是m个查询. 问[l,r]中所有连续区间共有多少不同的GCD

思路:每个数往两边扩找不同的gcd,最多能找log个,gcd就会变成1。一开始想的是rmq处理出以每个数为起点往左往右扩展开的首次出现与上一次不同的gcd位置,然后离线用莫队来搞,时间复杂度很高,当时没有想到别的思路,然后敲完后一直re.....

事实上这个题应该是线段树或者树状数组,很套路的一个做法。把查询根据右端点排序。然后不断更新最后能产生gcd的最左边的位置,pos往后走,查询答案。

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define pb push_back
const int maxn=2e5+10;
int a[maxn],n,m;
int g[maxn][22],mm[maxn];
void initRMQ()
{
    mm[0]=-1;
    for(int i=1;i<=n;i++)
    {
        mm[i]=((i&(i-1))==0)?mm[i-1]+1:mm[i-1];
        g[i][0]=a[i];
    }
    for(int j=1;j<=mm[n];j++)
    {
        for(int i=1;i+(1<<j)-1<=n;i++)
            g[i][j]=__gcd(g[i][j-1],g[i+(1<<(j-1))][j-1]);
    }
}
int rmq_gcd(int l,int r)
{
    int k=mm[r-l+1];
    return __gcd(g[l][k],g[r-(1<<k)+1][k]);
}
struct node{
    int l,r,id;
}s[maxn];
bool cmp(const node &x,const node &y)
{
    if(x.r==y.r)
    return x.l<y.l;
    return x.r<y.r;
}
const int N=1e6;
int c[N+10],book[N+10];
void update(int pos,int val)
{
    for(int i=pos;i<=N;i+=i&-i)
        c[i]+=val;
}
int query(int pos)
{
    int ans=0;
    for(int i=pos;i>0;i-=i&-i)
        ans+=c[i];
    return ans;
}
int ans[maxn];
int main()
{
    //freopen("in.txt","r",stdin);
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);

        initRMQ();

        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&s[i].l,&s[i].r);
            s[i].id=i;
        }
        sort(s+1,s+m+1,cmp);

        for(int i=1;i<=N;i++)
            c[i]=book[i]=0;
        int pos=1;
        for(int i=1;i<=n;i++)
        {
            int gc=0,kt=i;
            while(gc!=1&&kt>=1)
            {
                int mid,k,l=1,r=kt;
                while(l<=r)
                {
                    mid=(l+r)>>1;
                    if(rmq_gcd(mid,i)!=gc)
                    {
                        k=mid;
                        l=mid+1;
                    }
                    else r=mid-1;
                }
                gc=rmq_gcd(k,i);
                if(!book[gc])
                {
                    update(k,1);
                    book[gc]=k;
                }
                else
                if(book[gc]<k)
                {
                    update(book[gc],-1);
                    update(k,1);
                    book[gc]=k;
                }
                kt=k-1;
            }
            while(pos<=m&&s[pos].r==i)
            {
                ans[s[pos].id]=query(s[pos].r)-query(s[pos].l-1);
                pos++;
            }
        }
        for(int i=1;i<=m;i++)
            printf("%d\n",ans[i]);
    }
    return 0;
}

 

【PADS-开发指南】 馒头破戒大师 阅读详情

相关推荐

基于51单片机的简易计算器设计(原理图+仿真+源代码+参考论文)

本设计以51单片机为核心,矩阵键盘输入数字,通过1602显示屏显示计算结果,能够实现整数的加、减、乘、除四则运算,具备清除功能。

u012759563的博客 7699

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...

weixin_45948204的博客 756

方差迭代计算公式

方差迭代计算过程推导术语约定递推公式过程推导 术语约定 (1)En=1n∑i=1nxi E_n =\frac{1}{n} \sum_{i=1}^{n}x_i \tag{1} En​=n1​i=1∑n​xi​(1) (2)F(n)=∑i=1n(x2−En) F(n) = \sum_{i=1}^{n}{(x^2-E_n)} \tag{2} F(n)=i=1∑n​(x2−En​)(2) (3)V(n)...

weixin_44479136的博客 7921

【HDU 5869】Different GCD Subarray Query【区间不同 gcd 个数】

题意: 给出 nnn 个数字,一共 qqq 次查询,每次询问一个 lll、rrr,查询区间 [l,r][l,r][l,r] 中有多少个不同的 gcdgcdgcd,其中一个子区间代表一个 gcdgcdgcd。(1≤n,q≤105,1≤ai≤106)(1\leq n,q\leq 10^5,1\leq a_i\leq 10^6)(1≤n,q≤105,1≤ai​≤106) 思路: 区间查询不同 gcdg...

lucius-liu.cn 1892

深入理解HanLP1.x,填平可能遇到的坑

提取指定数量的摘要。自定义词典为什么要单独领出来讲呢?因为在我们的业务开发中,可能分词的效果并不理想,需要定制自己的词库,索引更加常用。例如:小米su7特斯拉modelY比亚042025款6575767670908我们需要分出小米su72025款等词。我们分别看看用字典和不用字典的效果。

static_coder的博客 977

plc secs半导体通讯协议 PLC 与MES的SECS/GEM通讯方案

符合SEMI E4, E5, E30, E37 的 SECS/GEM通讯方案 专业稳定的产品,持续运行5年都不出错 遵循 SEMI 人机交互设计,提供触摸屏支持让你触手可及。 毫米级的响应,单个messge在5ms以内 MES与PLC之间达到实时性,如采集实时性的数据 每秒支持100条Message以上 快速搭建PLC与MES之间的SECS/GEM桥梁,只需简单配置数据 SECS/GEM介绍 遵循 SEMI 人机交互设计,提供触摸屏支持让你触手可及。 增删改上报数据配置简单,并且一目了然 大量的数据处理.

SECS/GEM 6362

[hdu5869]离线思想统计区间元素数量

This is a simple problem. The teacher gives Bob a list of problems about GCD (Greatest Common Divisor). After studying some of them, Bob thinks that GCD is so interesting.

aaron_1996的专栏 774

【YOLOs-CPP-图像分类部署】04-项目优化(加速部署)

本文详细介绍了将YOLO图像分类C++部署项目从CMake迁移到Visual Studio控制台应用的全过程。针对低配CPU性能瓶颈问题,作者通过替换多线程HPP代码为官方实现,并采用448x448固定输入尺寸优化推理速度。项目配置包含OpenCV和ONNX Runtime环境设置,实现了图像批量处理、分类结果显示及结果日志输出功能。关键步骤包括依赖库配置、DLL部署和代码调试,最终在Windows平台成功实现高效CPU推理。该方案显著提升了低配硬件的兼容性,为图像分类任务提供了稳定的部署解决方案。

深耕CV 354

HDU 5869 Different GCD Subarray Query(计数区间不同GCD)

题意:给出一个序列,m次询问,每次询问某个闭区间内所有的子区间组成的不同GCD有多少个对于一个长度为n的序列来说,组成的不同GCD值不会超过n*logn个,所对应的区间也是如此,预处理出每个下标对应的所有不同gcd区间,右端点排序,对询问离线处理,右端点排序,通过树状数组计数不同的gcd值得到答案#include<cstring> #include<string> #include<iostream

每一次AC都是一种感动 635

请尽可能地详细说明一个VLA项目的立项训练到落地的全流程

一个机器人VLA项目的全流程是一个复杂的系统工程,它深度融合了机器人学 (Robotics)计算机视觉 (CV)和自然语言处理 (NLP)。其核心挑战在于高质量数据的获取和从仿真到现实的有效迁移。与纯粹的软件AI项目相比,它增加了硬件、物理交互和安全性的维度,但其最终能让AI走出虚拟世界、在物理世界中产生实际价值,这也是其巨大的魅力所在。

具身机器人和通用AI 303

湿式双离合器自动变速器simulink建模与仿真

随着汽车工业的不断发展,自动变速器在提高汽车性能、驾驶舒适性和燃油经济性等方面发挥着越来越重要的作用。湿式双离合器自动变速器(Wet Dual-Clutch Transmission,简称 WDCT)作为一种先进的自动变速器技术,具有换挡速度快、动力传递平稳、燃油经济性好等优点,被广泛应用于各类汽车中。结构组成湿式双离合器自动变速器主要由双离合器、齿轮传动系统、液压控制系统和电子控制系统等部分组成。双离合器:由两个独立的离合器组成,分别控制奇数挡和偶数挡。通过切换两个离合器的工作状态,可以实现快速换挡。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 348

HDU 5869 Different GCD Subarray Query(离线处理+树状数组)

题目分析 题意我就不说了,不过可以发现题意简单的题目并没有几道能做出来的。 这题首先可以枚举每一个右端点,我们会发现我们直接可以利用前一个端点求出来的所有gcd,就是gcd(a,b,c)=gcd(gcd(a,b),c)gcd(a,b,c) = gcd(gcd(a, b), c)的思想,又因为一个数的gcd个数其实最多就是这个数的约数个数,其实并不大,分解质因数之后很容易发现。这样我们预处理

你真的介意真的在乎真的想要真的渴望的话你一定能够做到 454

《AI编程实战:深度学习模型改进与系统部署》,改进专栏目录和介绍

专深度学习相关项目都写在本专栏,《一次订阅解锁全部,都有源码,永久观看》,包括车牌识别、股票预测、人脸识别、风格迁移、图像修复、图像超分辨重建、图像分割等任务,Web/PyQt系统实现。引入Transformer、Swin Transformer、DenseNet、ViT、ConvNeXt等算法实战,提供卷积改进,魔改对比实验,模型剪枝,模型蒸馏,模型量化,全网独家整合改进专栏,为不同领域的同学发表论文提供了大力支持。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 3269

HDU 5869 Different GCD Subarray Query rmq+离线+数状数组

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5869 Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others)Memory Limit: 65536/65536 K (Java/Others) 问题描述 This is a simple problem. The te...

weixin_30922589的博客 137

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

HDU5869 Different GCD Subarray Query(线段树&&离线处理)

题目: http://acm.split.hdu.edu.cn/showproblem.php?pid=5869 题意: 找区间内所有子串GCD的个数 思路: 线段树离线搞搞,区间GCD收敛的很快,所以直接暴力预处理出到每个数字截至的后缀串有哪些GCD以及它们的位置,就是每个数字向前看有哪些GCD出现,这个数量是很少的。扫一遍然后离线询问,对于每个询问按照右端点排序。找到每个位置的时

MyWorld 1968

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

Fsss 1534

HDU 5869 Different GCD Subarray Query (数学gcd+树状数组离线查询)

精彩精彩真精彩!理解了题解的解法之后,本弱鸡不禁大拍大腿,直呼精彩。这题碰到的东西很多都是第一次见,学到了。 1、首先就是查询竟然还能保存下来排序后再查(传说中的离线查询? 2、遍历所有右端点(可能查询中有这个右端点,也可能没有),重心放在处理左端点上,好像右端点是来嵌套一样。 这种查询的方法以前没见过,今天学到了。 具体在这题里: 1、预处理出每个 i 和它前面的数会产生的gc

卡尔 1480

HDU - 5869 Different GCD Subarray Query

This is a simple problem. The teacher gives Bob a list of problems about GCD (Greatest Common Divisor). After studying some of them, Bob thinks that GCD is so interesting. One day, he comes up with a ...

还我笑颜 415

hdu5726 && hdu5869

hdu5726 GCD 题意:n个数,q次询问,每次询问给出(l,r),问区间的gcd,并且有多少个区间和这个区间gcd相同 题解:求区间啊gcd比较简单,直接线段树就可以,怎么求有多少个区间呢?             假设知道了处理到上一位的gcd都有哪些,那么通过上一位的gcd,就可以求出到本位的所有的gcd             性质,n个数,所有数可能组成的gcd,有大概log

matrix5267的博客 492

HDU 5869 (离线+树状数组)

ProblemDifferent GCD Subarray Query 题目大意   给定n个数的序列,有q个询问,每次询问一个区间中所有子区间所形成不同的gcd的数量。 解题分析   由于固定一个数为右端点,所能形成的gcd共有logn,所以可以预处理出每个数为右端点所能形成的gcd,相同gcd取左端点靠右的。   然后将询问离线,按照r从小到大排序。处理gcd重复的方法是...

aekijekzn484879763的博客 271

hdu 5869 (求区间不同gcd的个数)

  Different GCD Subarray Query   Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 999    Accepted Submission(s): 381     Problem Descripti...

lxkyes的博客 1514

hdu 5869 Different GCD Subarray Query(gcd+树状数组)

Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 114    Accepted Submission(s): 29 Problem Description Th

saber_acher的博客 2023

hdu 5869 Different GCD Subarray Query 预处理 + 离线

// hdu 5869 Different GCD Subarray Query 预处理 + 离线 // // 题目链接: // // http://acm.split.hdu.edu.cn/showproblem.php?pid=5869 // // 题目大意: // // 给定数组,求[L,R]段中所有子段的不同gcd的种类 // // 解题思路: // //

TIMELIMITE的专栏 1008

HDU5869 树状数组

Problem DescriptionThis is a simple problem. The teacher gives Bob a list of problems about GCD (Greatest Common Divisor). After studying some of them, Bob thinks that GCD is so interesting. One day, h

NineFailure的博客 519

hdu5869 Different GCD Subarray Query(rmq+树状数组+gcd)

题目链接:点这里!!! 题意: 给你n个数,q个询问,对于每个询问[l,r]问你[l,r]里面所有子集构成多少种不同的gcd?l1 数据范围:n,q 题解: 比赛的时候傻逼了,用莫队去做,结果各种超时。。 赛后看了题解想了一下,发现其实用用树状数组就可以了,傻逼了。。 这道题我们对所有询问按右端点排序,然后离线来处理! 我们发现固定右端点向左gcd,最多有2

Zsss的博客 554

HDU - 5869 Different GCD Subarray Query —— 线段树 离线处理

题意: 问区间L到R之间所有连续子序列的gcd共有多少种 思路: 和离线处理求区间不同的数的个数类似,先预处理出每个点向左的每个区间可以得到的gcd和最靠右的左端点,要注意的是从一个位置开始不断向左求gcd是一个值不断递减的过程(求的gcd次数越多,得到的结果就越小),所以如果有相同的值一定会连续出现,且第一次出现的一定是最靠右的。 预处理之后,将询问离线排序,用map维护每个gcd现在所...

Lngxling的博客 349

HDU 5869 区间不同GCD的个数

GCD的预处理 区间GCD的种类数肯定小于LogN(每次增一个数 产生新的GCD必定小于原来GCD的1/2或者不增加) 类似HDU 3333的插入修改离线法#include #define N 101000 #define FREI freopen("in.txt","r",stdin) #define FREO freopen("out.txt","w",stdout) #define M

AAAAAAAAAAAAAAC 603
上一篇: codeforces 1028E Restore Array(构造)
下一篇: HDU - 5868 Different Circle Permutation (Polya定理+欧拉函数优化+矩阵快速幂)
GoLakerswxy
博客等级 码龄9年 41粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值