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;
}

 

Windows防火墙服务异常修复指南:0x80070422与0x6D9报错实战处理 本文针对Windows防火墙服务异常导致的0x80070422与0x6D9报错,提供了从基础到进阶的实战修复指南。核心是通过services.msc服务管理器检查并修复Windows Firewall服务,包括设置启动类型、检查依赖服务等关键步骤。同时介绍了当基础方法失效时,如何使用命令行工具、系统文件检查器(SFC/DISM)以及排查组策略与第三方软件冲突等深度解决方案,帮助用户彻底解决防火墙服务无法启动或访问的问题。 阅读详情

相关推荐

别再到处找模板了!手把手教你用Vue3+Element Plus搭建一个‘能跑起来’的管理后台原型

本文详细介绍了如何利用Vue3和Element Plus在72小时内快速搭建一个功能完整的管理后台原型。从环境准备到项目获取、依赖安装、原型定制、数据模拟以及构建优化,手把手教你打造一个可直接演示的后台系统,特别适合创业者快速验证产品逻辑。

weixin_26854555的博客 182

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

WS2812B非标准通信协议:手把手实现精准时序控制

详解WS2812B的精准时序实现原理,剖析其非标准通信协议的关键细节。通过实际操作指导,帮助开发者稳定驱动ws2812b灯带,解决常见时序偏差问题,提升项目显示效果与响应一致性。

weixin_42584586的博客 587

【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

别再手动拆解字节了!用博图这个功能指令,5分钟搞定ARRAY转BOOL数组

本文详细介绍了西门子博图中`ARRAY_TO_BOOL`功能指令的高效应用,帮助工程师快速实现ARRAY到BOOL数组的转换。通过实战案例和参数配置指南,展示了如何5分钟内完成传统方法需半小时的任务,大幅提升PLC编程效率,特别适用于通信报文解析和设备状态监控。

weixin_42653691的博客 263

双向晶闸管交流调压基础知识及Multisim电路仿真

本文介绍了双向晶闸管交流调压电路的工作原理及应用。该电路由双向晶闸管、RC移相电路和双向触发二极管组成,通过调节电位器改变触发角实现电压调节。当电位器阻值减小时,触发角减小,输出电压升高;阻值增大时,触发角增大,输出电压降低。Multisim仿真展示了不同电位器档位下的波形特征:0%档位时全导通,50%档位时半导通,100%档位时基本关断。该电路结构简单、调节平滑,广泛应用于调光、调速等场合,但会产生谐波干扰。

XU157303764的博客 838

[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

光学仿真案例(1) 铌酸锂非线性波导仿真模拟 FDTD仿真

在过去几年里,许多集成光子学应用往往需要多个相干可调谐光源,而且从外部激光器引入额外的光输入增加了芯片封装的复杂性,如果使用基于III-V族、氮化硅(SiN)或铌酸锂(LNO)的集成光源又大大增加了制造复杂性和成本。然而,通过非线性谐波相互作用产生的光源不需要额外的制造工艺来产生增益、反馈和外部电路,即可支持许多应用。在下面的案例中,演示了一种基于Luo[1]的铌酸锂波导频率转换集成系统。该案例主要仿真了利用温度调制实现高效相位匹配的铌酸锂纳米光子波导的二次谐波产生。

q895235273的博客 4145

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

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

每一次AC都是一种感动 635

【故障排查】telnet连接失败:端口23不可达的深度分析与解决方案

本文深度解析telnet连接失败时端口23不可达的常见原因与解决方案。从快速自查目标地址、端口到服务端排查,涵盖服务状态检查、防火墙配置及安全组设置,并提供进阶诊断工具与抓包分析方法。文章强调telnet协议的安全风险,建议在生产环境中改用SSH等加密协议进行远程管理。

weixin_28323057的博客 395

构建个体结构脑网络的另一种方法

这篇文献提出了一种构建个体结构脑网络的方法即Morphometric INverse Divergence (MIND),通过T1像数据即可对每个被试构建一个脑网络,且通过多个特征进行构建而非单一的特征。即可获得由4个特征得到的个体结构网络矩阵,可以根据自己的需求采用不同的特征组合得到网络矩阵,也可以结合T1/T2像得到髓鞘化相关的网络矩阵,后续可修改代码批量处理自己的数据。这是文献贴出来的代码。在终端直接克隆到本地。2.修改路径运行代码。

weixin_52073820的博客 823

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

OpenHarmony之Histreamer引擎深度解析:pipeline_core架构如何全面取代GStreamer,一统音视频播放与录制

Histreamer是OpenHarmony多媒体框架的核心媒体引擎,采用架构设计。一个轻量级的媒体引擎组件,提供播放、录制等场景的媒体数据流水线处理。1.播放场景分为如下几个节点:数据源读取、解封装、解码、输出;2.录制场景分为如下几个节点:数据源读取、编码、封装、输出。该引擎从OH5.0开始取代了原有的媒体引擎gstreamer(部分文档还保留较老架构的讲解),提供统一的音视频播放、录制、元数据解析等能力。

m0_67505153的博客 332

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

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

MyWorld 1968

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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
上一篇: 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、付费专栏及课程。

余额充值