pku 3264
題意:給定n個奶牛的高度,求區間[s,e]中最高與最低高度的差值。
rmq模板題目:
求出最高最低然後求差。
注意這裡f[i][j]表示從j開始的2^i次方個數的最值。
view code
#include #includepku frequent values#include
#include
#define maxn 50007
#define n 22
using
namespace
std;
intfmin[n][maxn],fmax[n][maxn];
intpow2[n],a[maxn];
void init_rmq(int
len)
}}int rmq(int s,int
e)int
main()
return0;
}
題意:給定長度為n的不降序列,求詢問區間[s,e]內出現頻率最高的頻率;
思路:本題可用線段樹的區間合併來做:
rmq做法,首先將其離散化相同的點對映到乙個點上,並記錄該點能夠達到的最左端點最有端點;
分三種情況討論[s,e]
hash[i]位i離散化後對應的新序號,r[hash[i]]表示i離散化後的點能夠到達的最右端,l[hash[i]]表示i離散化後的點能夠到達的最左端,
1:如果s與e對應的離散化後的點為同一點則頻率為 e - s + 1;(1,1,1,1)
2:如果s與e所對應的離散化後的點相差1則頻率為 li = r[hash[l]] - l + 1; ri = r - l[hash[r]] + 1; max(li,ri); (1 1 3 3)
3:如果s與e所對應的離散化後的點相差大於1則頻率為
li = r[hash[l]] - l + 1;
ri = r - l[hash[r]] + 1;
li = max(li,ri);
ri = rmq(hash[l] + 1,hash[r] - 1);
max(li,ri);
view code
#include #include#include
#include
#define maxn 100007
using
namespace
std;
inthash[maxn],l[maxn],r[maxn];
int a[maxn],f[maxn][22],pow2[22
];void init_rmq(int
len)
}int rmq(int s,int
e)void solve(int l,int
r)
else
if (hash[l] + 1 ==hash[r])
else
}int
main()
else
}f[cnt][
0] = r[cnt] - l[cnt] + 1
; init_rmq(cnt);
ints,e;
while (q--)
}return0;
}
再談RMQ演算法
大家知道rmq演算法就是求乙個區間裡的任意區間的最大值和最小值的高效演算法,因為只需要乙個預處理就可以在o 1 的時間裡算出任意區間的最值。所以當遇到在乙個區間裡求最值之差不超過某乙個數的最長子區間問題就可以利用該方法,當然還需要用到二分演算法。舉個例子 在8,4,2,4,3,2,4,5,2,6這個...
RMQ演算法總結
給定乙個陣列,查詢陣列給定範圍內的最值。void rmq int num 預處理 o nlogn 演算法主體 for int j 1 j 20 j for int i 1 i num i if i 1 j 1 num maxsum i j max maxsum i j 1 maxsum i 1 j ...
RMQ演算法詳解
下面我們從乙個實際問題來解釋rmq 我們假設陣列arr為 1,3,6,7,4,2,5 我們設二維陣列dp i j 表示從第i位開始連續2 j個數中的最小值。例如dp 2 1 就表示從第二位數開始連續兩個數的最小值 也就是從第二位數到第三位數的最小值 即3,6中的最小值,所以dp 2 1 3 其實我們...