hdu 1754 I Hate It (线段树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754

第一道线段树。线段树的树形结构如图:


用递归的方法对树进行创建,更新,查找。当线段长度为L时,算法复杂度为log(L)+1;
题目中要求一条线段的最大值,在结点中多定义一个max,每次更新时,要更新max。
代码如下:


//968MS  好慢地说
#include<iostream>
#include<cstdio>
#include<algorithm>
const int maxn=220000;
struct Node{int l,r,mid,max;}node[maxn<<2];
int max(int a,int b)
{
	return a>b? a:b;
}
void init(int l,int r,int i)
{
	node[i].l=l;node[i].max=-1;
	node[i].r=r;node[i].mid=(l+r)>>1;
	if(l+1==r)return ;
	init(l,(l+r)>>1,i<<1);
	init((l+r)>>1,r,i<<1|1);
}
void update(int pos,int v,int i)
{
	if(v>node[i].max)node[i].max=v;
	if(node[i].l+1==node[i].r)return;
	if(pos<node[i].mid)update(pos,v,i<<1);
	if(pos>=node[i].mid)update(pos,v,i<<1|1);
}
int query(int l,int r,int i)
{
	if(l==node[i].l&&r==node[i].r)
		return node[i].max;
	if(l<node[i].mid)
	{
		if(r<=node[i].mid)
			return query(l,r,i<<1);
		else return max(query(l,node[i].mid,i<<1),query(node[i].mid,r,i<<1|1));
	}
	else return query(l,r,i<<1|1);
}
int main()
{
	int n,m,t,l,r,i;
	char ch;
	while(~scanf("%d%d",&n,&m))
	{
		init(1,n+1,1);
		for(i=1;i<=n;i++)
		{
			scanf("%d",&t);
			update(i,t,1);
		}
		for(i=1;i<=m;i++)
		{
			getchar();
			scanf("%c",&ch);
			scanf("%d%d",&l,&r);
			if(ch=='Q')
				printf("%d\n",query(l,r+1,1));
			else update(l,r,1);
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值