刷过一题之区间最小值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷过一题之区间最小值相关的知识,希望对你有一定的参考价值。
长度为n的数列A,以及q个询问,每次询问一段区间的最小值。
输入
第一行,一个整数n
第二行,n个数,表示A数组,用空格隔开。
第三行,一个正整数q
第4到第q+3行每行两个正整数L、R(L<=R),表示一段区间,用一个空格隔开。
输出
针对每个询问,输出结果。每个结果占一行。
输入示例
5
3 2 4 3 5
3
1 3
2 5
3 4
输出示例
2
2
3
数据规模:n, q, Ai<=100000
这题的难点就在于如何做预处理。对于预处理的大表,我们只需要打印其中2^n行,其余行就可以进行区间覆盖。
1 #include<iostream> 2 using namespace std; 3 int s[17][100005],ll=1,l; 4 int n[100005]; 5 int main() 6 { 7 int pl; 8 scanf("%d",&pl); 9 for(int i=0;i<pl;i++) {scanf("%d",&n[i]);s[0][i]=n[i];} 10 for(;ll<pl;ll*=2) l++; 11 l-=1; 12 for(int i=1;i<=l;i++) 13 for(int j=0;j<pl;j++) 14 s[i][j]=min(s[i-1][j],s[i-1][min(j+(1<<(i-1)),pl-1)]); 15 int a; 16 scanf("%d",&a); 17 for(int i=0;i<a;i++) 18 { 19 int x,y; 20 scanf("%d%d",&x,&y); 21 int con=y-x+1; 22 int temp=0; 23 ll=1; 24 for(;ll<con;ll*=2) temp++; 25 if(temp==0) temp=1; 26 ll/=2; 27 if(ll==0) ll=1; 28 printf("%d\n",min(s[temp-1][x-1],s[temp-1][y-ll])); 29 } 30 //system("pause>nul"); 31 return 0; 32 }
以上是关于刷过一题之区间最小值的主要内容,如果未能解决你的问题,请参考以下文章