南阳oj119--士兵杀敌(三)(求最大值和最小值的差值)
2017-08-12 17:54
260 查看
士兵杀敌
点击打开链接
描述
南将军统率着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号士兵之间所有士兵杀敌数的最大值与最小值的差。
样例输入
样例输出
来源经典改编
上传者张云聪
解题思路:添加了查找最大值和最小值,输出它们的差值。不知道为什么,同样的代码,不一定哪一次就过了,好奇怪。。。。。。
点击打开链接
描述
南将军统率着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 <stdio.h> #include <string.h> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f #define MAX 100000 int ans1,ans2; struct TREE { int l,r; int max,min; }tree[MAX<<2]; //将数组乘四,记住 void PushUp(int o) { tree[o].max = max (tree[o << 1].max,tree[o << 1 | 1].max); tree[o].min = min (tree[o << 1].min,tree[o << 1 | 1].min); } void build(int o,int l,int r) //o代表节点位置,l为左边界,r为右边界 { tree[o].l = l; //首先记录l和r的值 tree[o].r = r; if (l == r) //到达最底层,递归终止 { scanf ("%d",&tree[o].max); //输入数据 tree[o].min = tree[o].max; return; //更新节点数据 } int mid = (l + r) >> 1; //找到中间节点 build(o << 1 , l , mid); //递归建左子树 build(o << 1 | 1 , mid + 1 , r); //递归建右子树 PushUp(o); } void Query(int o,int l,int r) { if (tree[o].l == l && tree[o].r == r) //如果对应的线段树就是需要寻找的区间,则直接返回值 { ans1 = max(ans1,tree[o].max); ans2 = min(ans2,tree[o].min); return; //这个return别忘了 } int mid = (tree[o].l + tree[o].r) >> 1; //否则二分查找 if (mid >= r) Query (o << 1 , l , r); //去左孩子找 else if (l > mid) Query (o << 1 | 1 , l , r); //去右孩子找 else { Query(o << 1 , l , mid); Query(o << 1 | 1 , mid + 1 , r); //两边寻找 } } int main() { int n,q; scanf ("%d %d",&n,&q); build(1,1,n); while (q--) { int x,y; scanf ("%d %d",&x,&y); ans1 = -1; ans2 = INF; Query(1,x,y); printf ("%d\n",ans1-ans2); } return 0; }
相关文章推荐
- 【南阳OJ 119】士兵杀敌(三)(线段树)(最大值&最小值问题 模板题)
- 南阳oj 士兵杀敌(三) 题目119 数据结构
- 【南阳OJ119】士兵杀敌(三)(线段树)
- NYOJ-士兵杀敌(三) 线段树RMQ算法求区间的最大差值
- 南阳oj[108]士兵杀敌(一)
- 【南阳 oj】108--士兵杀敌(1)(线段树)
- 南阳-119-士兵杀敌(三)
- 南阳-119-士兵杀敌(三)
- nyoj 119 士兵杀敌(三)【线段树区间最大值最小值差】
- 南阳oj116 - 士兵杀敌(二)【线段树】
- 南阳oj108--士兵杀敌(一)(线段树,求和)
- 【南理工oj】119 - 士兵杀敌(三)(线段树,坑)
- 南阳oj116--士兵杀敌(二)(线段树,更新,求和)
- [南阳OJ-No.31]5个数求最值|设计一个从5个整数中取最小数和最大数的程序
- 【南阳OJ 116】士兵杀敌(二)(线段树)(更改某一点的值&查找总和 模板题)
- 【南阳oj 108士兵杀敌(一)】 (线段树 模板题)
- 南阳oj 士兵杀敌(二) 题目116 NYOJ 数据结构
- 南阳oj NYoj 数据结构 士兵杀敌(一) 题目108
- 南阳OJ 116-士兵杀敌(二)
- 【再见RMQ】NYOJ-119-士兵杀敌(三),区间内大小差值