[POJ3264]Balanced Lineup 做題筆記

·· / ·– ·· ·-·· ·-·· / ·–· · ·-· ··· ·· ··· - / ··- -· - ·· ·-·· / ·· / ·– ·· -·
題目來源: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));
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章