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

晕,我的线段树超时!我是把每个节点保存最大最小值。每次动态访问求得该线段的最大最小值。然后求差!

Posted by chain0414 at 2007-08-05 05:13:34 on Problem 3264
 为什么会超时?有空的就帮小弟看看代码:
  #include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

struct tree
{
	int l,r,len,max,min;
}a[200000];

int h[50010];

void init(int l,int r,int v)  // 初始化
{
	a[v].l=l;
	a[v].r=r;
	a[v].max=0;
	a[v].min=0x7FFFFFFF;
	if(l==r)
	{
		a[v].len=1;
		return;
	}
	a[v].len=r-l+1;
	init(l,(l+r)/2,v*2);
	init((l+r)/2+1,r,v*2+1);
}

void insert(int d,int v,int w)  // 插入线段
{
	if(a[w].l==a[w].r)
	{
		a[w].max=v;
		a[w].min=v;
		return;
	}
	if(a[w].max<v)
		a[w].max=v;
	if(a[w].min>v)
		a[w].min=v;
	if(a[2*w].len>d)
	{
		insert(d,v,2*w);
	}
	else
	{
		insert(d-a[2*w].len,v,2*w+1);
	}
}

int qmax(int l,int r,int w)  //求最大值
{
	int max=0;
	if(a[w].l==l && a[w].r==r)
	{
		return a[w].max;
	}
	if(l>(a[w].l+a[w].r)/2)
		return qmax(l,r,w*2+1);
	else if(r<=(a[w].r+a[w].l)/2)
		return qmax(l,r,2*w);
	max=max>qmax(l,(a[w].l+a[w].r)/2,2*w)?max:qmax(l,(a[w].l+a[w].r)/2,2*w);
	max=max>qmax((a[w].l+a[w].r)/2+1,r,2*w+1)?max:qmax((a[w].l+a[w].r)/2+1,r,2*w+1);
	return max;
}

int qmin(int l,int r,int w)  // 求最小值
{
	int min=0x7FFFFFFF;
	if(a[w].l==l && a[w].r==r)
	{
		return a[w].min;
	}
	if(l>(a[w].l+a[w].r)/2)
		return qmin(l,r,w*2+1);
	else if(r<=(a[w].r+a[w].l)/2)
		return qmin(l,r,2*w);
	min=min<qmin(l,(a[w].l+a[w].r)/2,2*w)?min:qmin(l,(a[w].l+a[w].r)/2,2*w);
	min=min<qmin((a[w].l+a[w].r)/2+1,r,2*w+1)?min:qmin((a[w].l+a[w].r)/2+1,r,2*w+1);
	return min;
}

int main()
{
	int i,j,k,l,n,m,s,min,max;
	while(scanf("%d%d",&n,&m)==2)
	{
		init(1,n,1);
		for(i=0;i<n;i++)
		{
			scanf("%d",&s);
			insert(i,s,1);
		}
		for(i=1;i<=m;i++)
		{
			scanf("%d%d",&k,&l);
			max=qmax(k,l,1);
			min=qmin(k,l,1);
			printf("%d\n",max-min);
		}
	}
	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