poj 3264(线段树 || ST(Sparse Table)算法)
2012-10-01 14:32
411 查看
Run ID | User | Problem | Result | Memory | Time | Language | Code Length | Submit Time |
10872456 | xinghan0219 | 3264 | Accepted | 8540K | 3469MS | G++ | 950B | 2012-10-01 14:21:38 |
10579472 | xinghan0219 | 3264 | Accepted | 1728K | 3375MS | G++ | 1135B | 2012-08-01 11:35:45 |
线段树:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; #define inf 100000000 #define MAXN 50010 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define Max(x,y) ((x)>(y)?(x):(y)) #define Min(x,y) ((x)>(y)?(y):(x)) int MAX[MAXN<<2]; int MIN[MAXN<<2]; void PushUp(int rt) { MAX[rt] = Max(MAX[rt<<1],MAX[rt<<1|1]); MIN[rt] = Min(MIN[rt<<1],MIN[rt<<1|1]); } void build(int l,int r,int rt) { if(l==r) { scanf("%d",&MAX[rt]); MIN[rt]=MAX[rt]; return; } int m=(r+l)>>1; build(lson); build(rson); PushUp(rt); } int maxans=0,minans=inf; void query(int L,int R,int l,int r,int rt) { if(L <= l && r <=R) { maxans=Max(MAX[rt],maxans); minans=Min(minans,MIN[rt]); return ; } int m=(l+r)>>1; //int ret if(L <= m) query(L,R,lson); if(m<R) query(L,R,rson); return ; } int main() { int n,q,l,r; while(scanf("%d%d",&n,&q)!=EOF) { build(1,n,1); while(q--) { scanf("%d%d",&l,&r); maxans=0; minans=inf; query(l,r,1,n,1); printf("%d\n",maxans-minans); } } return 0; }
ST:
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; #define MAXN 50010 #define Max(x,y) (x>y?x:y) #define Min(x,y) (x>y?y:x) int maxsum[MAXN][20],minsum[MAXN][20];// void RMQ(int num) { for(int j=1;j<20;j++) for(int i=1;i<=num;i++) { if(i+(1<<j)-1 <= num) { maxsum[i][j]=Max(maxsum[i][j-1],maxsum[i+(1<<(j-1))][j-1]); minsum[i][j]=Min(minsum[i][j-1],minsum[i+(1<<(j-1))][j-1]); } } } int main() { int i,j,num,t,query; while(scanf("%d%d",&num,&query) != EOF) { for(i=1;i<=num;i++) { scanf("%d",&maxsum[i][0]); minsum[i][0]=maxsum[i][0]; } RMQ(num); int st,en,maxl,minl; while(query--) { scanf("%d%d",&st,&en); int k=(int)((log(en-st+1))/log(2.0)); maxl=Max(maxsum[st][k],maxsum[en-(1<<k)+1][k]); minl=Min(minsum[st][k],minsum[en-(1<<k)+1][k]); printf("%d\n",maxl-minl); } } return 0; }
ps:ST算法可以将LCA问题转化成RMQ问题。。
相关文章推荐
- poj3264——Balanced Lineup(ST算法及线段树操作)
- poj 3264 小白算法练习 Balanced Lineup 线段树
- [POJ 3264]Balanced Lineup(ST算法求RMQ)
- POJ 3264 RMQ--ST 算法
- Poj 3264 Balanced Lineup【RMQ----ST算法】
- POJ 3264 Balanced Lineup (ST算法入门)
- POJ 3264 线段树 ST
- POJ 3264 线段树 ST
- POJ 3264 Balanced Lineup-初入算法 线段树
- RMQ问题----ST(Sparse-Table)算法
- RMQ问题----ST(Sparse-Table)算法
- POJ-3264 RMQ 线段树与ST
- POJ3264 【RMQ基础题—ST-线段树】
- 【POJ 3264】Balanced Lineup(RMQ算法||线段树)
- ST(Sparse Table)算法求解RMQ问题
- 【数据结构与算法】RMQ+ST及线段树
- 【线段树】poj 3264 Balanced Lineup(外:hdu 1754 I Hate It)
- poj 3264 Balanced Lineup(基础线段树)
- Balanced Lineup POJ - 3264(基础线段树)
- [kuangbin带你飞]专题七 线段树 G POJ 3264