·· / ·– ·· ·-·· ·-·· / ·–· · ·-· ··· ·· ··· - / ··- -· - ·· ·-·· / ·· / ·– ·· -·
題目來源:http://poj.org/problem?id=3264
這題是基本的rmq問題,可以用st算法來解決。本來是不想把這題貼上來的,但代碼裏有個奇怪的鯁!
代碼裏的u,v一定要定義到全局,否則直接wa,但是u,v在main外沒有任何調用啊!
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int f[50000][30],n,q,u,v;//U & V must be defined here??
int f2[50000][30];
void init_rmq () {
for (int j=1;j<=20;j++)
for (int i=1;i<=n;i++)
if (i+(1<<j)-1<=n) {
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
f2[i][j]=min(f2[i][j-1],f2[i+(1<<(j-1))][j-1]);
}
}
int query_rmq (int i,int j) {
int k=floor(log(j-i+1)/log(2));
return (max(f[i][k],f[j-(1<<k)+1][k])-min(f2[i][k],f2[j-(1<<k)+1][k]));
}
int main () {
//int u,v;This will make WA!Why??
scanf("%d%d",&n,&q);
for (int i=1;i<=n;i++) {
scanf("%d",&f[i][0]);
f2[i][0]=f[i][0];
}
init_rmq();
for (int i=1;i<=q;i++) {
scanf("%d%d",&u,&v);
printf("%d\n",query_rmq(u,v));
}
}