complexity: nlgn
#include<stdio.h>
#include<stdlib.h>
#define REP(i, b, n) for (int i = b; i < n; i++)
#define rep(i, n) REP(i, 0, n)
#define N 100
//RMQ離線算法 O(N*logN)+O(1)
// INIT: val[]為待查詢數組, initrmq(n);
int st[20][N], val[N];
int min(int a,int b){return a<b?a:b;}
void initrmq(int n){
int i, j, k, sk;
for (i = 0; i < n; i++) st[0][i] = val[i];
for (i = 1, k = 2; k < n; i++, k <<= 1) {
for (j = 0, sk = (k >> 1); j+k-1 < n; ++j, ++sk)
st[i][j] = min(st[i-1][j],st[i-1][sk]);
}
}
int query(int x, int y) // min of { val[x] ... val[y] }
{
int bl = 31-__builtin_clz(y-x+1);
return min(st[bl][x], st[bl][y-(1<<bl)+1]);
}
int main(){
rep(i,N)val[i]=i;
initrmq(N);
rep(i,20){
int c=rand()%60,d=rand()%100;
while(d<c)d=rand()%100;
printf("(%d %d): %d\n",c,d,query(c,d));
}
}
沒有留言:
張貼留言