poj 3264 Balanced Lineup

果的RMQ的ST
#include <stdio.h>
#include 
<math.h>

int n, q;
int num[50050], dpmax[50050][20], dpmin[50050][20];

int max ( int a, int b)
{
    
return a>b?a:b;
}
int min ( int a, int b)
{
    
return a>b?b:a;
}

void creatmax()
{
    
int i, j;
    
for ( i = 1; i <= n; i++ )
        dpmax[i][
0= num[i];
    
int k= log(n-1.0)/log(2.0);
    
for ( j = 1; j <= k; j++)
        
for ( i = 1 ; i+(1<<j)-1<=n; i++ )
            dpmax[i][j] 
= max( dpmax[i][j-1] , dpmax[i+(1<<(j-1))][j-1] );
}

void creatmin()
{
    
int i, j;
    
for ( i = 1; i <= n; i++ )
        dpmin[i][
0= num[i];
    
int k= log(n-1.0)/log(2.0);
    
for ( j = 1; j <= k; j++)
        
for ( i = 1 ; i+(1<<j)-1<=n; i++ )
            dpmin[i][j] 
= min( dpmin[i][j-1] , dpmin[i+(1<<(j-1))][j-1] );
}

int getmax( int l, int r )
{
    
int k= log(r-l+1.0)/log(2.0);
    
return max(dpmax[l][k], dpmax[r-(1<<k)+1][k]);
}

int getmin( int l, int r )
{
    
int k= log(r-l+1.0)/log(2.0);
    
return min(dpmin[l][k], dpmin[r-(1<<k)+1][k]);
}

int main()
{
    scanf(
"%d%d"&n, &q);
    
int i, j;
    
for ( i = 1; i <= n; i++ )
    {
        scanf(
"%d", num+i);
    }
    creatmax();
    creatmin();
    
int a, b;
    
while (q--)
    {
        scanf(
"%d%d"&a, &b);
        printf(
"%d\n", getmax(a, b)-getmin(a, b));
    }
    
return 0;
}

posted on 2011-08-05 23:17 purplest 阅读(239) 评论(0)  编辑 收藏 引用 所属分类: RMQ


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年8月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿

随笔分类(70)

随笔档案(68)

ACMer

搜索

最新随笔

最新评论