Algorithm IOI限定符INOI任务2

Algorithm IOI限定符INOI任务2,algorithm,Algorithm,我不知道如何有效地解决以下环节中的问题2: 您可以在登录n)时间内完成此操作。(或者线性,如果你真的愿意。)首先,用一个非常大的负数将输入数组填充到下一个2的幂。现在,构建一个类似于区间树的数据结构;通过将数组一分为二,递归地对其进行分区。树中的每个节点表示一个子阵列,其长度为2的幂,并且从其长度的倍数开始,每个非叶节点有一个“左半”子节点和一个“右半”子节点 对于树中的每个节点,计算将0,1,2,3,…添加到该子数组并获取最大元素时发生的情况。请注意,这对于表示长度为1的子阵列的叶子来说是微不

我不知道如何有效地解决以下环节中的问题2:

您可以在登录n)时间内完成此操作。(或者线性,如果你真的愿意。)首先,用一个非常大的负数将输入数组填充到下一个2的幂。现在,构建一个类似于区间树的数据结构;通过将数组一分为二,递归地对其进行分区。树中的每个节点表示一个子阵列,其长度为2的幂,并且从其长度的倍数开始,每个非叶节点有一个“左半”子节点和一个“右半”子节点

对于树中的每个节点,计算将
0,1,2,3,…
添加到该子数组并获取最大元素时发生的情况。请注意,这对于表示长度为1的子阵列的叶子来说是微不足道的。对于内部节点,这只是长度为/2+右子节点的左子节点的最大值。所以你可以在线性时间内建立这棵树

现在我们想在这棵树上运行一系列
n
查询,并打印出答案。查询的形式为“如果我将
k,k+1,k+2,…n,1,…,k-1添加到数组并报告最大值,会发生什么情况?”


<>注意,当我们把这个序列添加到整个数组中时,n和1之间的中断要么发生在开始/结束,要么在中间,或者在左半部的某个地方,或者在右半边的某个地方发生。因此,将数组划分为
k,k+1,k+2,…,n
部分和
1,2,…,k-1
部分。如果识别树中表示完全位于两个序列之一内但其父级不存在或跨越断点的子阵列的所有节点,则将有O(logn)个节点。您需要查看它们的值,添加各种常量,并取最大值。因此,每个查询都需要O(logn)时间。

为什么不使用简单的
O(n^2)
算法呢?因为这不会完成第二个子任务(1)