码迷,mamicode.com
首页 > 其他好文 > 详细

poj 3264 线段树

时间:2015-03-21 01:03:49      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:

线段树太弱了,题目逼格一高连代码都读不懂,今天开始重刷线段树,每天一题,风格用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 }

 

poj 3264 线段树

标签:

原文地址:http://www.cnblogs.com/cnblogs321114287/p/4354856.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!