HDU 4630 No Pain No Game 树状数组+离线操作

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

题意:给一串数字,每次查询[L,R]中两个数的gcd的最大值。

解法:容易知道,要使取两个数让gcd最大,这两个数最好是倍数关系,所以处理出每个数的所有倍数,两两间根据倍数关系形成一条线段,值为该数。那么每次查询[L,R]之间两数gcd的最大值即为查询[L,R]中值最大的线段,离线所有的查询数据,然后按右端点坐标从小到大排序,依次往右加入即可。

这里学到了树状数组维护最大值的写法。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 50007

int c[N];
struct node
{
    int l,r,v;
}a[10*N],Q[N];
int n,pos[N],num[N],ans[N];

int cmp(node ka,node kb) { return ka.r < kb.r; }
int lowbit(int x) { return x&-x; }

void modify(int x,int val)
{
    while(x > 0)
    {
        c[x] = max(c[x],val);
        x -= lowbit(x);
    }
}

int getmax(int x)
{
    int res = 0;
    while(x <= n)
    {
        res = max(res,c[x]);
        x += lowbit(x);
    }
    return res;
}

int main()
{
    int t,i,j,x,q,tot;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            scanf("%d",&x);
            pos[x] = i;
            c[i] = 1;
        }
        tot = 0;
        for(i=2;i<=n/2;i++)
        {
            int k = 0;
            for(j=i;j<=n;j+=i)  //i的倍数
                num[k++] = pos[j];
            sort(num,num+k);
            for(j=1;j<k;j++)
            {
                 a[tot].l = num[j-1];
                 a[tot].r = num[j];
                 a[tot++].v = i;
            }
        }
        scanf("%d",&q);
        for(i=0;i<q;i++)
        {
            scanf("%d%d",&Q[i].l,&Q[i].r);
            Q[i].v = i;
        }
        sort(a,a+tot,cmp);
        sort(Q,Q+q,cmp);
        j = 0;
        for(i=0;i<q;i++)
        {
            if(Q[i].l == Q[i].r)
            {
                ans[Q[i].v] = 0;
                continue;
            }
            while(j < tot && a[j].r <= Q[i].r)
                modify(a[j].l,a[j].v),j++;
            ans[Q[i].v] = getmax(Q[i].l);
        }
        for(i=0;i<q;i++)
            printf("%d\n",ans[i]);
    }
    return 0;
}
View Code

 

Unity 面试篇|(六)数据结构和算法篇 【全面总结 | 持续更新】 先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样遍历完后,堆中的10000个数就是所需的最大的10000个。桶排序是计数排序的升级版。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。这样处理就可以分别在每个文件的10^6个数据中找出最大的10000个数,合并到一起在再找出1000*10000中的最终的结果。 阅读详情

相关推荐

强化学习之课程学习法

课程学习是一种有计划的学习方法,模拟人类学习的过程。它通过设置逐步增加难度的任务序列,让学习系统从简单的任务开始,逐渐过渡到复杂任务。这一方法可以显著提高训练效率,避免智能体一开始就面临过于复杂的任务,从而导致学习过程困难。逐步难度增加:从简单的任务开始,逐步增加任务的难度,直到智能体能够解决最复杂的任务。动态调整:根据智能体的学习进展,动态调整任务的难度,保证学习的过程始终处于一个适当的挑战性范围。

m0_64087341的博客 2695

HDU4630(树状数组,离线)

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

morejarphone~ 941

阿里平头哥与华为芯片的比较

阿里平头哥与华为芯片代表了中国AI芯片领域的两种典型发展路径:平头哥通过兼容CUDA生态快速切入市场,以较低成本提供接近国际水平的AI算力;华为则坚持全栈自研路线,构建从芯片到框架的完整技术体系,更注重供应链安全和自主可控。从短期来看,平头哥PPU在单卡性能参数上全面超越昇腾910B,接近英伟达H20水平,且成本优势明显,有望在云服务和互联网应用领域取得更大市场份额。而华为昇腾则凭借全栈自研和端边云协同优势,在政企市场和科研领域更具竞争力。

shao.bing的专栏 4001

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

Oracle Patch清理

- opatch clean的帮助,该命令清除.patch_storage directory文件夹下的'restore.sh,make.txt' files and 'scratch,backup'-- 执行完毕后,貌似没有变化,可能和自己环境有关(19年开始测试补丁,基本上每个季度都测试,后面把又把数据库用RMAN做了迁移,又转换成了PDB模式)。在对Oracle安装补丁后,会发现OS上被占用了大量的空间,本文档清理Opatch过程中的一些文件,释放空间。--清理后空间,剩余25G。

文档搬运工 1072

从BUCK-BOOST到反激:一个‘拆电感’的视角,轻松理解多路输出交叉调整

本文从BUCK-BOOST电路到反激变换器的演变入手,通过‘拆解电感’的独特视角解析多路输出交叉调整机制。深入探讨了反激电路的能量暂存方式、传递路径变化及电压关系,并结合具体参数对比揭示其特性。针对多路输出中的电压平衡问题,提供了绕组排布优化、元器件选型等实战技巧,帮助工程师有效提升电源系统的稳定性与效率。

weixin_33738578的博客 437

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

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

dingwufu9301的博客 606

Spring AI Alibaba Agent开发实战:DeepResearch Agent调度系统

智能Agent调度系统通过专业化分工解决传统AI系统的三大痛点:通用模型专业性不足、处理效率低下和资源浪费。系统采用分层架构设计,核心组件包括智能调度器、Agent选择辅助器和集成工具类,实现问题分类、专业Agent匹配和搜索策略优化的全流程自动化。系统特点包括:1)配置驱动的灵活扩展;2)分层回退的容错机制;3)支持工具调用与传统搜索的智能切换。该架构通过策略模式和依赖注入等技术,在保证稳定性的同时显著提升了研究质量和效率,为企业级多Agent协作提供了完整解决方案。(149字)

wjianwei666的专栏 504

HDU 4630 线段树+离线处理

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

Dan__ge的博客 1022

CSP - 2024 普及组初赛试题及解析

CSP - 2024 普及组初赛试题及解析

QD_Jason的博客 2911

结构优化软件:OptiStruct_(11).拓扑优化

在OptiStruct中,设计空间可以通过定义设计区域来实现。设计区域是结构中可以进行材料变化的部分。几何区域:通过几何选择工具选择特定的区域。网格区域:通过网格选择工具选择特定的单元。假设我们有一个简单的梁结构模型,网格文件为beam.fem。我们希望在梁的中部进行拓扑优化,以减轻重量并保持刚度。

kkchenjj的博客 1368

hdu 4630 No Pain No Game(树状数组离线操作)

题目大意:       给你n个数分别为a1,a

LHYL 685

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

HDU-4630 No Pain No Game 树状数组+离线操作

  题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4630   题意:给一个数列,询问区间[l,r]里两个数最大gcd。   求区间的最大gcd(a,b),就是找一个数是在这个区间所有数的约数中,至少出现两次,而且最大的那个数。那么接下来就比较容易了,从右到左扫描数列,用pre[i]表示约数 i 在当前这个位置往右第一次出现的位置,那么每到一个位...

weixin_30667301的博客 198

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

No Pain No Game(hdu4630,树状数组+数学)

/*http://acm.hdu.edu.cn/showproblem.php?pid=4630 No Pain No Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 689    Accepted Submission(

JHC23的专栏 814

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

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

[HDU4630]No Pain No Game

题目链接: HDU4630 把所有询问离线处理。 从右往左扫一遍,设\(p_i\)表示目前扫过的数中含有因子\(i\)的最左边的数的下标。 对当前的数\(a_i\),扫描所有\(a_i\)的因子\(x\),那么将所有\(x|a_j(j\ge i)\)的\(j\),开一个数组\(c\),将\(c_j\)与\(x\)取\(max\),那么若当前有询问\([i,r]\),则答案为\(\max_{k=1}...

weixin_30794851的博客 117

HDOJ 4630 No Pain No Game

树状数组维护+离线 最大gcd一定是某个数的一个约数,对所有询问按右端点排序,用树状数组维护即可。。 具体做法:记录每个约数出现的上一个位置pre,对于左端点落在pre之前的询问这个约数就可能是答案,所以我们对pre向前进行维护,而询问的时候从左端点往上找最大值。。。。 No Pain No Game Time Limit: 4000/2000 MS (Java/Others)  

码代码的猿猿 1323

HDU 4630 No Pain No Game

题意: 给一个长度n的1~n的排列,要求询问一段区间内任意两个数的最大公约数的最大值 解法: 对于以数x为最大公约数,必要条件是这两个数都是x的倍数,那么我们可以将所有为x的倍数的数的位置都找出来,并排序,那么只有当相邻两个位置都被同一段区间包含的时候,才会取到answer:x,所以可以将相邻位置看成一条权值为x的线段,那些不相邻位置组成的线段明显包含前面的线段,可以省略。然后对所有的询问离线操

= = 966

HDUOJ 4630 2013多校第三场第10题 No Pain No Game

传送门 虽然看了下题目知道是考数据结构了,但是不知道怎么做。后来才明白。。。 这里用树状数组做,先输入所有要输入的,然后离线做,这样可以将问询排序,然后在跟新树状数组的时候选择恰到好处的时机进行查询。 #include #include #include #include using namespace std; int a[50005]; int d[50005][150]; int t,

Cugb->Baoge 587

HDU - 4630 No Pain No Game(离线,树状数组)

????‍♂️ ????‍♂️ ????‍♂️ 题意:一个长为n的数组,m次查询,询问(l,r)中两个数字之间GCD(l,r中任意一对,只要GCD最大即可) (1)处理出每个数字的约数,GCD一定是在这个区间中出现两次即以上的最大的那个约数 (2)对于查询按照l排序之后,我们再从后往前更新最大约数,如果这个约数在该位置之后出现过,我们就在他出现的后一个位置更新他(查询时查询r) (3)杭电数据好像有误,如 1 1 ...

欢迎光临 我的心 303

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 树状数组+离线查询

理解好这道题的树状数组所代表的含义是解题的关键,可是网上的题解都没点出其树状数组的含义(难道是大家都觉得太简单了吗=_=),然后我看题解都看不会,这两天切了几道简单的同类型题,有所收获。    反正我第一次想通这类树状数组的含义时是挺orz的...下面记录是建立在对树状数组的Update/Query过程已经有一个感性的理解的条件之上的。     Update(p, value)

侧耳倾听 2664

hdu 4630 No Pain No Game

树状数组+离线处理,输入结束后按照L从到小排序,然后在计算约数的时候,把约束出现次数大于1的存入树状数组,然后根据R进行查询,最后全部输出 #include #include #include #define N 50005 struct node { int l,r,pos; }; node v[N]; int n,m; int num[N],arr[N],p[N],q[

moyan_min的专栏 668

hdu 4630 No Pain No Game

题目大意,

春天小猪 935

2013 多校第三场 hdu 4630 No Pain No Game(线段树)

hdu 4630 题目:http://acm.hdu.edu.cn/showproblem.php?pid=4630 题目大意:1~n,总共个数,任意顺序排列,然后给你m个询问,每个询问有a、b,问你区间a~b的数里面任意两个数最大gcd是多少。 思路:由于它问的是gcd,那么我们可以先枚举约数,即1~n,对于每个约数去画区间,我们要求的是对于每个区间长度要尽可能的小,比如约数是1的区间,那

沉溺的专栏 860
上一篇: HDU 5033 Building --离线+单调栈
下一篇: Codeforces 369E Valera and Queries --树状数组+离线操作
hq572241670
博客等级 码龄14年 9粉丝 180原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值