zoukankan      html  css  js  c++  java
  • nyist OJ 119 士兵杀敌(三) RMQ问题 Anti

    士兵杀敌(三)

    时间限制:2000 ms  |  内存限制:65535 KB
    难度:5
     
    描述

    南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进行比较,计算出两个人的杀敌数差值,用这种方法一方面能鼓舞杀敌数高的人,另一方面也算是批评杀敌数低的人,起到了很好的效果。

    所以,南将军经常问军师小工第i号士兵到第j号士兵中,杀敌数最高的人与杀敌数最低的人之间军功差值是多少。

    现在,请你写一个程序,帮小工回答南将军每次的询问吧。

    注意,南将军可能询问很多次。

     
    输入
    只有一组测试数据
    第一行是两个整数N,Q,其中N表示士兵的总数。Q表示南将军询问的次数。(1<N<=100000,1<Q<=1000000)
    随后的一行有N个整数Vi(0<=Vi<100000000),分别表示每个人的杀敌数。
    再之后的Q行,每行有两个正正数m,n,表示南将军询问的是第m号士兵到第n号士兵。
    输出
    对于每次询问,输出第m号士兵到第n号士兵之间所有士兵杀敌数的最大值与最小值的差。
    样例输入
    5 2
    1 2 6 9 3
    1 2
    2 4
    样例输出
    1
    7



    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    int dpMax[100010][35], dpMin[100010][35], a[100010];
    int RMaxQ(int l, int r)
    {
        int k = log(1.0 * r-l+1)/log(2.0);
        return max(dpMax[l][k], dpMax[r-(1<<k)+1][k]);
    }
    int RMinQ(int l, int r)
    {
        int k = log(1.0 * r-l+1)/log(2.0);
        return min(dpMin[l][k], dpMin[r-(1<<k)+1][k]);
    }
    int main()
    {
        int n, q, l, r;
        scanf("%d %d", &n, &q);
        for(int i = 1; i <= n; i++)
        {
            scanf("%d", &a[i]);
            dpMax[i][0] = dpMin[i][0] = a[i];
        }
        for(int j = 1; (1<<j) <= n; j++)
            for(int i = 1; i+(1<<j)-1 <= n; i++)
            {
                dpMax[i][j] = max(dpMax[i][j-1], dpMax[i+(1<<(j-1))][j-1]);
                dpMin[i][j] = min(dpMin[i][j-1], dpMin[i+(1<<(j-1))][j-1]);
            }
        while(q--)
        {
            scanf("%d %d", &l, &r);
            printf("%d\n", RMaxQ(l, r) - RMinQ(l, r));
        }
        return 0;
    }
  • 相关阅读:
    【游戏】有趣的小游戏合集
    “卖我一枝笔”:如何史蒂夫·乔布斯将这一经典问题作出回应?
    Codeforces548D:Mike and Feet(单调栈)
    一对多自身关联双向映射
    MVC action返回partialView前台html 拼接
    c#关于委托和事件
    中国A股市场缘何遭遇9连跌?
    vb.net 字符串的操作 应用
    BitNami Redmine Stack
    窥探内存管理
  • 原文地址:https://www.cnblogs.com/wolfred7464/p/3109902.html
Copyright © 2011-2022 走看看