nyoj-119 士兵杀敌(三) 线段树
来源:互联网 发布:python knn算法 编辑:程序博客网 时间:2024/05/08 01:56
士兵杀敌(三)
时间限制:2000 ms | 内存限制:65535 KB
难度:5
描述
南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进行比较,计算出两个人的杀敌数差值,用这种方法一方面能鼓舞杀敌数高的人,另一方面也算是批评杀敌数低的人,起到了很好的效果。
所以,南将军经常问军师小工第i号士兵到第j号士兵中,杀敌数最高的人与杀敌数最低的人之间军功差值是多少。
现在,请你写一个程序,帮小工回答南将军每次的询问吧。
注意,南将军可能询问很多次。
输入
只有一组测试数据
第一行是两个整数N,Q,其中N表示士兵的总数。Q表示南将军询问的次数。(1
样例输入
5 2
1 2 6 9 3
1 2
2 4
样例输出
1
7
来源
经典改编
上传者
张云聪
题解
朴素的暴力暴力算法会超时,因为是O(n^2)的复杂度。可以用线段树来实现,时间复杂度是O(N*logN)的。
注意m,n的大小关系不确定。
代码
#include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<bits/stdc++.h> 6 using namespace std; 7 8 #define MAXNUM 100000000 9 #define MINNUM -110 const int M=1e5;11 int a[M];12 //根据题目,求区间最大值和最小值13 struct{14 int l,r;15 int ans[2]; //a[0]最大值,a[1]最小值16 }tree[M*4];17 18 void build(int x,int l,int r)19 {20 tree[x].l=l,tree[x].r=r;21 tree[x].ans[0]=MINNUM,tree[x].ans[1]=MAXNUM;22 if(l==r) //叶子结点23 {24 tree[x].ans[1]=a[r];25 tree[x].ans[0]=a[r];26 }27 else28 {29 int mid = (l+r)/2;30 build(x<<1,l,mid);31 build(x<<1|1,mid+1,r);32 int a=tree[x<<1].ans[0],b=tree[x<<1|1].ans[0];33 int c=tree[x<<1].ans[1],d=tree[x<<1|1].ans[1];34 tree[x].ans[0]=max(a,b);35 tree[x].ans[1]=min(c,d);36 }37 }38 39 void query(int x,int l,int r,int &_max,int &_min)40 {41 int L=tree[x].l,R=tree[x].r;42 if(l<=L&&r>=R)43 {44 _max=tree[x].ans[0];45 _min=tree[x].ans[1];46 return;47 }48 else49 {50 int mid = (L+R)/2;51 int _max1=MINNUM,_min1=MAXNUM;52 if(mid>=l) query(x<<1,l,r,_max,_min);53 if(mid+1<=r) query(x<<1|1,l,r,_max1,_min1);54 if(_max1>_max) _max = _max1;55 if(_min1<_min) _min = _min1;56 return;57 }58 }59 60 int main()61 {62 int n,m;63 scanf("%d %d",&m,&n);64 for(int i=1;i<=m;i++)65 scanf("%d",&a[i]);66 build(1,1,m);67 int l,r;68 int _max=MINNUM,_min=MAXNUM;69 while(n--)70 {71 _max=MINNUM,_min=MAXNUM;72 scanf("%d %d",&l,&r);73 if(l>r)74 {75 int temp;76 temp = l;77 l = r;78 r = temp;79 }80 query(1,l,r,_max,_min);81 }82 return 0;83 }
阅读全文
0 0
- NYOJ-119-士兵杀敌(三)(线段树)
- nyoj 119 士兵杀敌(三) 【线段树】【单点更新】
- nyoj-119 士兵杀敌(三) 线段树
- 士兵杀敌(三) 【nyoj-119】【线段树】
- nyoj-119-士兵杀敌(三)【线段树】
- nyoj 119 士兵杀敌(三)线段树
- 【nyoj】-116-士兵杀敌(三)(线段树,变化)
- NYOJ 士兵杀敌(三)(线段树,树状数组)
- NYOJ 题目119 士兵杀敌(三)(线段树,区间最值)
- nyoj 士兵杀敌(三) 119 (区间dp+RMQ&&线段树) 好题
- NYOJ 119 士兵杀敌(三)(线段树--区间最值之差)
- NYOJ 119 士兵杀敌(三)(线段树—求区间最大值与最小值差)
- nyoj 119士兵杀敌(三)(线段树区间最值查询,RMQ算法)
- nyoj-119-士兵杀敌(二)【线段树】
- NYOJ 119 士兵杀敌(三)
- NYOJ-119 士兵杀敌(三) KMQ
- NYOJ-119士兵杀敌(三)
- NYOJ 题目119士兵杀敌(三)
- border-radius和box-shadow和background-image的兼容性问题
- 高效编程之互斥锁和自旋锁的一些知识
- leetcode题解-57. Insert Interval
- Vuforia开发高阶二-虚拟按钮(第一部分)
- python IP格式校验
- nyoj-119 士兵杀敌(三) 线段树
- 【脚本语言系列】关于Python数据库编程ODBC,你需要知道的事
- 笔记3
- 浅谈单片机程序设计中的“分层思想”
- Database and its applications
- python实现斯坦福机器学习ex1.1
- STC15单片机学习笔记(转载记录非原创)
- UIScrollView滚动到指定页面
- C语言头文件怎么写