1. 程式人生 > >zcmu 1470: 區間求最值

zcmu 1470: 區間求最值

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; }