现在的位置: 首页 > 综合 > 正文

HDU-1754(线段树入门)

2013年02月03日 ⁄ 综合 ⁄ 共 1525字 ⁄ 字号 评论关闭

这个代码觉得还可以看,,而且.我觉得,这样的风格稍微适合我点,,,大神的代码还是有点接受不了,暂时先用这个吧...

大家看看.有什么可取之处.

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

int t[222222];
struct Node{
	int a;
	int b;
	int max;
}tree[888888];

int max(int a,int b)
{
	return a>=b?a:b;
}
void Pushup(int i)
{
	tree[i].max=max(tree[i<<1].max,tree[i<<1|1].max);
}

void Buildtree(int i,int a,int b)
{
	tree[i].a=a;
	tree[i].b=b;
	if(a==b)
	{
		scanf("%d",&tree[i].max);
		return;
	}
	int mid=(a+b)>>1;
	Buildtree(i<<1,a,mid);
	Buildtree(i<<1|1,mid+1,b);
	Pushup(i);
}

void update(int i,int a,int b)
{
	if(tree[i].a==a&&tree[i].b==a)
	{
		tree[i].max=b;
		return;
	}
	int mid=(tree[i].a+tree[i].b)>>1;
	if(a<=mid)
	{
		update(i<<1,a,b);
	}
	else if(a>mid)
	{
		update(i<<1|1,a,b);
	}
	Pushup(i);
}
/*int query(int L,int R,int i,int a,int b)
{
	if(L<=a&&b<=R)
	{
		return tree[i].max;
	}
	int mid=(a+b)>>1;
	int ans=0;
	if(L<=mid) ans=max(ans,query(L,R,i<<1,a,mid));
	if(R>mid) ans=max(ans,query(L,R,i<<1|1,mid+1,b));
	return ans;
}*/

int  query(int i,int a,int b)
{
	if(tree[i].a==a&&tree[i].b==b)
	{
		return tree[i].max;
	}
	int mid=(tree[i].a+tree[i].b)>>1;
	int ans=0;
	if(b <= mid)
		ans=max(ans,query(i<<1,a,b));
	else if(a > mid)
		ans=max(ans,query(i<<1|1,a,b));
	else {
		ans = max(ans, query(i<<1, a, mid));
		ans = max(ans, query(i<<1|1, mid+1, b));
	}
	return ans;
}

int main()
{
	int N,M;
	while(scanf("%d%d",&N,&M)!=EOF)
	{
		Buildtree(1,1,N);
		//printf("%d\n",max(2,-1));
	//	for(int i=1;i<=50;i++)
	//	{
	//		printf("i==%d___left==%d___right==%d___max=%d\n",i,tree[i].a,tree[i].b,tree[i].max);
	//	}
		//system("pause");
		for(int i=1;i<=M;i++)
		{
			char c[5];
			int a,b;
			scanf("%s%d%d",c,&a,&b);
			if(c[0]=='Q')
			{
				int ans=query(1,a,b);
				printf("%d\n",ans);
			}
			else if(c[0]=='U')
			{
				update(1,a,b);
			}
		}
	}
	return 0;
}

 

抱歉!评论已关闭.