Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 段树:每个查询都需要更新所有节点_C++_Algorithm_Time Complexity_Segment Tree - Fatal编程技术网

C++ 段树:每个查询都需要更新所有节点

C++ 段树:每个查询都需要更新所有节点,c++,algorithm,time-complexity,segment-tree,C++,Algorithm,Time Complexity,Segment Tree,给定一个数组,其中每个元素包含2个数字:a(i),b(i)即 数组[0]=对(a(0),b(0)) 数组[i]=对(a(i),b(i)) 有两种类型的操作: 更新i,c,d:array[i]=pair(c,d)即 数组[i]已更新为新的对 查询x:查找所有的最大值:(a(i))*x+b(i) 我创建了一个段树,每个节点都是一对((a(I)),(b(I))) 现在我的疑问是,因为每个查询都需要将段树中每个节点的第一个成员乘以x,所以每个查询的复杂性变成O(n) 如何将复杂性降低到O(logn)。按

给定一个数组,其中每个元素包含2个数字:a(i),b(i)即

数组[0]=对(a(0),b(0))

数组[i]=对(a(i),b(i))

有两种类型的操作:

更新i,c,d:array[i]=pair(c,d)即 数组[i]已更新为新的对

查询x:查找所有的最大值:(a(i))*x+b(i)

我创建了一个段树,每个节点都是一对((a(I)),(b(I)))

现在我的疑问是,因为每个查询都需要将段树中每个节点的第一个成员乘以x,所以每个查询的复杂性变成O(n)


如何将复杂性降低到O(logn)。

a[I]
对数组进行排序。使用图形创建顶部边缘集。基本上从第一条边开始,然后每次添加边时检查前一条边是否仍然可见,如果不可见,则将其删除,并重复此操作,直到前一条边仍然可见


获得集合后,存储从一条线切换到另一条线的点(可见线之间的交点)。然后,对查询执行二进制搜索,找出它落在哪一点之间,并在那里取一行O(logn)。

a[i]
对数组排序。使用图形创建顶部边缘集。基本上从第一条边开始,然后每次添加边时检查前一条边是否仍然可见,如果不可见,则将其删除,并重复此操作,直到前一条边仍然可见


获得集合后,存储从一条线切换到另一条线的点(可见线之间的交点)。然后对一个查询进行二进制搜索,找出它落在哪一点之间,并在那里取一行O(logn)。

您应该正确设置问题的格式,并显示代码。现在它看起来像是一个编程竞赛中的问题,你决定外包给一个廉价劳动力并收集分数。你应该正确地设置你的问题的格式,并显示代码。现在它看起来像是一个编程竞赛中的问题,你决定外包给一个廉价劳动力并收集积分。你这里所说的边是什么意思?
ax+b
定义了一条线。边缘是其中的一行,很抱歉让您感到困惑。每次添加一行时,都需要检查以前的所有行,这导致每次更新都是O(n)。但需要的复杂性要低得多。如果您能够解释如何实现这一点,那将是非常好的。您的问题是关于查询的。不管怎样,添加一条线很容易,您可以通过二进制搜索找到线在解决方案中的位置,然后检查下一条线是否完全隐藏,如果没有,则删除之前隐藏的所有线段。由于每一行仍然只能在摊销O(logn)(从搜索中)后删除。要删除一行,我不能完全确定。我认为你可以保留你删除的每一行,当你删除它时,尝试重新添加。但是,由于一行可以隐藏许多其他行,因此每次删除它可能仍然是O(N)。这里的边是什么意思?
ax+b
定义了一行。边缘是其中的一行,很抱歉让您感到困惑。每次添加一行时,都需要检查以前的所有行,这导致每次更新都是O(n)。但需要的复杂性要低得多。如果您能够解释如何实现这一点,那将是非常好的。您的问题是关于查询的。不管怎样,添加一条线很容易,您可以通过二进制搜索找到线在解决方案中的位置,然后检查下一条线是否完全隐藏,如果没有,则删除之前隐藏的所有线段。由于每一行仍然只能在摊销O(logn)(从搜索中)后删除。要删除一行,我不能完全确定。我认为你可以保留你删除的每一行,当你删除它时,尝试重新添加。但是,由于一行可以隐藏许多其他行,因此每次删除可能仍然是O(N)。