hdu 4630 线段树+在线操作

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

hdu 4630

算是一道好题目吧,不断地求一段区间的最大公约数,‘|’表示有x这个约数,‘o’表示没有,

|ooo|oo|那么我们可以根据最后一个‘|’的位置来进行在线查询,将要查询的区间按右边界进行排序,更新‘|’的前一个位置。用线段树。。。。。。

//hdu 4630 线段树
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <stdio.h>
#include <bitset>
#include <queue>
#define maxn 50002
using namespace std;
int num[maxn],pos[maxn],n,m,p[maxn];
vector<int> g[maxn+5];
struct e1
{
    int x,y,id,ans;
}que[maxn];
struct e2
{
    int l,r,ma;
}tree[maxn*6];

bool cmp(e1 a,e1 b)
{
    if(a.y==b.y)
        return a.x<b.x;
    return a.y<b.y;
}

void pushup(int a)
{
    tree[a].ma=max(tree[a*2+1].ma,tree[a*2].ma);
}

void build(int a,int l,int r)
{
    tree[a].l=l;
    tree[a].r=r;
    tree[a].ma=0;
    if(l==r)
        return;
    int mid=(l+r)/2;
    build(a*2,l,mid);
    build(a*2+1,mid+1,r);
}

void insert(int a,int p,int v)
{
    if(tree[a].l==tree[a].r)
    {
        tree[a].ma=max(tree[a].ma,v);
        return;
    }
    int mid=(tree[a].l+tree[a].r)/2;
    if(p<=mid)
        insert(a*2,p,v);
    else
        insert(a*2+1,p,v);
    pushup(a);
}

int query(int a,int l,int r)
{
    if(l<=tree[a].l&&tree[a].r<=r)
        return tree[a].ma;
    int mid=(tree[a].l+tree[a].r)/2;
    int ans=0;
    if(l<=mid)
        ans=max(query(a*2,l,r),ans);
    if(mid<r)
        ans=max(query(a*2+1,l,r),ans);
    return ans;
}

int main()
{
    int T,j,k;
    for(j=1;j<=maxn;j++)
        for(k=j;k<=maxn;k+=j)
          g[k].push_back(j);
    //freopen("d:\\in.txt","r",stdin);
    scanf("%d",&T);
    while(T--)
    {
      int i,ii,cnt=0;
      memset(pos,0,sizeof(pos));
      scanf("%d",&n);
      for(i=1;i<=n;i++)
        scanf("%d",&num[i]);
      scanf("%d",&m);
      for(i=0;i<m;i++)
      {
        scanf("%d %d",&que[i].x,&que[i].y);
        que[i].id=i;
      }
      sort(que,que+m,cmp);
      build(1,0,n);
      for(i=1;i<=n;i++)
      {
         int u=num[i];
         for(ii=0;ii<g[u].size();ii++)
         {
             insert(1,pos[g[u][ii]],g[u][ii]);
             pos[g[u][ii]]=i;
         }
         while(cnt<m&&que[cnt].y==i)
         {
              p[que[cnt].id]=query(1,que[cnt].x,que[cnt].y);
              cnt++;
         }
      }
      for(i=0;i<m;i++)
        printf("%d\n",p[i]);
    }
    return 0;
}

HDU 4630、BOJ 某题 两道离线线段树。 比赛时候没想到。。。。 扫描数组,i从1到n,线段树维护从1到i每一个约数(1~50000)的出现的最近位置,线段树存储的是约数的最大值 阅读详情

相关推荐

线段树离线处理专题

如果说算法是程序的灵魂,那么数据结构是程序的肉体。掌握基本的数据结构,并且能灵活运用这些数据结构,是信息学竞赛中常用的一些招法。在竞赛中,学会这种数据结构在当今的比赛中已经处于落伍地位,如何运用这些数据结构处理问题,才是我们需要掌握的真正本领。        在阅读以下的知识时候,博主默认各位朋友已经了解并且能合理使用线段树进行相应的增删改查操作,这些知识网上很多(推荐NotOnlySucces

衬衫的价格是九磅十五便士是不是很熟悉? 1300

HDU4630(树状数组,离线)

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

morejarphone~ 941

突发E层(Es层):短波通信中的“意外惊喜”与“隐形杀手”全解析

本文深入解析了突发E层(Es层)在短波通信中的双重作用,既可能带来超远距离通信的“意外惊喜”,也可能成为通信链路的“隐形杀手”。通过分析Es层的形成机制、时空分布规律及实战应用技巧,帮助通信爱好者与专业人员更好地利用或应对这一电离层现象,提升短波通信的可靠性与效率。

weixin_30443813的博客 822

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

TMS320C6678开发笔记1-6---C6678单核烧写程序

第6节 单核烧写加载程序 6.1节 TI参考文档 参考文档:《KeystoneI Bootloader Resources and FAQ》讲的非常好,建议一定要看 https://processors.wiki.ti.com/index.php/KeystoneI_Bootloader_Resources_and_FAQ#Direct_Boot_Examples_.28without_IBL.29 里面有三个工程: C6678 EVM SPI boot example C6657 EVM ..

kunkliu的博客 5693

农业AI避坑指南:用YOLO11做叶片病害检测时遇到的5个典型问题

本文分享了使用YOLO11模型进行农业叶片病害检测时常见的五个典型问题及解决方案。针对田间多变光照、病害样本不均衡、标注歧义、背景干扰和边缘部署等挑战,提供了包括场景自适应数据增强、解耦训练、软标签与鲁棒损失函数、困难负样本构建以及模型轻量化部署在内的实战经验,旨在帮助开发者提升农业AI项目的落地效果。

ujm56789012的博客 205

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

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

dingwufu9301的博客 606

BALM2深度解析 | 港大MARS实验室如何用点簇革新激光BA?

本文深度解析了港大MARS实验室提出的BALM2方案如何通过点簇技术革新激光BA(Bundle Adjustment)处理。BALM2将点云数据聚合为点簇,显著提升计算效率,实测显示其计算耗时仅为传统方法的1/20。文章详细介绍了点簇的核心原理、二阶优化方法及与传统方法的性能对比,展示了其在激光SLAM领域的突破性应用。

weixin_29212867的博客 153

HDU 4630 线段树+离线处理

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

Dan__ge的博客 1022

PLSQL Developer14连接Oracle详细过程

下载地址:Instant Client for Microsoft Windows (x64) 64-bit | Oracle 中国解压客户端工具到一个目录(解压文件到当前目录,自动合并成一个目录)​ 电脑(右键)→属性→高级系统设置→环境变量→系统环境变量→新建变量名:NLS_LANG 变量值: AMERICAN_AMERICA.ZHS16GBK​ 变量名:TNS_ADMIN 变量值:C:\xiaxinyu\software\Oracle\instantclient_19_10​ 在Oracle客户端(C

summer_fish的专栏 3983

Unity物理驱动3D汽车实现:从刚体控制到参数调优

在游戏开发中,刚体物理是实现真实物体运动与交互的核心技术。通过Unity的物理引擎,开发者可以模拟重力、碰撞、摩擦力等物理行为,为游戏世界注入真实感。其技术价值在于能够以符合物理规律的方式驱动游戏对象,避免穿墙、无视惯性等问题,从而提升游戏体验的真实性和沉浸感。这一原理广泛应用于角色控制、车辆模拟、物体破坏等场景。本文以3D小汽车为例,详细解析了如何通过Rigidbody组件施加力与扭矩,并利用C#脚本实现玩家输入逻辑,完成一辆可操控、能碰撞的物理驱动汽车。文中重点探讨了AddForce与角速度控制两种方案

weixin_34380948的博客 501

HDU 4630 No Pain No Game

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

dongdongzhang_的专栏 2121

科研绘图系列:R语言绘制宏基因组分析的可视化图形(network & barplot & heatmap)

科研绘图系列:R语言多图形组合(network & barplot & heatmap)

专注生信领域 644

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

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

没有梦想何以远行 504

全球首发48V架构的Cybertruck,到底牛在哪?| 深扒特斯拉高压系统架构

特斯拉Cybertruck作为全球首款标配48V架构的量产车,在电气系统架构上进行了多项创新。首先,它采用以太网连接高压控制器与后域控制器,提升了数据传输效率和智能化水平。其次,Cybertruck引入了Pyro烟火断开装置,用于碰撞时快速断开电池连接,提高安全性。在电流监测方面,特斯拉既保留了传统的Shunt分流器技术,又引入了更先进的磁通门电流传感器,后者具有无温漂、完全隔离等优势。48V供电系统在降低电流损耗方面表现优异,但也面临电弧风险、盐水腐蚀等挑战。Cybertruck的48V系统通过PCS供电

weixin_43199439的博客 1347

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

hdu4630(线段树)

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

晓风残月xj 1209

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

hdu 4630 No Pain No Game【线段树 离线操作】

欢迎参加——每周六晚的BestCoder(有米!) No Pain No Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1820    Accepted Submission(s): 778 链

Fighting! 1790

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

大田二十 1416

HDU4630 线段树离线操作 && GCD性质

题意: n个数,m个询问,每次查询一个区间的中任意两个数的最大GCD 思路: 离线操作,按照查询的右端点将查询从小到大排序。预处理出所有数的因子用二维vector保存。遍历整个这n个数,每个数遍历它的因子,如果这个因子在前面出现过,则将这个因子维护到线段树中,并将因子最新出现位更新,如果没有出现过则将当前此因子最新出现的位置标记为当前。线段树用来维护区间的最大因子。因为区间两次以上出现过的最...

samscream的博客 326

HDU 4630 No Pain No Game (线段树离线查询)

题目地址:HDU 4630 这题一看数据范围,于是一直在思考n*logn的算法。。实在没想到好方法,找了找题解,发现都是用的n*sqrt(n)*logn的方法。。。算了算,这个复杂度的确可以过。。好吧。。 然后就可以先离线下来将询问按r值排序,然后枚举每个数,并且用sqrt(n)的方法枚举所有的约数,然后对于每个约数,对最近的一次出现的这个约数的地方进行更新。因为对于当前区间来讲,只要最近的这个

scf0920 963

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

【HDU4630 No Pain No Game】 dp思想+线段树的离线操作

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4630 题意:给你n个数据范围在[1,n]中的数,m个操作,每个操作一个询问[L,R],让你求区间[L,R]内任意两个数的最大公倍数。 思路:是线段树是必然的 O.O 。顺着来不好解决,只能离线处理试试。按r从小到大排序,数组a[i]从左到右扫一遍,对每个a[i]都要进行处理,...

baidui8622的博客 163

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

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

AC_Arthur的专栏 1193

hdu4630&&hdu4638 线段树离线操作

两题都是朴素想法枚举两个端点O(n^2)超时,那么枚举其中一个端点用线段树维护另一个端点。关键在于没插入一个端点后都是成段更新,否则又会退化到O(N^2)。 ps:两题用c++交都比g++快500ms以上。 4630 //#include #include #include #include #include #include using namespace std; #define lso

Matrix 1396

hdu 4630 线段树+离线处理

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

写东西的地方 684

hdu4630 or hdu4638 线段树离线查询

这两道题手段挺类似的。

creater_X 995
上一篇: hdu 5438 +hdu 4786 并查集
下一篇: hdu 5564 快速矩阵幂+数位dp
labrother
博客等级 码龄11年 2粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值