zoukankan      html  css  js  c++  java
  • hiho一下十六周 RMQ-ST算法

    RMQ-ST算法

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    小Hi和小Ho在美国旅行了相当长的一段时间之后,终于准备要回国啦!而在回国之前,他们准备去超市采购一些当地特产——比如汉堡(大雾)之类的回国。

    但等到了超市之后,小Hi和小Ho发现者超市拥有的商品种类实在太多了——他们实在看不过来了!于是小Hi决定向小Ho委派一个任务:假设整个货架上从左到右拜访了N种商品,并且依次标号为1到N,每次小Hi都给出一段区间[L, R],小Ho要做的是选出标号在这个区间内的所有商品重量最轻的一种,并且告诉小Hi这个商品的重量,于是他们就可以毫不费劲的买上一大堆东西了——多么可悲的选择困难症患者。

    (虽然说每次给出的区间仍然要小Hi来进行决定——但是小Hi最终机智的选择了使用随机数生成这些区间!但是为什么小Hi不直接使用随机数生成购物清单呢?——问那么多做什么!)

    输入

    每个测试点(输入文件)有且仅有一组测试数据。

    每组测试数据的第1行为一个整数N,意义如前文所述。

    每组测试数据的第2行为N个整数,分别描述每种商品的重量,其中第i个整数表示标号为i的商品的重量weight_i。

    每组测试数据的第3行为一个整数Q,表示小Hi总共询问的次数。

    每组测试数据的第N+4~N+Q+3行,每行分别描述一个询问,其中第N+i+3行为两个整数Li, Ri,表示小Hi询问的一个区间[Li, Ri]。

    对于100%的数据,满足N<=10^6,Q<=10^6, 1<=Li<=Ri<=N,0<weight_i<=10^4。

    输出

    对于每组测试数据,对于每个小Hi的询问,按照在输入中出现的顺序,各输出一行,表示查询的结果:标号在区间[Li, Ri]中的所有商品中重量最轻的商品的重量。

    样例输入
    10
    7334
    1556
    8286
    1640
    2699
    4807
    8068
    981
    4120
    2179
    5
    3 4
    2 8
    2 4
    6 8
    7 10
    样例输出
    1640
    981
    1556
    981
    981

    【分析】RMQ查询区间最值。
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <string>
    #include <map>
    #include <stack>
    #include <queue>
    #include <vector>
    #define inf 2e9
    #define met(a,b) memset(a,b,sizeof a)
    typedef long long ll;
    using namespace std;
    const int N = 1e6+5;
    const int M = 4e5+5;
    int dp[N][21];
    int n,a[N],m;
    void RMQ_INIT(){
        for(int i=1;i<=n;i++)dp[i][0]=a[i];
        for(int j=1;1<<j<=n;j++){
            for(int i=1;i+(1<<(j-1))<=n;i++){
                int k=i+(1<<(j-1));
                dp[i][j]=min(dp[i][j-1],dp[k][j-1]);
            }
        }
    }
    int RMQ_Query(int l,int r)  {
        int k=0;
        while(1<<(k+1)<=r-l+1)  k++;
        return min(dp[l][k],dp[r-(1<<k)+1][k]);
    }
    int main (){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    RMQ_INIT();
    int l,r; scanf("%d",&m); while(m--){ scanf("%d%d",&l,&r); printf("%d ",RMQ_Query(l,r)); } return 0; }
     
  • 相关阅读:
    Educational Codeforces Round 85 D. Minimum Euler Cycle(模拟/数学/图)
    Educational Codeforces Round 85 C. Circle of Monsters(贪心)
    NOIP 2017 提高组 DAY1 T1小凯的疑惑(二元一次不定方程)
    Educational Codeforces Round 85 B. Middle Class(排序/贪心/水题)
    Educational Codeforces Round 85 A. Level Statistics(水题)
    IOS中的三大事件
    用Quartz 2D画小黄人
    strong、weak、copy、assign 在命名属性时候怎么用
    用代码生成UINavigationController 与UITabBarController相结合的简单QQ框架(部分)
    Attempting to badge the application icon but haven't received permission from the user to badge the application错误解决办法
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/6133431.html
Copyright © 2011-2022 走看看