首页 > 代码库 > POJ 3264:Balanced Lineup(RMQ模板题)
POJ 3264:Balanced Lineup(RMQ模板题)
http://poj.org/problem?id=3264
题意:给出n个数,还有q个询问,询问[l,r]区间里面最大值和最小值的差值。
思路:RMQ模板题,开两个数组维护最大值和最小值就行。
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 using namespace std; 6 #define N 50010 7 #define INF 0x3f3f3f3f 8 int dpmin[N][20], dpmax[N][20], n; 9 10 void Init() {11 memset(dpmin, INF, sizeof(dpmin));12 for(int i = 1; i <= n; i++) { scanf("%d", &dpmin[i][0]); dpmax[i][0] = dpmin[i][0]; }13 int limit = (int)(log(n) / log(2));14 for(int j = 1; j <= limit; j++)15 for(int i = 1; i + (1 << j) - 1 <= n; i++)16 dpmin[i][j] = min(dpmin[i][j-1], dpmin[i+(1<<(j-1))][j-1]), dpmax[i][j] = max(dpmax[i][j-1], dpmax[i+(1<<(j-1))][j-1]);17 }18 19 int Query(int l, int r) {20 int k = (int)(log(r - l + 1) / log(2));21 return max(dpmax[l][k], dpmax[r-(1<<k)+1][k]) - min(dpmin[l][k], dpmin[r-(1<<k)+1][k]);22 }23 24 int main() {25 int q;26 while(~scanf("%d%d", &n, &q)) {27 Init();28 while(q--) {29 int l, r; scanf("%d%d", &l, &r);30 printf("%d\n", Query(l, r));31 }32 }33 return 0;34 }
POJ 3264:Balanced Lineup(RMQ模板题)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。