hdu 1754 I Hate It

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


线段树。。应该算是线段树的入门题目吧。。


线段树打得太少了。。一点都不熟悉。。需要加强啊。


下面是用数组模拟的线段树的AC代码:

#include<iostream>
using namespace std;
#define N 200002
struct node
{
	int l,m,r;
	int score;
}trie[N*3];
void creat(int id,int beg,int end)
{
	trie[id].l=beg;
	trie[id].r=end;
	trie[id].score=0;
	trie[id].m=(beg+end)>>1;
	if(beg<end)
	{
		creat(id*2,trie[id].l,trie[id].m);
		creat(id*2+1,trie[id].m+1,trie[id].r);
	}
}
void update(int id,int goal,int val)
{
	if(trie[id].l==goal&&trie[id].r==goal)
	{
		trie[id].score=val;
		return ;
	}
	else
	{
		if(trie[id].m>=goal)
		{
			if(trie[id].score<val)
				trie[id].score=val;
			update(id*2,goal,val);          //在左子树
		}
		else
		{
			if(trie[id].score<val)
				trie[id].score=val;
			update(id*2+1,goal,val);        //在右子树
		}
	}
}
void find(int id,int beg,int end,int &max)
{
	if(trie[id].l==beg&&trie[id].r==end)
	{
		if(trie[id].score>max)
			max=trie[id].score;
	}
	else
	{
		if(trie[id].m>=end)         
		{
			find(id*2,beg,end,max);
		}
		else if(trie[id].m<beg)
		{
			find(id*2+1,beg,end,max);
		}
		else
		{
			find(id*2,beg,trie[id].m,max);
			find(id*2+1,trie[id].m+1,end,max);
		}
	}

}
int main()
{
	int n,m,i,a,b,temp;
	char c;
	while(cin>>n>>m)
	{
		creat(1,1,n);
		for(i=1;i<=n;i++)
		{
			scanf("%d",&temp);
			update(1,i,temp);
		}
		for(i=1;i<=m;i++)
		{
			getchar();
			c=getchar();

			if(c=='Q')
			{
				scanf("%d%d",&a,&b);
				int max=0;
                find(1,a,b,max);

				printf("%d\n",max);
			}
			else
			{
				scanf("%d%d",&a,&b);
				update(1,a,b);
			}
		}

	}
	return 0;
}


你可能感兴趣的:(hdu 1754 I Hate It)