南阳oj119--士兵杀敌(三)(求最大值和最小值的差值)
来源:互联网 发布:java继承和多态的作用 编辑:程序博客网 时间:2024/06/06 03:56
士兵杀敌
点击打开链接
南将军统率着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 21 2 6 9 31 22 4
- 样例输出
17
- 来源
- 经典改编
- 上传者
- 张云聪
- 解题思路:添加了查找最大值和最小值,输出它们的差值。不知道为什么,同样的代码,不一定哪一次就过了,好奇怪。。。。。。
#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; }
阅读全文
0 0
- 南阳oj119--士兵杀敌(三)(求最大值和最小值的差值)
- 【南阳OJ119】士兵杀敌(三)(线段树)
- 【南阳OJ 119】士兵杀敌(三)(线段树)(最大值&最小值问题 模板题)
- NYOJ 119 士兵杀敌(三)(线段树—求区间最大值与最小值差)
- NYOJ-士兵杀敌(三) 线段树RMQ算法求区间的最大差值
- 南阳理工:士兵杀敌(三)
- 南阳-119-士兵杀敌(三)
- 南阳-119-士兵杀敌(三)
- nyoj 119 士兵杀敌(三) <模板RMQ--静态数组时求最大最小值>
- 南阳oj 士兵杀敌(三) 题目119 数据结构
- nyoj119-士兵杀敌(三)(线段树,最大最小值)
- 士兵杀敌(三)
- 士兵杀敌(三)
- 士兵杀敌(三)
- 士兵杀敌(三)
- 士兵杀敌(三)
- 士兵杀敌(三)
- 士兵杀敌(三)
- API接口Comparable
- java中关于日期的操作
- java代码实用工具---lombok
- Javaweb session及session.isNew()的理解
- 利用html和csss实现京东首页静态页面
- 南阳oj119--士兵杀敌(三)(求最大值和最小值的差值)
- hdu 2612 Find a way bfs
- 【Java编程】Java复制文件夹及里面所有文件
- java基础——网络编程
- 第十三天总结
- 快速排序--递归算法
- 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
- DL里面关于epoch、 iteration和batchsize
- git 设置大小写敏感