您的位置:首页 > 其它

poj 3264(线段树 || ST(Sparse Table)算法)

2012-10-01 14:32 411 查看
Run IDUserProblemResultMemoryTimeLanguageCode LengthSubmit Time
10872456xinghan02193264Accepted8540K3469MSG++950B2012-10-01 14:21:38
10579472xinghan02193264Accepted1728K3375MSG++1135B2012-08-01 11:35:45
第一个是ST算法,第二个是线段树。

线段树:

#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问题。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: