1470: 区间求最值
Time Limit: 1 Sec Memory Limit: 128 MB
[Submit][Status][Web Board]
Description

给定一个长度为N 的数组,有q个询问,每个询问是求在数组的一段区间内那个元素的因子的个数最大,比如24的因子的个数就是8。

Input

首先是一个整数t,表示有t组测试数据,每组测试数据的第一行是一个整数N(1<=N<=106),第二行有N个整数ai(1<=ai<=106,i=1,2,…N)表示数组的元素。第三行有一个整数q(1<=q<=10^5),代表有q个询问,接下来每一行有两个整数,li,ri(li<=ri,li>=1,ri<=N).代表数组的一段区间,并且li+1>=li,ri+1>=ri。

Output

对于每组数据的每个询问都输出一个整数表示在这段区间里面元素因子个数的最大值。

Sample Input

1
10
2 3 5 6 9 11 12 36 39 44
3
2 6
3 8
3 9

Sample Output

4
9
9

HINT

Source
/*
常规方法:
类素数筛法统计数据范围内每个数因子个数
然后直接区间遍历
这时:如果你用c++的cin和cout输入输出,你会发现Time limit exceed
然而用c的scanf和printf输入输出却AC了,虽然效率很低(应该是测试数据比较水)。
刚才和一起做题的小伙伴讨论了一下这个问题,听说C++输入输出可以加两行代码,使它输入输出更快:ios::sync_with_stdio(0);cin.tie(0);`但是我测试了还是不行,依然时间超限。所以对于大数据最好还是使用C语言的输入输出好!!
*/
//暴力AC代码:

    #include <stdio.h>#include <algorithm>using namespace std;const int n = 1e6 + 2;int a[n],b[n];int getmax(int l,int r){int y = 0;for(int i = l; i <= r; i++)y = max(y,b[i]);return y;}int main(){for(int i = 1; i <= 1e6; i++){for(int j = i; j <= 1e6; j+=i){a[j]++;}}int t,N,num;scanf("%d",&t);while(t--){scanf("%d",&N);for(int i = 1; i <= N; i++){scanf("%d",&num);b[i] = a[num];}int q;scanf("%d",&q);while(q--){int li,ri;scanf("%d%d",&li,&ri);printf("%d\n",getmax(li,ri));}}return 0;}```
//更高效的AC代码(空间换时间)
/*
ST算法(Sparse Table)
*/
```c#include<stdio.h>#include<algorithm>using namespace std;#define MAX 1000002#define N 30int Log[MAX],ans[MAX][N],a[MAX];int n,que,x,y;int main(){for(int i = 1; i <= 1e6; i++){for(int j = i; j <= 1e6; j+=i){a[j]++;}}int c,T;scanf("%d",&T);while(T--){scanf("%d",&n);Log[0] = -1;int num;for(int i = 1; i <= n; i++){scanf("%d",&num);ans[i][0] = a[num];Log[i] = Log[i>>1]+1;}for(int j = 1; j <= N; j++){for(int i = 1; i+(1<<j)-1<=n; i++){ans[i][j] = max(ans[i][j-1],ans[i+(1<<j-1)][j-1]);}}scanf("%d",&que);while(que--){scanf("%d%d",&x,&y);int temp = Log[y-x+1];printf("%d\n",max(ans[x][temp],ans[y-(1<<temp)+1][temp]));}}return 0;}```
/*
ST算法模板
*/
```c#include<stdio.h>#include<algorithm>using namespace std;#define MAX 1000005#define N 30int Log[MAX],ans[MAX][N],num[MAX];int n,que,x,y;int main(){int i,j,c,T;scanf("%d",&T);while(T--){scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&num[i]);}Log[0]=-1;for(i=1;i<=n;i++){ans[i][0]=num[i];Log[i]=Log[i>>1]+1;}for(j=1;j<=N;j++){for(i=1;i+(1<<j)-1<=n;i++){ans[i][j]=max(ans[i][j-1],ans[i+(1<<j-1)][j-1]);//若求最小值就是min()}}scanf("%d",&que);while(que--){scanf("%d%d",&x,&y);int temp=Log[y-x+1];printf("%d\n",max(ans[x][temp],ans[y-(1<<temp)+1][temp]));}}return 0;}
/*
用树状数组解决,待找出问题代码
*/
```c#include <stdio.h>#include <algorithm>using namespace std;const int n = 1e6 + 2;int a[n],b[n],N,c[n];int lowbit(int x){return x&-x;}void update_max(int x,int k){for(int i = x; i <= N; i+=lowbit(i)){c[i] = max(k,c[i]);}}int getmax(int l,int r){int y = a[b[r]];while(1){y = max(y,a[b[r]]);if(l == r) break;for(r--; r-l >= lowbit(r); r-=lowbit(r))y = max(y,c[r]);}return y;}int main(){for(int i = 1; i <= 1e6; i++){for(int j = i; j <= 1e6; j+=i){a[j]++;}}int t;scanf("%d",&t);while(t--){scanf("%d",&N);for(int i = 1; i <= N; i++){scanf("%d",&b[i]);update_max(i,a[b[i]]);}int q;scanf("%d",&q);while(q--){int li,ri;scanf("%d%d",&li,&ri);printf("%d\n",getmax(li,ri));}}return 0;}

1470: 区间求最值(RMQ问题,ST算法模板)相关推荐

  1. RMQ的ST算法(区间最值)

    ST算法求解RMQ问题(区间最值) 效率:O(n log n)预处理,O(1)询问 思想: 用 f [ i ][ j ] 表示 以i 开头的区间,包括2^j 个元素的一段区间的最值 那么有初始化的初始 ...

  2. 『ACM-算法-ST算法』信息竞赛进阶指南--区间最值问题的ST算法

    借助倍增和动态规划可以实现O(1)的时间复杂度的查询 预处理: ①区间DP 转移方程 f[i][j] = min(MAX同理)(f[i][j - 1],f[i + ][j - 1]) f[i][j]表 ...

  3. RMQ问题(区间求最值)

    RMQ的树状数组实现: #include <stdio.h> #define N 100005 int idx[N]; int num[N]; int n,m,l,r,i,j; int m ...

  4. 动态规划-RMQ问题(ST算法)

    文章目录 RMQ问题 ST算法 模板 例题 P2251 质量检测 P1816 忠诚 P2216 [HAOI2007]理想的正方形 RMQ问题 RMQ(Range Minimum/Maximum Que ...

  5. F - Anti-Rhyme Pairs(rmq算法模板)(后缀数组算法模板)

    点击打开链接 题目大意:通常押韵的两个词以相同的字符结尾.我们运用这个特性来规定反押韵的概念.反押韵是一对拥有近似开头的单词.一对单词的反押韵的复杂度被定义为两者都以之开头且最长的字符串S的长度.因此 ...

  6. 数据结构:线段树及ST算法比较

    ST算法是一种高效的计算区间最值的方法. 他的思想是将询问区间分解成两个最长的二次幂的长度的区间并集的形式. 所以与线段树不同,这种区间分解其实存在相交的分解. 因此ST算法能维护的只是一些简单的信息 ...

  7. ST算法 - RMQ(区间最值问题)—— 倍增

    文章目录 引入倍增: 例题1:区间和 例题2:Genius ACM 应用: ST算法 求解 RMQ(区间最值问题) 模板Code: 练习题: ST算法 维护区间最大公约数 例题:Pair of Num ...

  8. Matlabe绘图plot求单调区间极大极小最值问题

    文章目录 Matlabe绘图单调区间极大值 求函数极值 求单调区间 求某区间最值问题 format函数的调用格式 Matlabe绘图单调区间极大值 二维绘图 图1 t=[0:0.01:1]; q1=1 ...

  9. RMQ问题(线段树算法,ST算法优化)

    RMQ (Range Minimum/Maximum Query)问题是指: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在[i,j]里的最小(大)值 ...

最新文章

  1. Print All JVM Flags
  2. 一家创业公司发展历程-真实记录
  3. ov7725摄像头调试经验-寄存器配置
  4. Jeecg-P3 1.0.1版本发布,轻量级微服务框架
  5. java之歌_程序员之歌
  6. Bootstrap HTML编码规范之属性顺序
  7. OpenCV2中矩阵的归一化 normalize函数详解
  8. 自己做网站需要考虑的问题
  9. 如何使用 Python 将 Nifti 文件转换为 Dicom 系列
  10. java程序设计实验报告代写_代做CS实验报告、代写java c/c++ CS课程设计作业、代写程序作业...
  11. RGB,CMY(K),YUV,YIQ,YCbCr颜色的转换算法(java实现)
  12. Hadoop 集群在WebUI界面不能下载文件
  13. 关于android读取用户号码,手机串号,SIM卡序列号
  14. 微信小程序之根据经纬度反查地址
  15. linux5关闭apic服务,Linux中断 - APIC
  16. 根据year年的第week周,查询第week周的起止时间
  17. 计算机专业本科毕业生去当兵,本科毕业去当兵如何?过来人是这么说的,很有道理!...
  18. 线性模型出现非正定矩阵的问题解释
  19. 全球及中国电影市场品牌建设发展及投资潜力预测报告2021-2027年
  20. CASS横断面成果转纬地格式(txt)

热门文章

  1. matlab怎么把变量一起换掉,MATLAB只是简单地把表达式里的变量名替换成数值,而不给出结果...
  2. 计算机网络-基本概念(11)【应用层】
  3. Ubuntu16.04安装jdk8
  4. Python开发者的完美终端工具
  5. 腾讯年度性爱报告被曝,最后一条数据我羞愧了!
  6. 又到 6 月底,想来和你聊一聊毕业季,愿你前程似锦!
  7. ksweb如何安装php5.6_php5 安装 swoole 模块
  8. mysql web日志_mysql日志管理
  9. ubuntu16.04安装R及RStudio
  10. 基础-快速排序(基本)