ACM PKU 3264 Balanced Lineup

题目描述:http://poj.org/problem?id=3264

这是我做的第一道线段树题,超时两次,最后过得也很悲剧,差点没有把我笑死,poj好几页的waiting,我还以为服务器挂了。等了好久,结果一翻我交的题,蓝色的Ac,我当时那个喜呀,哈哈...

方法一:线段树初级题,水过;

 1 #include <iostream>
2 #include <string>
3 #include <cstring>
4 #include <cstdio>
5 #include <algorithm>
6 const int MAXN=50000;
7 using namespace std;
8
9 int A[MAXN+10];
10
11 typedef pair <int,int>PI;
12
13 struct SegmentTreee
14 {
15 int l,r,min,max;
16 } t[MAXN<<2];
17
18 int N,Q;
19
20 void BuildTree(const int &v,const int &left,const int &right)
21 {
22 t[v].l=left;
23 t[v].r=right;
24 if(left==right)
25 {
26 t[v].min=t[v].max=A[left];
27 return;
28 }
29 int lc=v<<1,rc=lc+1,mid=(left+right)>>1;
30 BuildTree(lc,left,mid);
31 BuildTree(rc,mid+1,right);
32 t[v].min=min(t[lc].min,t[rc].min);
33 t[v].max=max(t[lc].max,t[rc].max);
34 }
35
36 PI Query(const int &v,const int &left,const int &right)
37 {
38 int lc=v<<1,rc=lc+1;
39 if(t[v].l==left&&t[v].r==right)
40 {
41 return make_pair(t[v].min,t[v].max);
42 }
43 else if(right<=t[lc].r)
44 {
45 return Query(lc,left,right);
46 }
47 else if(left>=t[rc].l)
48 {
49 return Query(rc,left,right);
50 }
51 else if(left<=t[lc].r&&right>=t[lc].l)
52 {
53 PI Ql,Qr;
54 Ql=Query(lc,left,t[lc].r);
55 Qr=Query(rc,t[rc].l,right);
56 int mmin=min(Ql.first,Qr.first);
57 int mmax=max(Ql.second,Qr.second);
58 return make_pair(mmin,mmax);
59 }
60 }
61
62
63 int main()
64 {
65 //freopen("in.txt","r",stdin);
66 scanf("%d%d",&N,&Q);
67 for(int i=1;i<=N;i++)
68 {
69 scanf("%d",&A[i]);
70 }
71 BuildTree(1,1,N);
72
73 int left,right;
74 for(int i=1;i<=Q;i++)
75 {
76 scanf("%d%d",&left,&right);
77 PI P=Query(1,left,right);
78 printf("%d\n",P.second-P.first);
79 }
80 return 0;
81 }

  方法二:RMQ用的是ST算法,更是水过

 1 #include <iostream>
2 #include <cstring>
3 #include <cstdio>
4 const int MAXN=50000;
5 using namespace std;
6
7 typedef pair<int,int> PI;
8 PI c[20][MAXN+10];
9 int N,Q;
10
11 PI operator ^(const PI&x,const PI&y)
12 {
13 return make_pair(min(x.first,y.first),max(x.second,y.second));
14 }
15
16 void Make_RMQ()
17 {
18 for(int j=1,k=2; k<=N; j++,k<<=1)
19 for(int i=1; i+k-1<=N; i++)
20 c[j][i]=c[j-1][i]^c[j-1][i+(k>>1)];
21 }
22
23 PI Query(const int &l,const int &r)
24 {
25 int j=0,k=1;
26 while(k<=r-l+1)j++,k<<=1;
27 j--,k>>=1;
28 return c[j][l]^c[j][r-k+1];
29 }
30
31
32 int main()
33 {
34 //freopen("in.txt","r",stdin);
35 scanf("%d%d",&N,&Q);
36 for(int i=1; i<=N; i++)
37
38 {
39 scanf("%d",&c[0][i].first);
40 c[0][i].second=c[0][i].first;
41 }
42 Make_RMQ();
43 int l,r;
44 for(int i=0; i<Q; i++)
45 {
46 scanf("%d%d",&l,&r);
47 PI ans =Query(l,r);
48 printf("%d\n",ans.second-ans.first);
49 }
50 return 0;
51 }

  

posted on 2011-08-16 10:16  _Clarence  阅读(119)  评论(0编辑  收藏  举报

导航