• nyoj 119 士兵杀敌(三)(RMQ)


    士兵杀敌(三)

    时间限制: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

    RMQ算法详解


    #include<stdio.h>
    #include<string.h>
    #include<vector>
    #include<map>
    #include<queue>
    #include<stack>
    #include<cstdio> 
    #include<string>
    #include<math.h>
    #include<algorithm>
    #define LL long long
    #define PI atan(1.0)*4
    #define DD double
    #define MAX 100100
    #define mod 10003
    #define INF 0x3f3f3f3f
    using namespace std;
    int A[MAX];
    int n,m;
    int Amax[MAX][50],Amin[MAX][50];
    void RMQ()
    {
    	int i,j;
    	for(i=1;i<=n;i++)
    	    Amax[i][0]=Amin[i][0]=A[i];
    	for(j=1;(1<<j)<=n;j++)
    	{
    		for(i=1;i+(1<<j)-1<=n;i++)
    		{
    			Amin[i][j] = min(Amin[i][j-1], Amin[i + (1<<(j-1))][j-1]);
                Amax[i][j] = max(Amax[i][j-1], Amax[i + (1<<(j-1))][j-1]);
    		}
    	}
    }
    int find(int l,int r)
    {
    	int k=0;
    	while(1<<(k+1)<=r-l+1) k++;
    	return max(Amax[l][k],Amax[r-(1<<k)+1][k])-min(Amin[l][k],Amin[r-(1<<k)+1][k]);
    }
    int main()
    {
        int j,i,t,k,a,b;
    	while(scanf("%d%d",&n,&m)!=EOF)
    	{
    		for(i=1;i<=n;i++)
    		    scanf("%d",&A[i]);	
    		RMQ();
    		while(m--)
    		{
    			scanf("%d%d",&a,&b);
    			printf("%d
    ",find(a,b));
    		}
    	} 
        return 0;
    }
    

      

  • 相关阅读:
    WPF的布局--DockPanel
    WPF的布局--StackPanel
    C#中的不可空类型转为可空类型
    linux下安装nodejs及npm
    HTML DOM 事件对象 ondragend 事件
    pc端页面在移动端显示问题
    css设置文字上下居中,一行文字居中,两行或多行文字同样居中。
    超简单的gif图制作工具
    Git创建与合并分支
    props default 数组/对象的默认值应当由一个工厂函数返回
  • 原文地址:https://www.cnblogs.com/tonghao/p/5369960.html
Copyright © 2020-2023  润新知