【发布时间】:2015-07-12 13:36:58
【问题描述】:
假设最初在数组a 中,每个元素的值都是无穷大。
现在M 查询是l r x 类型的输入。
这里l 到r 是a[i]>x 需要更新值的范围,其中l<=i<=r 和l<=r<=n。
M查询后需要在每个索引处输出最小值。
一种方法是使用蛮力
memset(a,inf,sizeof(a));
while(j<m)
{
scanf("%d %d %d",&l,&r,&c);
for(i=l-1;i<r;i++)
{
if(a[i]>c)
a[i]=c;
}
j++;
}
for(i=0;i<n;i++)
printf("%d",a[i]);
现在这需要 O(mn) 时间,其中 n=每个查询的大小,在最坏的情况下可能是 n。
有哪些更有效的方法可以以较低的时间复杂度解决这个问题?
【问题讨论】:
-
"M次查询后需要输出每个索引处的最小值。"你能详细说明一下吗?你的伪代码没有输出任何东西。
-
这只是意味着在 M 次查询之后,每个索引应该具有最小的可能值。我已经进行了修改。
-
在倒数第二句中你说
n在最坏的情况下可以是n!? -
@Ulrich 我的意思是说,在最坏的情况下,范围的大小等于数组的大小。
-
请编辑您的问题,而不是作为评论回答。