Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

构造两颗线段树,时间就少点,我没有做任何优化就1.5秒,那些250ms大牛是怎么写的?

Posted by hujk2008 at 2012-09-18 22:07:55 on Problem 3264
In Reply To:线段树水过,就是时间有点问题,3313+MS,哪位大牛能指点一下,OrzOrzOrz Posted by:vongang at 2011-08-09 20:52:49
我这个程序怎么优化,才能降低到1秒内。

Problem: 3264  User: hujk2008 
Memory: 752K  Time: 1500MS 
Language: C  Result: Accepted 


#include <stdio.h>
#include <string.h>
#define MAXLEN 50002

int		d[MAXLEN] ;
int		fmin[MAXLEN] ;
int		fmax[MAXLEN] ;
int q,n ;

int lowbit(int x) 
{
	return x&(x^(x-1)) ;
}

void setfmin( int pos,int x)
{
	while(pos <= n)
	{
		if( fmin[pos] == 0 || fmin[pos] > x)
			fmin[pos] = x ;
		pos += lowbit(pos) ;
	}
}

void setfmax(int pos , int x)
{
	while(pos <= n)
	{
		if( fmax[pos] == 0 || fmax[pos] < x)
			fmax[pos] = x ;
		pos += lowbit(pos) ;
	}
}

int findmin(int s, int e)
{
	int re = d[e];
	int low ;
	while(s <= e)
	{
		low = lowbit(e) ;
		if( e - low >= s)
		{
			if( fmin[e] < re)
				re = fmin[e] ;
			e -= low ;
		}else
		{
			if( d[e] < re)
				re = d[e] ;
			e -- ;
		}
	}
	return re ;
}

int findmax(int s, int e)
{
	int re = d[e];
	int low ;
	while(s <= e)
	{
		low = lowbit(e) ;
		if( e - low >= s)
		{
			if( fmax[e] > re)
				re = fmax[e] ;
			e -= low ;
		}else
		{
			if( d[e] > re)
				re = d[e] ;
			e -- ;
		}
	}
	return re ;
}


int main( )
{
	int i ,x, y;
	memset(fmin,0,sizeof(fmin)) ;
	memset(fmax,0,sizeof(fmax)) ;
	scanf("%d%d",&n,&q) ;
	for( i = 1; i <= n ;i ++ )
	{
		scanf("%d",&d[i]) ;
		setfmin(i,d[i]) ;
		setfmax(i,d[i]) ;
	}
	for( i = 0 ;i < q ; i ++ )
	{
		scanf("%d%d",&x,&y) ;
		printf("%d\n",findmax(x,y) - findmin(x,y)) ;
	}
	return 0 ;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator