SDUT-3302-效率至上-RMQ||线段树
2015-08-29 11:16
246 查看
RMQ:
可以去寻找一个区域中的最小的值
那样也可以去寻找最大的值啊
RMQ
可以去寻找一个区域中的最小的值
那样也可以去寻找最大的值啊
RMQ
#include<iostream> #include<stdio.h> #include<algorithm> #include<string.h> #include<stdlib.h> using namespace std; int mn[51000][50]; int mx[51000][50]; int ls[51000]; int n, m; void RMQ_min()///小的 { int i, j; for( i = 1; i <= n; i++) mn[i][0] = ls[i]; for(j = 1; (1<<j) <= n; j++) for(i = 1; i+(1<<j)-1<=n;i++) mn[i][j] = min(mn[i][j-1],mn[i+(1<<(j-1))][j-1]); } void RMQ_max()///大的 { int i, j; for( i = 1; i <= n; i++) mx[i][0] = ls[i]; for(j = 1; (1<<j) <= n; j++) for(i = 1; i+(1<<j)-1<= n;i++) mx[i][j] = max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]); } int RN(int l,int r) { int k = 0; while(1<<(k+1) <= r-l+1) k++; return min(mn[l][k],mn[r-(1<<k)+1][k]); } int RX(int l,int r) { int k = 0; while(1<<(k+1) <= r-l+1) k++; return max(mx[l][k],mx[r-(1<<k)+1][k]); } int main() { while(~scanf("%d%d",&n,&m)) { memset(mn,0,sizeof(mn)); memset(mx,0,sizeof(mx)); int i; for(i = 1; i <= n; i++)///从1开始注意 scanf("%d",&ls[i]); RMQ_min(); RMQ_max(); int l, r; for(i = 0; i < m; i++) { scanf("%d%d",&l,&r); printf("%d\n",RX(l,r)-RN(l,r)); } } return 0; }线段树
#include <bits/stdc++.h> #define LL long long #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define INF 0x3f3f3f3f using 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; }
相关文章推荐
- Hibernate分页(sql和hql)两种方法
- 常用排序算法总结---Java实现
- Leetcode: Palindrome Linked List
- Linux新手入门:Unable to locate package错误解决办法
- 4.solrj对索引的增删改查
- Win10 Mobile/PC版《照片》更新以及下载:Bug修复和性能优化
- HDU 1071 The area(计算几何)
- Java中实现CallBack功能
- matlab常用小函数(一)
- NGUI_2.6.3_(3D视图&ScrollView)
- cc、gcc、g++、CC的区别概括
- NSString转NSData,以及char*转NSData
- 少一点伤感
- 瀑布流布局——jquery
- 2015.8.28 字符串
- HDU 2955 Robberies
- 别让任何人偷走您的梦
- Android:透明状态栏的效果实现
- SDUT-3303-来发背包开开胃
- Smart210 U-Boot移植 之Readme文件分析 (基于u-boot-2015.07)