hdu 4630 查询[L,R]区间内任意两个数的最大公约数

HDU-4630(离线) 题目链接:HDU-4630 题意:1~n的全排列,多次询问区间内,两个数字gcd的最大值 预处理出一个数字的所有因子,如果一个因子出现两次以上说明可能作为答案。 对询问按照右端点排序。 按位置从小到大枚举,枚举该数字的所有因子,如果之前该因子出现过,则在该因子之前的位置处更新值为该因子。 如果要用线段树维护,那直接做就行。 如果要用树状数组维护,树状数组维护的是具有前缀性质的,[l,r][l,r]... 阅读详情

No Pain No Game

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2000    Accepted Submission(s): 851


Problem Description
Life is a game,and you lose it,so you suicide.
But you can not kill yourself before you solve this problem:
Given you a sequence of number a1, a2, ..., an.They are also a permutation of 1...n.
You need to answer some queries,each with the following format:
If we chose two number a,b (shouldn't be the same) from interval [l, r],what is the maximum gcd(a, b)? If there's no way to choose two distinct number(l=r) then the answer is zero.
 

Input
First line contains a number T(T <= 5),denote the number of test cases.
Then follow T test cases.
For each test cases,the first line contains a number n(1 <= n <= 50000).
The second line contains n number a1, a2, ..., an.
The third line contains a number Q(1 <= Q <= 50000) denoting the number of queries.
Then Q lines follows,each lines contains two integer l, r(1 <= l <= r <= n),denote a query.
 

Output
For each test cases,for each query print the answer in one line.

Sample Input

1
10
8 2 4 9 5 7 10 6 1 3
5
2 10
2 4
6 9
1 4
7 10

Sample Output

5
2
2
4
3


/*
hdu 4630 查询[L,R]区间内任意两个数的最大公约数

给你n个数,m个询问,输出区间[l,r]内的任意两个数的最大公约数

对于每一个数而言,对左右都会造成影响,所以我们考虑把查询按r从小到大排序,遇到r则输出结果
像这样的话我们就能只考虑a[i]与 [1,i-1]之间数的关系
因为是求的最大公约数,所以枚举a[i]的因子,如果发现此因子已经出现过,则在此前因子出现的地方赋值
(因为我们是求[l,r]之间的,并不能保证之前因子出现的位置在此之内),然后更新该因子的位置

hhh-2016-04-05 19:55:32
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
#include <vector>
#include <functional>
#define lson (i<<1)
#define rson ((i<<1)|1)
using namespace std;
const int maxn = 5e5+5;
int pos[maxn];
int a[maxn];
int tans[maxn];
struct node
{
    int l,r;
    int Max;
    int mid()
    {
        return (l+r)>>1;
    }
} tree[maxn<<2];

void push_up(int i)
{
    tree[i].Max = max(tree[lson].Max,tree[rson].Max);
}

void build(int i,int l,int r)
{
    tree[i].l = l,tree[i].r = r;
    tree[i].Max=0;
    if(l == r)
        return ;
    int mid = tree[i].mid();
    build(lson,l,mid);
    build(rson,mid+1,r);
    push_up(i);
}

void update(int i,int k,int val)
{
    if(tree[i].l == tree[i].r && tree[i].l == k)
    {
        tree[i].Max =  max(tree[i].Max,val);
        return ;
    }
    int mid = tree[i].mid();
    if(k <= mid)
        update(lson,k,val);
    else
        update(rson,k,val);
    push_up(i);
}

int query(int i,int l,int r)
{
    if(tree[i].l >= l && tree[i].r <= r)
    {
        return tree[i].Max;
    }
    int ans = 0;
    int mid = tree[i].mid();
    if(l <= mid)
        ans = max(ans,query(lson,l,r));
    if(r > mid)
        ans = max(ans,query(rson,l,r));
    return ans;
}

struct qy
{
    int l,r;
    int id;
} qry[maxn];

bool cmp(qy a ,qy b)
{
    return a.r < b.r;
}

int main()
{
    int T;
    int n;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        build(1,1,n);
        memset(pos,-1,sizeof(pos));
        for(int i = 1; i <= n; i++)
            scanf("%d",&a[i]);
        int m;
        scanf("%d",&m);
        for(int i = 1; i <= m; i++)
        {
            scanf("%d%d",&qry[i].l,&qry[i].r);
            qry[i].id = i;
        }
        sort(qry+1,qry+1+m,cmp);

        for(int i = 1,cur = 1; i <= n; i++)
        {

            for(int j = 1; j*j <= a[i]; j++)
            {
                if(a[i]%j == 0)
                {
                    if(pos[j] != -1)
                        update(1,pos[j],j);
                    if(pos[a[i]/j]!= -1)
                        update(1,pos[a[i]/j],a[i]/j);
                    pos[j] = i;
                    pos[a[i]/j] = i;
                }
            }

            while(i == qry[cur].r && cur <= m)
            {
                tans[qry[cur].id] = query(1,qry[cur].l,qry[cur].r);
                cur ++;
            }
        }
        for(int i = 1; i <= m; i++)
        {
            printf("%d\n",tans[i]);
        }
    }
    return 0;
}


VS2022离线安装总闪退?可能是这个--noWeb参数没加对(完整参数指南) 本文深入解析了VS2022离线安装过程中常见的闪退问题,指出核心原因往往在于命令行参数使用不当,特别是`--noWeb`参数。文章提供了完整的参数使用指南和实战解决方案,包括证书处理、安装器文件修复及自动化脚本,帮助用户彻底解决离线部署中的验证失败与闪退难题。 阅读详情

相关推荐

手把手教你用示波器搞定PCIe 5.0 REFCLK时钟信号测量(附完整参数解读)

本文详细介绍了如何使用示波器进行PCIe 5.0 REFCLK时钟信号测量,包括示波器与探头的选择、关键参数的测量方法及解读,以及实战中的常见问题与解决方案。通过手把手教学和完整参数解读,帮助硬件工程师高效完成时钟信号测量,确保系统稳定性。

weixin_28704565的博客 358

HDU4630(树状数组,离线)

题意是给你一个1-n的排列,给q个询问,求每个询问区间里面的最大gcd。 先预处理每一个数的因数。然后按照询问的右区间排序,记录到当前询问为止的最左边界,还有某个因子的最右,次右位置,每次这个因子的位置能更新时都用树状数组维护下。 #include using namespace std; #define maxn 51111 vector fac[maxn]; //每个数的因子 int

morejarphone~ 941

Investigating Bi-Level Optimization for Learning and Vision from a Unified Perspective: A Survey and

文章首先从双层优化的角度统一表示了超参数优化、多任务和元学习等复杂学习和视觉问题,建立了一个基于最佳响应的单层重构和一个统一的算法框架,来制定一个基于梯度的双层优化方法,最后讨论了该框架的潜力和未来研究方向。...

dawnyi_yang的博客 1109

hdu 4630 No Pain No Game

http://acm.hdu.edu.cn/showproblem.php?pid=4630 离散化+树状数组 将数组 *a 从后向前遍历 遍历到 a[x] 的时候 再枚举a[x]的约数 假如 约数 k last[k] 对应到 上一个k出现的位置 那么可被公约数 k 更新的区间是 last[k] --- 最后 把所有a[x]的约数都处理完之后 从 x 到任意 y(y>=x)...

weixin_30681615的博客 129

PaddleOCR 3.x 最新版使用教程(2025)——从安装到实战身份证识别,一步到位!

本文针对PaddleOCR 3.x大版本更新带来的参数变化和兼容性问题,提供从环境配置到实际应用的全流程解决方案。

qq_58607032的博客 9785

别再瞎调了!STM32 Systick延时函数避坑指南(正点原子、野火、慧净代码对比)

本文深入解析STM32 Systick延时函数的实现差异与优化策略,对比正点原子、野火、慧净等主流方案的优缺点。针对us和ms级延时精度问题,提供避坑指南和高级优化技巧,帮助开发者根据项目需求选择最佳方案,提升嵌入式系统的定时控制精度。

weixin_28717807的博客 339

和Leo一起做爱线段树的好孩子之 HDU 4630 No Pain No Game

神仙线段树系列 陈老师的确出的题个个牛皮 首先我们知道如果一个因数在一段区间出现了两次那么这个因数是一个合法的GCD 注意n不是1e5说明可以暴力查找每个因数 然后维护一个当前因数的上一次出现位置 如果出现了那对上一次出现位置来说是合法的 当然这只是左端点 于是对右端点排序 离线处理 #include<iostream>...

dingwufu9301的博客 605

基于Gossip算法的柔性互联自治微网群分布式协调控制策略:复现代码与详细解释

摘要(149字): 本文基于Gossip算法实现了柔性互联微网群(MMG)的分布式协调控制策略仿真。研究构建了包含3个微网、10个分布式电源(DG)的MATLAB/Simulink模型,采用双层控制架构:上层通过柔性交流开关(FAS)实现微网间功率协调,下层利用Gossip算法完成DG间的边际成本一致性控制。重点开发了异步通信的Gossip算法核心函数,实现了分布式电源的自主边际成本估计与功率分配。仿真验证了系统在负荷变化和DG故障等工况下的协调控制能力,结果表明该策略能有效维持微网群的经济运行与功率平衡。

huanghm88的专栏 281

HDU 4630 线段树+离线处理

点击打开链接 题意:给一串数字序列,然后问你L到R中的两个数的最大公约数最大,若相等的两个数则是0 思路:又是一道需要离线处理的题目,昨天写的HDU 3333也是一道这样的题目,建议先写3333在写这个会有帮助,那么对于这个序列我的每一次提问L到R那么最大的是多少,我们可以这样考虑,这区间所有的数的因子的个数大于等于2就可以竞争这个最大的提问,然后选出最大的即可,那么对于R来说,R的所有因子上

Dan__ge的博客 1022

Qt for WebAssembly环境搭建

一、前言 二、Ubuntu 1、在线安装Qt15 在线安装下载器:https://download.qt.io/official_releases/online_installers/ 安装时记得勾选WebAssembly,如下: 2、安装依赖 # Install Python sudo apt-get install python2.7 # Install CMake (optional, only needed for tests and building Binaryen) sudo apt

贝勒里恩的博客 3667

万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文

这篇文章是图像处理的最后一篇文章,后面我们将进入新的章节。图像处理文章主要讲解的图像处理方法包括图像几何运算、图像量化采样、图像点运算、图像形态学处理、图像增强、图像平滑、图像锐化、图像特效、图像分割、傅里叶变换与霍夫变换、图像分类等。个人感觉如果你是编程初学者、Python初学者或图像处理爱好者,这个系列真心适合你学习,并且这篇文章算是Python图像处理的学习路线,希望您喜欢。

杨秀璋的专栏 2万+

HDU - 4630 No Pain No Game 线段树离线操作 求区间内任意两个数的最大公约数

HDU - 4630 No Pain No Game 题意: 有n个数,m个区间询问,每次输出区间内任意两个数的最大公约数。 思路: 线段树离线+点更新+区间查询 我们维护一颗线段树,线段树维护的值是区间内最大的gcd。首先我们预处理所有数字的因子,然后我们将排序过后的区间(按照右端点从小到大排序)从左到右依次处理(为了加强理解,设定k<i<j),每扫描一个值a[i],我...

没有梦想何以远行 504

STM实战开发(13):STM32开发:使用光敏电阻检测光照强度

光敏电阻(LDR)是一种电阻值受光照强度影响的半导体材料。当光照强度增大时,光敏电阻的电阻值降低;而当光照强度减小时,电阻值则增大。光敏电阻的电阻变化与入射光的强度之间并不是线性关系,而是呈对数型的变化。LDR通常由硫化镉(CdS)或其他半导体材料构成,材料对不同波长的光有不同的响应特性。一般而言,光照强度越强,光敏电阻的电阻值越低,反之则越高。本文介绍了如何使用STM32与光敏电阻(LDR)结合,进行光照强度检测的实现方法。通过配置STM32的ADC模块,读取光敏电阻的电压信号,并根据电压计算光照强度。

2201_76125393的博客 3017

HDU 4630 No Pain No Game(线段树离线处理)

题目链接:点击打开链接 题意:给你一个n的全排列, q个操作, 每个操作是一个区间,要求求出这个区间中任意两个数的gcd的最大值。 思路:一个数是两个数的公约数, 等价于一个数可以被两个整数同时整除。   所以我们可以算出每一个数的所有约数, 然后求一个区间中被超过两个数整除的数中的最大值即可。 维护区间最大值, 我们可以用线段树来维护。  因为我们难以同时维护一个区间, 所以我们离线处理,

AC_Arthur的专栏 1193

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

gcd(线段树离线处理)——HDU 4630

gcd(线段树离线处理)——HDU 4630

大田二十 1416

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

hdu4630 or hdu4638 线段树离线查询

这两道题手段挺类似的。

creater_X 995

HDU 4630 No Pain No Game 树状数组+离线查询

思路参考这里。 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 6 using namespace std; 7 8 const int MAXN = ...

aegt43853的博客 148

HDU 4630 No Pain No Game 树状数组

思路:查询一段区间内所有数字的两两最大的公约数。如果将区间内所有的数字的约数列举出来,那么其中出现过两次或以上的约数,最大的就是所求结果了。对查询按L从大到小排序,每次逆序遍历一个数字时,求出它的所有约数,用pos[s]记录约数s上一次出现的位置,那么当更新到现在这个位置的时候,如果pos非空,说明这时出现两次,将上一次的pos[s]更新到区间内,保证在L一定的情况下,查询R时,若L,R中有s,那

BehappyXiang的专栏 835

E - No Pain No Game HDU 4630 线段树

本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。 Life is a game,and you lose it,so you suicide. But you can not kill yourself before you solve this problem: Given you a sequence of number a 1, a 2, …, a n.They are ...

年轻过成了秃顶 189

HDU4630 No Pain No Game

sample: 1 10 8 2 4 9 5 7 10 6 1 3 5 2 10 2 4 6 9 1 4 7 10 意思是: 1表示测试样例有一个 10表示接下来一行有10个数,编号为1-10 5表示接下来的5次询问 每次询问有两个数L R,询问[L,R]区间任意两个数的最大公约数的最大值 解法: 2013多校第三场的题,官方的题解我这渣渣是看不懂了,以下整理总

zhangwei1120112119的专栏 1080

HDU 4630 gcd(线段树离线处理)

No Pain No Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1801    Accepted Submission(s): 770 Problem Description Life is a

Every Master was once a disaster or beginner. 258

hdu4630 No Pain No Game(离线 线段树)

借鉴这里:http://blog.youkuaiyun.com/dongdongzhang_/article/details/9670039 有N个数, 是 1~N的一个排列。有M个询问, 每次询问一个区间, 问从这个区间中,取两个数的最大的最大公约数。 首先要求出每个数对应的因子存起来。在一个区间内, 如果一个因子出现两次,该因子就肯定是该区间的一个解。 而出现两次并且是最大。 就是该区间的

超级码力 616

HDU - 4630 离线处理区间点对问题

题意:给定\(a[1...n]\),多次询问\([L,R]\)中的任意一对数使得\(gcd(a_i,a_j)\)最大 对于gcd,区间内至少存在两个相同的因子才能作为合法的解,存在两个相同因子且最大就是最优的解 对区间右端点进行离线排序,用线段树维护\([L,R]\)内最大的gcd(存在两次以上的因子) 具体的更新策略:记录因子\(j\)的上一次出现的地方\(last_j\),当\(last_j\...

weixin_30394981的博客 124

hdu 4630 No Pain No Game 线段树 树状数组

题意:给你一个n的排列,有m个询问,每次询问L R,从L到R区间里选出两个数a, b使得gcd(a,b)最大,每次输出最大的gcd 对于x的所有倍数,我们把他们两两结合得到的最大公约数看做x,把所有的找到的位置排个序,如果询问的L R的最大公约数可以是x,那么这个询问的LR区间必然包含所有的位置的某一个相邻的位置,这样的话就可以把相邻的位置看做线段l r,它有个val值x ,那么询问就是

JayYe的专栏 2018
上一篇: hdu 4638 树状数组 区间内连续区间的个数(尽可能长)
下一篇: hdu 3436 线段树 一顿操作
Tyuio28
博客等级 码龄11年 12粉丝 279原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值