1470: 区间求最值
Time Limit: 1 Sec Memory Limit: 128 MB
Description
给定一个长度为N 的数组,有q个询问,每个询问是求在数组的一段区间内那个元素的因子的个数最大,比如24的因子的个数就是8。
Input
首先是一个整数t,表示有t组测试数据,每组测试数据的第一行是一个整数N(1<=N<=10^6 ),第二行有N个整数ai(1<=ai<=10^6 ,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
【分析】
最先想到的就是,先把所有数的因子数算出来存在yzs数组里,然后当输入N个元素的时候,就直接取出相应的因子数,然后再进行q次问答的时候,只需要对区间进行遍历就好了;
【代码】
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <bits/stdc++.h>
using namespace std;
int ls[1000005],yzs[1000005]= {0};
int t,q,n,a,b;
int main()
{
for(int i=1;i<=1000000;i++)//用筛选法算出因子数,这里的因子数包括1和本身
{
for(int j=i;j<=1000000;j+=i)
yzs[j]++;
}
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int k;
for(int i=1; i<=n; i++)
{
scanf("%d",&k);//输入N个元素时,取出相应的因子数
ls[i]=yzs[k];
}
scanf("%d",&q);
for(int i=0; i<q; i++)
{
scanf("%d%d",&a,&b);
int max1=-1;
for(int j=a; j<=b; j++)//区间遍历取出答案
{
max1=max(ls[j],max1);
}
printf("%d\n",max1);
}
}
return 0;
}