SDUTOJ----3302效率至上;
来源:互联网 发布:软件大道地铁停车 编辑:程序博客网 时间:2024/04/29 08:43
效率至上
Time Limit: 5000ms Memory limit: 65536K 有疑问?点这里^_^
区间最值问题:
方法1.线段树;
方法2.RMQ;
题目描述
题意很简单,给出一个数目为n的非有序序列,然后有m次查询.对于每次查询输入两个正整数l,r请输出区间[l,r]的最大值与最小值的差值
输入
第一行:输入两个正整数n,m (1<=n<=50000, 1<=m<=200000 );
第二行:输入n个整数 大小范围为[1,100000];
接下来的m行,每次两个正整数l,r (1<=l<=r<=n);
输出
输出区间[l,r]最大值与最小值的差值.
示例输入
6 31734251 54 62 2
示例输出
630
提示
来源
示例程序
1.线段树:
#include <bits/stdc++.h>#define LL long long#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define INF 0x3f3f3f3fusing namespace std;const int N =5e4+10;int maxn[N<<2];int mm[N<<2];void pushup(int rt){ maxn[rt]=max(maxn[rt<<1],maxn[rt<<1|1]); mm[rt]=min(mm[rt<<1],mm[rt<<1|1]);}void build(int l,int r,int rt){ if(l==r) { scanf("%d",&maxn[rt]); mm[rt]=maxn[rt]; return; } int mid=(l+r)>>1; build(lson); build(rson); pushup(rt);}int Query1(int L,int R,int l,int r,int rt){ if(L<=l&&R>=r) { return maxn[rt]; } int mid=(l+r)>>1; if(R<=mid) return Query1(L,R,lson); else if(L>mid) return Query1(L,R,rson); else return max(Query1(L,mid,lson),Query1(mid+1,R,rson));}int Query2(int L,int R,int l,int r,int rt){ if(L<=l&&R>=r) { return mm[rt]; } int mid=(l+r)>>1; if(R<=mid) return Query2(L,R,lson); else if(L>mid) return Query2(L,R,rson); else return min(Query2(L,mid,lson),Query2(mid+1,R,rson));}int main(){ int m,n; int u,v; while(~scanf("%d%d",&n,&m)) { build(1,n,1); while(m--) { scanf("%d%d",&u,&v); printf("%d\n",Query1(u,v,1,n,1)-Query2(u,v,1,n,1)); } } return 0;} 2.RMQ:<pre name="code" class="cpp">#include <iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<queue>#include<vector>#include<cstring>#include<string>#define LL long longusing namespace std;const int N=1e5;int d[N][20];int M[N][20];void RMQ_init(const vector<int>& A){ int n=A.size(); for(int i=0;i<n;i++) M[i][0]=d[i][0]=A[i]; for(int j=1;(1<<j)<=n;j++) for(int i=0;i+(1<<j)-1<n;i++) { d[i][j]=min(d[i][j-1],d[i+(1<<(j-1))][j-1]); M[i][j]=max(M[i][j-1],M[i+(1<<(j-1))][j-1]); }}int RMQ(int L,int R){ int k=0; while((1<<(k+1))<=R-L+1)k++; return max(M[L][k],M[R-(1<<k)+1][k])-min(d[L][k],d[R-(1<<k)+1][k]);}int main(){ //cout<<(1<<20)<<endl; vector<int>A; int m,n,x; int L,R; while(~scanf("%d%d",&n,&m)) { A.clear(); for(int i=0;i<n;i++) { scanf("%d",&x); A.push_back(x); } RMQ_init(A); while(m--) { scanf("%d%d",&L,&R); cout<<RMQ(L-1,R-1)<<endl; } } return 0;}
0 0
- SDUTOJ----3302效率至上;
- sdutoj 3302 效率至上
- 效率至上
- 效率至上
- 效率至上
- SDUT-3302-效率至上-RMQ||线段树
- 位运算,效率至上
- sdutacm-效率至上
- 线段树----效率至上
- SDUT 3302 效率至上 求区间内最大最小
- 效率至上 计算机使用规范
- 【效率至上】如何才能有效提高工作效率
- 线段树—效率至上
- 效率至上 区间最值
- sdutoj
- SDUTOJ
- SDUToj
- SDUToj
- UE4 异步资源加载
- Android生命周期
- GetWindowRect和GetClientRect的区别
- Spring Cache 介绍
- Using SVN as Source Control inside UE4
- SDUTOJ----3302效率至上;
- Hadoop2.6.0使用Python操作HDFS的解决方案
- 广州传智1期OC加强--01(完结)
- JoinPoint获取参数的方法和名称(1)
- informatica 错误:rep_61100,在此位置找到的存储库名称与所需名称不匹配
- sybase 常用函数
- OSPF和RIP的区别
- POJ 3723
- UIView与CALayer的区别