hunnu11460 區間求最值(線段樹模板)

2021-08-02 03:51:00 字數 2124 閱讀 9872

區間求最值

time limit:3000ms,special time limit:7500ms,memory limit:32768kb

total submit users:83,accepted users:60

problem 11460 :no special judgement

problem 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

102 3 5 6 9 11 12 36 39 44

32 6

3 83 9

sample output

4

99

解題思路:先打表求出1000000以內每個數的因子個數,然後線段樹求區間最大值,用rmq會爆記憶體

#include #include #include #include #include #include #include #include #include #include using namespace std;  

typedef __int64 ll;

const int n = 1000008;

const int m = 5007;

const int inf = 0x3fffffff;

const int mod = 1e9+7;

const double pi = acos(-1.0);

const double sm = 1e-9;

int rec[n<<2];//sum求和,add為懶惰標記

int a[n];//存原陣列資料下標[1,n]

//pushup函式更新節點資訊 ,這裡是求和

void pushup(int rt)

//build函式建樹

void build(int l,int r,int rt)

int m=(l+r)>>1;

//左右遞迴

build(l,m,rt<<1);

build(m+1,r,rt<<1|1);

//更新資訊

pushup(rt);

} int query(int l,int r,int l,int r,int rt)

int m=(l+r)>>1;

//累計答案

int ans=0;

if(l <= m) ans=max(ans,query(l,r,l,m,rt<<1));

if(r > m) ans=max(ans,query(l,r,m+1,r,rt<<1|1));

return ans;

}

int num[n];

void getnumdivisor( int n ) }}

int main()

build(1,n,1);

scanf("%d",&m);

for( int i = 0 ; i < m ; ++i )

} return 0;

}

6 8 區間最值

時間限制 3秒 空間限制 131072k 給定乙個陣列序列,需要求選出乙個區間,使得該區間是所有區間中經過如下計算的值最大的乙個 區間中的最小數 區間所有數的和最後程式輸出經過計算後的最大值即可,不需要輸出具體的區間。如給定序列 6 2 1 則根據上述公式,可得到所有可以選定各個區間的計算值 6 6...

RMQ求區間最值

rmq演算法,是乙個快速求區間最值的離線演算法,預處理時間複雜度o n log n 查詢o 1 所以是乙個很快速的演算法,當然這個問題用線段樹同樣能夠解決。問題 給出n個數ai,讓你快速查詢某個區間的的最值。一 首先是預處理,用動態規劃 dp 解決。設a i 是要求區間最值的數列,f i,j 表示從...

RMQ 求區間最值

rmq演算法,是乙個快速求區間最值的離線演算法,預處理時間複雜度o n log n 查詢o 1 概念 rmq range minimum maximum query 即區間最值查詢,是指這樣乙個問題 對於長度為n的數列a,回答若干詢問rmq a,i,j i,j n 返回數列a中下標在i,j之間的最小...