[POJ 2750]

Potted Flower

分类表里最后一道线段树了。

题意大概是:有一个环,环上有N个整数,求在每次更新环上某个值后,环(除整个环外)任意弧上最大的整数和。

乍看下去,虽然提示是用线段树,但还是想了很久也没思路。再看了下输入规模,N最大10^5,更新次数M也是10^5,于是单次更新的处理时间只能是O(lgN)的。这样便能看出来是每次更新都在线段树上作O(lgN)深度的线段信息更新,再由根结点信息得到结果。

这里由左右子结点得到父结点信息的题推关系还是挺麻烦的……要考虑左连续区间最值和对应的最右元素位置,右连续区间最值和对应的最左元素位置,以及区间中任意子连续区间上的最值,再加上区间上全部整数和,总共是6个量。

这里要记录左右最值区间对应边界位置是因为,最后在根结点处计算时是可以将最右和最左看作连续的(环的性质),这样如果子结点上左右区间有重叠时,直接相加便会出错了,因此记录边界便能在仅当左右区间不重叠时才计算值。

另外这题要求不能取整个环上所有元素,因此实际上求的是最小弧,再用全部整数和减去最小值便能得到最大弧了。