您的位置:首页 > 产品设计 > UI/UE

HDU-1754(线段树入门)

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

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

代码:

#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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tree query struct c