-
题目描述:
-
给定一个数字序列,查询任意给定区间内数字的最小值。
-
输入:
-
输入包含多组测试用例,每组测试用例的开头为一个整数n(1<=n<=100000),代表数字序列的长度。
接下去一行给出n个数字,代表数字序列。数字在int范围内。
下一行为一个整数t(1<=t<=10000),代表查询的次数。
最后t行,每行给出一个查询,由两个整数表示l、r(1<=l<=r<=n)。
-
输出:
-
对于每个查询,输出区间[l,r]内的最小值。
-
-
-
大二暑假做过的。。。。。我现在能记得啊???明天翻翻大白再来a吧。。。
-
-
-
看了没有超过5分钟,然后开写,然后
-
九度挂了,到时候再来提交吧。。。
-
-
-
-
-
-
#include <iostream>
#include <queue>
#include <iomanip>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <set>
#include <sstream>
#include <cstring>
using namespace std;
int nums[100001];
int dp[100001][20];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&nums[i]);
}
for(int i=1;i<=n;i++)
{
dp[i][0]=nums[i];
}
for(int j=1;(1<<j)<=n;j++)
{
for(int i=1;i+(1<<j)-1<=n;i++)
{
dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
}
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
int l,r;
scanf("%d %d",&l,&r);
int k=-1;
while((1<<(k+1))<=(r-l+1))
k++;
printf("%d\n",min(dp[l][k],dp[r-(1<<k)+1][k]));
}
}
return 0;
}