题目

有一个长度为\(n\)的数列,现在有\(m\)组询问每次给出区间\([l,r]\),查询

\[\max_{i,j=1}^n\{gcd(a_i,a_j)[(i<l或i>r)且l\leq j\leq r]\}
\]

分析

首先是离线询问,考虑把\(i\)拆成两部分处理

也就是\(\max\{\max\{ans_{i<l}\},\max\{ans_{i>r}\}\}\)

后面这一坨将数列和询问编号翻转就转换成前面这一坨

那就按照区间的左端点递增排序,考虑小于左端点的位置所做的贡献,

处理每个约数下一次出现的位置,如果这个位置出现在区间内,说明这个约数是可以做出贡献的

那么预处理每个位置的数中每个约数下一次出现的位置,并用线段树维护区间最大值即可


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#include <cstring>
#define rr register
using namespace std;
const int N=100011;
struct rec{int l,r,rk;}q[N];
int n,m,a[N],ir[N],w[N<<2],h[N];
int ans[N],A[N][131],B[N][131],C[N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
bool cmp(rec x,rec y){return x.l<y.l;}
inline signed max(int a,int b){return a>b?a:b;}
inline void update(int k,int l,int r,int x,int y){
if (l==r) {w[k]=max(w[k],y); return;}
rr int mid=(l+r)>>1;
if (x<=mid) update(k<<1,l,mid,x,y);
else update(k<<1|1,mid+1,r,x,y);
w[k]=max(w[k<<1],w[k<<1|1]);
}
inline signed query(int k,int l,int r,int x,int y){
if (l==x&&r==y) return w[k];
rr int mid=(l+r)>>1;
if (y<=mid) return query(k<<1,l,mid,x,y);
else if (x>mid) return query(k<<1|1,mid+1,r,x,y);
else return max(query(k<<1,l,mid,x,mid),query(k<<1|1,mid+1,r,mid+1,y));
}
inline void doit(){
sort(q+1,q+1+m,cmp);
memset(h,0,sizeof(h));
memset(w,0,sizeof(w));
for (rr int i=n,t=0;i;C[i--]=t,t=0)
for (rr int j=1;j<=ir[a[i]];++j)
if (a[i]%j==0){
if (h[j]) A[i][++t]=j,B[i][t]=h[j];
h[j]=i;
if (j*j<a[i]){
if (h[a[i]/j]) A[i][++t]=a[i]/j,B[i][t]=h[a[i]/j];
h[a[i]/j]=i;
}
}
for (rr int i=1,j=1;i<=m;++i){
for (;j<q[i].l;++j)
for (rr int o=1;o<=C[j];++o)
update(1,1,n,B[j][o],A[j][o]);
ans[q[i].rk]=max(ans[q[i].rk],query(1,1,n,q[i].l,q[i].r));
}
}
signed main(){
for (rr int i=1;i<317;++i) ir[i*i]=1;
for (rr int i=1;i<N;++i) ir[i]+=ir[i-1];
n=iut(); for (rr int i=1;i<=n;++i) a[i]=iut();
m=iut(); for (rr int i=1;i<=m;++i) q[i]=(rec){iut(),iut(),i};
doit(); for (rr int i=1;i<=m;++i) swap(q[i].l,q[i].r);
for (rr int i=1;i<=m;++i) q[i].l=n-q[i].l+1,q[i].r=n-q[i].r+1;
reverse(a+1,a+1+n),doit();
for (rr int i=1;i<=m;++i) print(ans[i]),putchar(10);
return 0;
}

#线段树,约数#洛谷 3889 [GDOI2014]吃的更多相关文章

  1. 【线段树】洛谷 P3372 【模板】线段树 1

    动态开结点线段树板子. #include<cstdio> using namespace std; typedef long long ll; ll sumv[400005],delta[ ...

  2. AC日记——【模板】线段树 2 洛谷 P3373

    P3373 [模板]线段树 2387通过1.8K提交标签难度 提高+/省选- 提交 讨论 题解 最新讨论 更多讨论 2333最后三个点卡常数.迷之RE感觉这题很迷啊好像一共三组测试数据.友情提示:开l ...

  3. AC日记——【模板】线段树 1 洛谷 P3372

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个 ...

  4. 线段树【洛谷P2894】 [USACO08FEB]酒店Hotel

    P2894 [USACO08FEB]酒店Hotel 参考样例,第一行输入n,m ,n代表有n个房间,编号为1---n,开始都为空房,m表示以下有m行操作,以下 每行先输入一个数 i ,表示一种操作: ...

  5. P3372 【模板】线段树 1 洛谷

    https://www.luogu.org/problem/show?pid=3372 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 ...

  6. 洛谷 P1736 创意吃鱼法

    题目描述 题目链接:https://www.luogu.org/problemnew/show/P1736 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢( ...

  7. 洛谷 P1736 创意吃鱼法 Label:dp || 前缀和

    题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...

  8. 洛谷P1736 创意吃鱼法

    题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...

  9. [虚树模板] 洛谷P2495 消耗战

    题意:给定树上k个点,求切断这些点到根路径的最小代价.∑k <= 5e5 解:虚树. 构建虚树大概是这样的:设加入点与栈顶的lca为y,比较y和栈中第二个元素的DFS序大小关系. 代码如下: i ...

  10. 洛谷P1736 创意吃鱼法 dp

    正解:dp 解题报告: 早就想写dp的题目辣!我发现我的dp好差啊QAQ所以看到列表的小朋友写dp的题目就跟着他们的步伐做下题好辣QwQ 这题的话没有那——么难,大概说下趴QwQ 首先说下题意 前面一 ...

随机推荐

  1. 项目实战:Qt + 树莓派3B+ 智能笔筒系统

    红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术.树莓派.三维.OpenCV.OpenGL.ffmpeg.OSG.单片机.软硬结合等等)持续更新中-(点击传送门)   需求   1.基于树莓 ...

  2. 【MySQL】数据库设计(一)三大范式

    三大范式 1NF 第一范式 强调列的原子性,即列不可分 例如: 2NF 第二范式 前提是1NF,另外包含两个部分: 表必须具有一个主键: 没有包含在主键中的列必须完全依赖于主键,而不是只依赖主键的一部 ...

  3. 05、etcd 读请求执行流程

    本篇内容主要来源于自己学习的视频,如有侵权,请联系删除,谢谢. 1.etcd读请求概览 etcd是典型的读多写少存储,在我们实际业务场景中,读一般占据2/3以上的请求.一个读 请求从client通过R ...

  4. Redis哨兵(sentinel)

    目录 前言 原理 架构图 下载 命令 配置 启动 查看 Sentinel(哨兵)配置 常用命令 Q&A Redis主从配置异常解决:Error condition on socket for ...

  5. 【Azure Developer】在微软云中国区,如何使用Microsoft GraphAPI连接到B2C Tenant

    问题描述 如题所述,当在中国区使用Microsoft GraphAPI连接B2C Tenant时候,如何来设置中国区的Endpoint呢?在GitHub的示例中,并没有示例介绍如何连接中国区.如 问题 ...

  6. 一次生产环境OOM排查

    一.背景 前几天下午飞书告警群里报起了java.lang.OutOfMemoryError: unable to create new native thread告警,看见后艾特了对应的项目负责人但是 ...

  7. 使用OpenTelemetry进行监控

    工具介绍 注意:该部分介绍摘抄自:https://www.aiwanyun.cn/archives/174 Prometheus.Grafana.Node Exporter 和Alertmanager ...

  8. CSV转Excel,命中关键词标红

    CSV转Excel,命中关键词标红 package com.wenwo.schedule.job.mainJob; import java.io.ByteArrayOutputStream; impo ...

  9. 线上RocktMQ重复投递半事务消息故障排查

    1. 故障现象 2020-11-18 10:40开始,业务线反馈线上收到大量的重复MQ半事务消息,导致容器资源消耗急剧攀升,经查看MQ日志,发现broker-b的Master服务,报出大量半事务消息回 ...

  10. Set-Alias navi ./navi.bat - 设置别名 - powershell入门 (后期改方案了,换npm script)

    需求 开机要启动好几个服务,原先都用vscode启动,觉得可能比较占内存,所以改成命令行 发现直接运行bat,需要输入./batName.bat 一次还行,天天输入就麻烦了 命令 Set-Alias ...