士兵杀敌(三)

时间限制: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算法,RMQ比较省时间,相对较优秀,

其实线段树也是比较常规的方法;
代码如下:线段树
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxx=;
int a[maxx];
int big,small;
struct node
{
int left,right;
int Max,Min;
}tree[*maxx];
void build(int l,int r,int v)
{
tree[v].left=l;
tree[v].right=r;
if(l==r)
{
tree[v].Max=a[l];
tree[v].Min=a[l];
return ;
}
int mid=(l+r)>>;
build(l,mid,v*);
build(mid+,r,v*+);
tree[v].Max=max(tree[*v].Max,tree[*v+].Max);
tree[v].Min=min(tree[*v].Min,tree[*v+].Min);
}
void query(int a,int b,int v)
{
if(tree[v].left==a && tree[v].right==b)
{
if(tree[v].Max>big) big=tree[v].Max;
if(tree[v].Min<small) small=tree[v].Min;
return ;
}
int mid=(tree[v].left+tree[v].right)>>;
if(b<=mid) query(a,b,*v);
else if(a>mid) query(a,b,*v+);
else
{
query(a,mid,v*);
query(mid+,b,v*+);
}
}
int main()
{
int n,m,q,l,r,i;
scanf("%d%d",&n,&q);
for(i=;i<=n;i++)
scanf("%d",&a[i]);
build(,n,);
for(i=;i<q;i++)
{
scanf("%d%d",&l,&r);
big=-,small=;
query(l,r,);
printf("%d\n",big-small);
}
return ;
}

RMQ算法:

 #include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N=; int stmax[N][],stmin[N][],d[]; void init(int n)
{
int i,j;
d[]=;
for(i=;i<=;i++)d[i]=d[i-]<<;
for(i=;i<=n;i++){
scanf("%d",&stmax[i][]);
stmin[i][]=stmax[i][];
}
int len = int(log(n*1.0)/log(2.0));
for(j=;j<=len;j++)
for(i=;i<=n;i++)
if(i+d[j]-<=n)
{
stmax[i][j]=max(stmax[i][j-],stmax[i+d[j-]][j-]);
stmin[i][j]=min(stmin[i][j-],stmin[i+d[j-]][j-]);
}
}
void rmq(int q) //
{
int x,y,len;
while(q--)
{
scanf("%d%d",&x,&y);
len=int(log(y-x+1.0)/log(2.0));
int mmax=max(stmax[x][len],stmax[y-d[len]+][len]);
int mmin=min(stmin[x][len],stmin[y-d[len]+][len]);
printf("%d\n",mmax-mmin);
}
}
int main(){
int n, q;
scanf("%d%d",&n,&q);
init(n);
rmq(q);
return ;
}

nyoj119 士兵杀敌(三)的更多相关文章

  1. 士兵杀敌 三 --- O( 1 ) 的时间复杂度 .

    一看就是 十分简单的  题  ,   然后上去开始无脑程序 超时~~~      感觉时间复杂度 , 已经很低了  ,  但是并没有什么卵用 . #include<stdio.h> #in ...

  2. 士兵杀敌(三)_RMQ(区间最值查询)

    士兵杀敌(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进 ...

  3. nyoj 119 士兵杀敌(三)(RMQ)

    士兵杀敌(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进 ...

  4. nyoj 119 士兵杀敌(三)【线段树区间最大值最小值差】

    士兵杀敌(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进 ...

  5. NYOJ 119 士兵杀敌(三) RMQ ST

    NYOJ 119 士兵杀敌(三) RMQ ST 题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=119 思路: ST在线 预处理O(nlog ...

  6. nyoj 119士兵杀敌(三)(线段树区间最值查询,RMQ算法)

    题目119 题目信息 执行结果 本题排行 讨论区 士兵杀敌(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描写叙述 南将军统率着N个士兵,士兵分别编号为1~N,南将军常 ...

  7. NYOJ 119 士兵杀敌(三)(RMQ算法)

    採用的的是小牛的写法,蒟蒻第一次写.. RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n).返回数 ...

  8. NYIST 119 士兵杀敌(三)

    士兵杀敌(三)时间限制:2000 ms | 内存限制:65535 KB难度:5 描述南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进行比较,计算出 ...

  9. ACM题目————士兵杀敌(三)

    [RMQ算法]:用于当数组过于庞大的时候,查询区间的最大(最小)值. 时间复杂度:O(nlogn),主要时间发费在预处理上,查询只要O(1). 描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军 ...

随机推荐

  1. KVC简介 -字典转模型,模型转字典

    // 下面两个方法.都属于 KVC 的方法 // KVC 是 cocoa 的大招.间接给对象属性设置数值 // 程序运行过程中,动态给对象属性设置数值.不关心 .h 中是怎样定义的 //      仅 ...

  2. Wide - Residual - Inception Networks for R eal - time O bject D etection

    本文的提出了一个WR-inception网络结构.只需更小的内存消耗和更小的计算量. 作者使用了一种微结构,整个宏观网络都是由这个微结构组成. 微结构 微结构的种类如下: 基本的残差结构(3*3,3* ...

  3. URAL 题目1297. Palindrome(后缀数组+RMQ求最长回文子串)

    1297. Palindrome Time limit: 1.0 second Memory limit: 64 MB The "U.S. Robots" HQ has just ...

  4. exception 值太大

      CreateTime--2018年2月5日09:45:01 Author:Marydon 异常: Cause: java.sql.SQLException: ORA-12899: 列 " ...

  5. ORA-27090 故障一例

    近期的alert日志中碰到了ORA-27090的错误信息.其错误提示为Unable to reserve kernel resources for asynchronous disk I/O.依据这个 ...

  6. 华硕M2A-VM+AMD4000超频方法

    华硕M2A-VM+AMD4000超频方法2009-07-07 09:42 1.4000+默认外频为200,倍频已经锁定为10.5,实际运行频率为2100HZ.超频是通过提高外频来实现的,只要适当提高外 ...

  7. 自研DCI网络路由交换协议DCIP-白牌交换机时代的企业网络

    一转眼从听华为3Com的路由交换课程到如今已经13年有余了,依稀记得第一节课的时候我带着老婆去听的课(老婆是日语系的.那时还是女朋友,并不懂网络,仅仅是跟着我去上课的).抢了个头排,讲师宋岩老师提问了 ...

  8. PHP读取大文件的几种方法

    场景:PHP读取超大文件,例如1G的日志文件,我这里使用的是400M的access.log文件 1.使用file直接读取 <?php $starttime=microtime_float(); ...

  9. HDUOJ----旋转的二进制

    旋转的二进制 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submis ...

  10. html5中的FileReader对象

    表单中有图片选项,选中图片文件之后要求可以预览.这个功能很多控件都封装好了,但是它们的底层都是FileReader对象. FileReader对象提供了丰富的功能,包括以二进制.以文本方式读取文件内容 ...