POJ 3264

RMQ模板题

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <string.h>
 4 #include <cmath>
 5 using namespace std;
 6 const int N= 50002;
 7 int maxn[N][17],minn[N][17];
 8 int a[N];
 9 int n,q;
10 void getRMQ(){
11     for(int i=1;i<N;i++){maxn[i][0]=minn[i][0]=a[i];}
12     for(int j=1;j<17;j++){
13         for(int i=1;i<N;i++){
14             if(i+(1<<j)<N){
15                 maxn[i][j]=max(maxn[i][j-1],maxn[i+(1<<(j-1))][j-1]);
16                 minn[i][j]=min(minn[i][j-1],minn[i+(1<<(j-1))][j-1]);
17             }
18         }
19     }
20 }
21 int rmq(int l,int r){
22     int k=(int)(log((double)(r-l+1))/log(2.0));
23     int Max=max(maxn[l][k],maxn[r-(1<<k)+1][k]);
24     int Min=min(minn[l][k],minn[r-(1<<k)+1][k]);
25     return Max-Min;
26 }
27 int main(){
28     int l,r;
29     scanf("%d%d",&n,&q);
30     for(int i=1;i<=n;i++){
31         scanf("%d",&a[i]);
32     }
33     getRMQ();
34     while(q--){
35         scanf("%d%d",&l,&r);
36         printf("%d\n",rmq(l,r));
37     }
38     return 0;
39 }
时间: 2024-10-11 22:26:44

POJ 3264的相关文章

POJ 3264 RMQ裸题

POJ 3264 题意:n个数,问a[i]与a[j]间最大值与最小值之差. 总结:看了博客,记下了模板,但有些地方还是不太理解. #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<string> #include<cmath> #include<queue> #

poj 3264 Balanced Lineup

题目链接:http://poj.org/problem?id=3264 题目大意:就是给你一串数,问你最大数和最小数的差值....... 思路:最基本的线段树,只需要建树和查询,修改都省啦,但是查询要写两个,一个查询最大值,一个查询最小值......然后就能AC掉.....但是话说poj把它分类到RMQ中.... code: #include<cstdio> #include<cmath> #include<algorithm> #include<iostream

poj 3264 线段树

线段树太弱了,题目逼格一高连代码都读不懂,今天开始重刷线段树,每天一题,风格用kuangbin大神和以前的,两种都写一遍 RMQ做法:poj3264 1 /* 2 POJ 3264 Balanced Lineup 3 题目意思:给定Q(1<=Q<=200000)个数A1,A2,```,AQ, 4 多次求任一区间Ai-Aj中最大数和最小数的差 5 */ 6 #include<stdio.h> 7 #include<algorithm> 8 #include<iost

POJ 3264 RMQ Spare Table算法

今天下午大帝讲的,我以前也不懂,所以也就跟着学学了,把中间的那个状态转移方程学错了好几次,于是就wa了 好几发. #include<iostream> #include<cstdio> #include<algorithm> #define maxn 200010 using namespace std; int a[maxn],m,n,b[maxn],fl[maxn][50],fr[maxn][50]; void solve() { b[1]=0;//其实就是用来计算

[POJ] 3264 Balanced Lineup [ST算法]

Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 34306   Accepted: 16137 Case Time Limit: 2000MS Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer Joh

poj 3264 Balanced Lineup(线段数求区间最大最小值)

链接:http://poj.org/problem?id=3264 Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 32772   Accepted: 15421 Case Time Limit: 2000MS Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order.

POJ 3264 Balanced Lineup(st或者线段树)

A - Balanced Lineup Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3264 Appoint description:  System Crawler  (2015-08-03) Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,00

POJ 3264 Balanced Lineup ST表

链接:http://poj.org/problem?id=3264 题意:给一串数字,多次询问,求区间最大值和区间最小值的差. 思路:RMQ问题,可以用O(N^2)的预处理,然后每次O(1)的查询,可以用线段树,O(N)的建树,O(logN)的查询,可以用ST表记录,O(NlogN)的预处理,O(1)的查询. 实际上ST表的预处理过程也是一个DP的过程dp[i][j]表示从第i位开始连续2^j位的区间最值. 预处理:dp[i][j]=min(dp[i][j],dp[i+2^j][j]),查询:q

POJ 3264 Balanced Lineup (线段树||RMQ)

A - Balanced Lineup Crawling in process... Crawling failed Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3264 Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always li

poj 3264 Balanced Lineup【RMQ-ST查询区间最大最小值之差 +模板应用】

题目地址:http://poj.org/problem?id=3264 Sample Input 6 3 1 7 3 4 2 5 1 5 4 6 2 2 Sample Output 6 3 0分析:标准的模板题,可以用线段树写,但用RMQ-ST来写代码比较短.每次输出区间[L, R]内最大值和最小值的差是多少.注意一个地方,代码里面用到了log2()函数,但是我用包含<math.h>和<cmath>头文件的代码以C++的方式提交到POJ反馈是编译错误.改成g++提交才AC了.(注意