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

HDU 1754 I HATE IT

2017年11月21日 ⁄ 综合 ⁄ 共 1278字 ⁄ 字号 评论关闭

线段树的基础题,然后这几天其实都在撸线段树的题,但是程序老是有问题……然后最后……我觉得……可能我一开始就错了……于是又回来做这道题……果然!!!几乎调试了我!一天!要哭了好吗……原来加法的优先级还高于位运算是吗……没加个括号整个人都不好了…

言归正传。

题意:先给你n个数的一个序列,之后对这个序列进行两种操作,Q,询问某个区间里的最大的数,U,更新某个数。
小tip:结构体数组可以开到一百万,一定要比n的范围大。注意优先级。
撸完这道题,对于数据结构题的差错略有提高,比如看节点,当前范围,各种输出等。

#include <stdio.h>
#define maxn 1000000
int n,m;
struct node
{
	int l,r,max;
}tree[maxn];
int comp(int x,int y)
{
	if(x>y) return x;
	else return y;
}
void creat(int l,int r,int u)
{
	tree[u].l=l;
	tree[u].r=r;

	if(l==r) 
	{
		scanf("%d",&tree[u].max);
		return;
	}
	int mid=(l+r)/2;
	creat(l,mid,u<<1);
	creat(mid+1,r,(u<<1)+1);
	tree[u].max=comp(tree[u<<1].max,tree[(u<<1)+1].max);
}
int query(int l,int r,int u)
{
	int ll=tree[u].l,rr=tree[u].r;

	int tem1,tem2;
	if(ll==l&&rr==r) 
	return tree[u].max;
	int mid=(ll+rr)/2;
	if(l<=mid&&r<=mid) 
	return query(l,r,u<<1);
	else if(l>mid)
	 return query(l,r,(u<<1)+1);
	else 
	return comp(query(l,mid,u<<1),query(mid+1,r,(u<<1)+1));
}

void update(int loc,int val,int u)
{ 
	int ll=tree[u].l,rr=tree[u].r;
	if(ll==loc&&rr==loc) 
	{
	  tree[u].max=val;
	  return;
	}
	int mid=(ll+rr)/2;
	if(loc<=mid) update(loc,val,u<<1);
	else update(loc,val,(u<<1)+1);
	tree[u].max=comp(tree[u<<1].max,tree[(u<<1)+1].max);
	
}
int main()
{
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		creat(1,n,1);
		int i,j,k;
		char s[3],c;
		for(i=0;i<m;i++)
		{
			getchar();
			scanf("%c%d%d",&c,&j,&k);
			
			if(c=='Q') printf("%d\n",query(j,k,1));
			if(c=='U') update(j,k,1);
		}
	}
	return 0;
}

还不够好,继续努力。

【上篇】
【下篇】

抱歉!评论已关闭.