nyoj119 士兵杀敌(三) (线段树,两个value)
来源:互联网 发布:windws10固态硬盘优化 编辑:程序博客网 时间:2024/05/01 09:54
士兵杀敌(三)
时间限制: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 21 2 6 9 31 22 4
- 样例输出
1
7
参考博客:http://www.cfanz.cn/index.php?c=article&a=read&id=203013 感谢!!
#include <iostream>#include<algorithm>#include <cstdio>#include <cstring>#define MAXN 1000100using namespace std;int array[MAXN];int Max, Min;//利用全局变量来获取递归结果 typedef struct info{int Max, Min;}info;info segT[MAXN * 4 + 10];void build(int node, int begin, int end) {if(begin == end) {segT[node].Max = segT[node].Min = array[begin];}else {build(node * 2, begin, (begin + end) / 2);build(node * 2 + 1, (begin + end) / 2 + 1, end);segT[node].Max = max(segT[node * 2].Max, segT[node * 2 + 1].Max);segT[node].Min = min(segT[node * 2].Min, segT[node * 2 + 1].Min);}}void query(int node, int begin, int end, int l, int r) {if(begin == l && end == r) {Max = max(Max,segT[node].Max);Min = min(Min,segT[node].Min);}else {int mid = (begin + end) / 2;if(r <= mid) query(node * 2, begin, mid, l, r);else if(l > mid) query(node * 2 + 1, mid + 1, end, l, r);else {query(node * 2, begin, mid, l, mid);query(node * 2 + 1, mid + 1, end, mid + 1, r);}}}int main() { int N, M; while(~scanf("%d %d", &N, &M)) { int i; for(i = 1; i <= N; i++) { scanf("%d", &array[i]);}build(1, 1, N);int l, r;while(M--) {Max = 0; //一定不能忘了初值的设置Min = 0x7fffffff;scanf("%d %d", &l, &r);query(1, 1, N, l, r);printf("%d\n", Max - Min);}} return 0;}
0 0
- nyoj119 士兵杀敌(三) (线段树,两个value)
- NYOJ119 士兵杀敌(三)【线段树】
- NYOJ119 士兵杀敌(三) 线段树
- 【nyoj119】士兵杀敌三(线段树)
- nyoj119 士兵杀敌(三)(线段树||RMQ)
- nyoj119-士兵杀敌(三)(线段树,最大最小值)
- nyoj119 士兵杀敌(三) ST算法和线段树
- NYOJ119 士兵杀敌(三)
- nyoj119士兵杀敌(三)
- nyoj119士兵杀敌(三)
- nyoj119 士兵杀敌(三)
- 士兵杀敌(三)||NYOJ119
- NYOJ119 士兵杀敌(三)(RMQ算法)
- nyoj119 士兵杀敌(三)RMQ算法
- NYOJ119 士兵杀敌(三)&&poj3264 Balanced Lineup(线段树)
- nyoj119士兵杀敌(三)
- NYOJ119士兵杀敌(三)(st算法)
- NYOJ119士兵杀敌(三)RMQ问题之ST…
- linux c 编程模板总结(二)
- java多线程系列01——多线程基础
- MATLAB对文件进行批量重命名
- 关于编程中遇到inf的情况
- HDU 5054Alice and Bob
- nyoj119 士兵杀敌(三) (线段树,两个value)
- Spring进阶之路(4)-容器中Bean作用域与集合类型配置
- Android应用程序性能优化
- Java服务器热部署的实现原理——java类的加载方式
- 内存管理
- HDU 5055Bob and math problem(构造)
- 利用VS2013编译C语言程序
- 求最大连续bit数
- grep使用多个查询条件--或