#线段树,约数#洛谷 3889 [GDOI2014]吃
题目
有一个长度为\(n\)的数列,现在有\(m\)组询问每次给出区间\([l,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]吃的更多相关文章
- 【线段树】洛谷 P3372 【模板】线段树 1
动态开结点线段树板子. #include<cstdio> using namespace std; typedef long long ll; ll sumv[400005],delta[ ...
- AC日记——【模板】线段树 2 洛谷 P3373
P3373 [模板]线段树 2387通过1.8K提交标签难度 提高+/省选- 提交 讨论 题解 最新讨论 更多讨论 2333最后三个点卡常数.迷之RE感觉这题很迷啊好像一共三组测试数据.友情提示:开l ...
- AC日记——【模板】线段树 1 洛谷 P3372
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个 ...
- 线段树【洛谷P2894】 [USACO08FEB]酒店Hotel
P2894 [USACO08FEB]酒店Hotel 参考样例,第一行输入n,m ,n代表有n个房间,编号为1---n,开始都为空房,m表示以下有m行操作,以下 每行先输入一个数 i ,表示一种操作: ...
- P3372 【模板】线段树 1 洛谷
https://www.luogu.org/problem/show?pid=3372 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 ...
- 洛谷 P1736 创意吃鱼法
题目描述 题目链接:https://www.luogu.org/problemnew/show/P1736 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢( ...
- 洛谷 P1736 创意吃鱼法 Label:dp || 前缀和
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
- 洛谷P1736 创意吃鱼法
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
- [虚树模板] 洛谷P2495 消耗战
题意:给定树上k个点,求切断这些点到根路径的最小代价.∑k <= 5e5 解:虚树. 构建虚树大概是这样的:设加入点与栈顶的lca为y,比较y和栈中第二个元素的DFS序大小关系. 代码如下: i ...
- 洛谷P1736 创意吃鱼法 dp
正解:dp 解题报告: 早就想写dp的题目辣!我发现我的dp好差啊QAQ所以看到列表的小朋友写dp的题目就跟着他们的步伐做下题好辣QwQ 这题的话没有那——么难,大概说下趴QwQ 首先说下题意 前面一 ...
随机推荐
- 【Azure 环境】ARM部署模板大于4MB的解决方案及Linked Template遇见存储账号防火墙无法访问
问题一:在ADF Pipeline部署ARM Template报错"Deployment failed -- the request content size exceeds the max ...
- 【Azure 应用程序见解】通过无代码方式在App Service中启用Application Insights后,如何修改在Application Insights中显示的App Service实例名呢?
问题描述 在App Service中,可以非常容易的启动Application Insights服务.默认情况中,在Application Insights中查看信息时候,其中的对象名称默认为App ...
- C#实现图片对比
前言 虽然已经正式转JAVA了,但最近发现一个特别好的开源项目masuit,不仅提供很多简便的功能,还有图像的一些特殊操作功能. 下面就实现一个简单图像对比. 实现对比 代码如下,实现一个可以对比翻转 ...
- Jmeter 之 forEach控制器
1 添加方法: 线程组右键-> 添加 -> 逻辑控制器 ->ForEach控制器 2 作用: 可以更方便JMeter后置处理器提取出来的多组数据,也可以定义具有特定规则的数据,用 ...
- shell脚本的基本使用
本文是对菜鸟教程 shell编程原文 的总结并记录 如有侵权 联系删除 简介 说明: Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.这个应用程序提供了一个界面,用户通过这 ...
- [好文推荐] vue3 源码分析 mini-vue 写的不错
[阮一峰推荐]学习 vue3 源码的利器 git clone https://github.com/cuixiaorui/mini-vue.git
- WPF之模板
目录 模板的内涵 数据的外衣DataTemplate UserControl例子 DataTemplate例子 控件的外衣 ControlTemplate 解剖控件 ItemsControl的Pane ...
- Spring Boot命令指定环境启动jar包
原文地址:Spring Boot命令指定环境启动jar包 - Stars-One的杂货小窝 记下通过命令行的方式去改变spring boot项目中的环境配置信息 命令 项目中有以下配置 applica ...
- 03.视频播放器Api说明
03.视频播放器Api说明 目录介绍 01.最简单的播放 02.如何切换视频内核 03.切换视频模式 04.切换视频清晰度 05.视频播放监听 06.列表中播放处理 07.悬浮窗口播放 08.其他重要 ...
- uni-app攻略:如何对接驰腾打印机
一.引言 在当前的移动开发生态中,跨平台框架如uni-app因其高效.灵活的特点受到了开发者们的青睐.同时,随着物联网技术的飞速发展,智能打印设备已成为许多业务场景中不可或缺的一环.今天,我们就来探讨 ...