线段树 0分 全RE
查看原帖
线段树 0分 全RE
128451
x_miracle楼主2020/9/27 16:48

rt

下载数据后用洛谷IDE跑,过了。。不知道是不是有UB。

或者就是我写错了,请大佬看看。

谢谢

#include <bits/stdc++.h>
#define MAXN 10000000
using namespace std; 
struct node
{
	int val,left,right;
	node(){ val=0; }
}	tree[MAXN];
void build(int i,int l,int r)	//建树 
{
    tree[i].left=l;	tree[i].right=r;
    if(tree[i].left==tree[i].right)		{ scanf("%d",&tree[i].val);return; }
    if(r>l)
	{
		int mid=(l+r)/2;
		build((i<<1),l,mid);
		build((i<<1)|1,mid+1,r);
		
		tree[i].val=std::max( tree[i<<1].val , tree[(i<<1)|1].val );
	}
}
int Find(int i,int l,int r)//查找 
{
	if(tree[i].left==l && tree[i].right==r)	return tree[i].val;
	else
	{
		int mid=(tree[i].left+tree[i].right)/2;
		if(r<=mid) Find(i<<1,l,r);
		else if(l>mid) Find( (i<<1)|1,l,r );
		else
		{
			int l_max=Find(i<<1,l,mid),r_max=Find( (i<<1)|1,mid+1,r );
			return std::max(l_max,r_max);
		}
	}
}
int main()
{
	int n,m;
	std::scanf("%d%d",&n,&m);
	build(1,1,n);
	for(int i=1;i<=m;++i)
	{
		int ll,rr,ans=1;
		std::scanf("%d%d",&ll,&rr);
		ans=Find(1,ll,rr);
		std::printf("%d\n",ans);
	}
	return 0;
}

第一个测试点:

10 10
34510650 17635986 629392810 531021973 464687714 484934800 168882190 645518365 922058895 397659551 
2 9
1 8
1 7
2 10
3 9
4 10
3 10
1 7
2 10
2 8
922058895
645518365
629392810
922058895
922058895
922058895
922058895
629392810
922058895
645518365

谢谢谢谢

2020/9/27 16:48
加载中...