标签:
线段树太弱了,题目逼格一高连代码都读不懂,今天开始重刷线段树,每天一题,风格用kuangbin大神和以前的,两种都写一遍
RMQ做法:poj3264
1 /* 2 POJ 3264 Balanced Lineup 3 题目意思:给定Q(1<=Q<=200000)个数A1,A2,```,AQ, 4 多次求任一区间Ai-Aj中最大数和最小数的差 5 */ 6 #include<stdio.h> 7 #include<algorithm> 8 #include<iostream> 9 using namespace std; 10 #define MAXN 200005 11 #define INF 10000000 12 int nMax,nMin;//记录最大最小值 13 struct Node 14 { 15 int l,r;//区间的左右端点 16 int nMin,nMax;//区间的最小值和最大值 17 }segTree[MAXN*3]; 18 int a[MAXN]; 19 void Build(int i,int l,int r)//在结点i上建立区间为(l,r) 20 { 21 segTree[i].l=l; 22 segTree[i].r=r; 23 if(l==r)//叶子结点 24 { 25 segTree[i].nMin=segTree[i].nMax=a[l]; 26 return; 27 } 28 int mid=(l+r)>>1; 29 Build(i<<1,l,mid); 30 Build(i<<1|1,mid+1,r); 31 segTree[i].nMin=min(segTree[i<<1].nMin,segTree[i<<1|1].nMin); 32 segTree[i].nMax=max(segTree[i<<1].nMax,segTree[i<<1|1].nMax); 33 } 34 void Query(int i,int l,int r)//查询结点i上l-r的最大值和最小值 35 { 36 if(segTree[i].nMax<=nMax&&segTree[i].nMin>=nMin) return; 37 if(segTree[i].l==l&&segTree[i].r==r) 38 { 39 nMax=max(segTree[i].nMax,nMax); 40 nMin=min(segTree[i].nMin,nMin); 41 return; 42 } 43 int mid=(segTree[i].l+segTree[i].r)>>1; 44 if(r<=mid) Query(i<<1,l,r); 45 else if(l>mid) Query(i<<1|1,l,r); 46 else 47 { 48 Query(i<<1,l,mid); 49 Query(i<<1|1,mid+1,r); 50 } 51 } 52 int main() 53 { 54 int n,q; 55 int l,r; 56 int i; 57 while(scanf("%d%d",&n,&q)!=EOF) 58 { 59 for(i=1;i<=n;i++) 60 scanf("%d",&a[i]); 61 Build(1,1,n); 62 for(i=1;i<=q;i++) 63 { 64 scanf("%d%d",&l,&r); 65 nMax=-INF;nMin=INF; 66 Query(1,l,r); 67 printf("%d\n",nMax-nMin); 68 } 69 } 70 return 0; 71 }
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 int n,m,t; 9 #define lson l,m,rt<<1 10 #define rson m+1,r,rt<<1|1 11 const int maxn=55555; 12 int cow[maxn]; 13 int maxx[maxn<<2],minn[maxn<<2]; 14 int mmax=-1,mmin=9999999; 15 void pushup(int rt){ 16 maxx[rt]=max(maxx[rt<<1],maxx[rt<<1|1]); 17 minn[rt]=min(minn[rt<<1],minn[rt<<1|1]); 18 } 19 void build(int l,int r,int rt){ 20 if(l==r){ 21 scanf("%d",&minn[rt]); 22 maxx[rt]=minn[rt]; 23 return; 24 } 25 int m=(l+r)>>1; 26 build(lson); 27 build(rson); 28 pushup(rt); 29 } 30 void query(int L,int R,int l,int r,int rt) { 31 if (L<=l&&r<=R){ 32 mmax=max(mmax,maxx[rt]); 33 mmin=min(mmin,minn[rt]); 34 return; 35 } 36 int m=(l+r)>>1; 37 int ret=0; 38 if(L<=m) query(L,R,lson); 39 if(R>m) query(L,R ,rson); 40 } 41 int main() 42 { 43 int i,j,k; 44 #ifndef ONLINE_JUDGE 45 freopen("1.in","r",stdin); 46 #endif 47 int q; 48 while(scanf("%d%d",&n,&q)!=EOF) 49 { 50 build(1,n,1); 51 for(i=1;i<=q;i++) 52 { 53 int a,b; 54 scanf("%d%d",&a,&b); 55 query(a,b,1,n,1); 56 printf("%d\n",mmax-mmin); 57 mmax=-1,mmin=9999999; 58 } 59 } 60 return 0; 61 }
标签:
原文地址:http://www.cnblogs.com/cnblogs321114287/p/4354856.html