RMQ 模板题 poj 3264

题目:点这里

题意:给一个长度n的数列,然后又Q个询问,问L   到R   中最大值与最小值的差。

分析:RMQ 的模板题。

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int max_=50005;
int minm,maxm;
int dp_max[max_][20],dp_min[max_][20];
int a[max_];
void RMQ_init(int n)
{
    for(int i=1;i<=n;i++)
       dp_max[i][0]=a[i],
       dp_min[i][0]=a[i];
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i+(1<<j)-1<=n;i++)
    {
        dp_max[i][j]=max(dp_max[i][j-1],dp_max[i+(1<<(j-1))][j-1]);
        dp_min[i][j]=min(dp_min[i][j-1],dp_min[i+(1<<(j-1))][j-1]);
    }
}
void RMQ_Q(int L,int R)
{
    int k=0;
    while((1<<(k+1))<=R-L+1)k++;
    minm=min(dp_min[L][k],dp_min[R+1-(1<<k)][k]);
    maxm=max(dp_max[L][k],dp_max[R+1-(1<<k)][k]);
}
int main()
{
    int n,m;
  scanf("%d %d",&n,&m);
        for(int i=1;i<=n;i++)
           scanf("%d",&a[i]);
        RMQ_init(n);
        while(m--)
        {
            int l,r;
            cin>>l>>r;
            RMQ_Q(l,r);
           printf("%d\n",maxm-minm);
        }
}

用  cin  和cout  会超时……

原文地址:https://www.cnblogs.com/linhaitai/p/9707557.html

时间: 2025-01-05 04:32:16

RMQ 模板题 poj 3264的相关文章

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

字典树模板题 POJ 2503

1 #include <cstdio> 2 #include <cstring> 3 4 char en[11],fr[11]; 5 int st; 6 struct Tire{ 7 int next[26]; 8 char eng[11]; 9 }node[200005]; 10 void insert(char *s,int cur) 11 { 12 if(*s){ 13 if(!node[cur].next[*s-'a']) 14 node[cur].next[*s-'a']

静态RMQ模板题 contest 静态RMQ T2

Description Wind设计了很多机器人.但是它们都认为自己是最强的,于是,一场比赛开始了.机器人们都想知道谁是最敏捷的,于是它们进行了如下一个比赛.首先,他们面前会有一排共n个数,它们比赛看谁能最先把每连续k个数中最大和最小值写下来,当然,这些机器人运算速度都很快,它们比赛的是谁写得快.但是Wind也想知道答案,你能帮助他吗? Input 每组测试数据,第1行为n,k,第2行共n个数,为数字序列,所有数字均在longint范围内. Output 共n-k+1行 第i行为第i-i+k-1

最小生成树模板题POJ - 1287-prim+kruskal

POJ - 1287超级模板题 大概意思就是点的编号从1到N,会给你m条边,可能两个点之间有多条边这种情况,求最小生成树总长度? 这题就不解释了,总结就算,prim是类似dijkstra,从第一个点出发,每次走这个点没走过的最小边权值,这样不断找下去就可以找出,本质就是贪心算法 而kruskal是利用并查集,先按照边权值大小排序,然后从小的边开始往里面添加边,利用并查集判断是否在一个联通分量里面(就是是否相连)如果不相 连就建立边,从而建图,注意,节点编号如果是从1->n,那么相应初始化就应该从

数论 - 欧拉函数模板题 --- poj 2407 : Relatives

Relatives Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11372   Accepted: 5544 Description Given n, a positive integer, how many positive integers less than n are relatively prime to n? Two integers a and b are relatively prime if ther

后缀数组 - 求最长公共子序列 + 模板题 : poj 2774

// Memory Time // 1347K 0MS // by : Snarl_jsb // 2014-09-24-19.57 #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<vector> #include<queue> #include<stack>

POJ 3264:Balanced Lineup Rmq模板

Balanced Lineup 题目链接: http://poj.org/problem?id=3264 题意: 求区间最大值和最小值的差 题解: Rmq模板题 代码 #include<stdio.h> #include<math.h> const int N=5e4+1; int dpmax[N][17]; int dpmin[N][17]; int mmax(int x,int y) { return x>y?x:y; } int mmin(int x,int y) {

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+

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> #