ICPC2018Jiaozuo 现场赛H Can You Solve the Harder Problem? 后缀数组 树上差分 ST表 口胡题解

传送门

题意:

给出n个数,每个数的值域为[1,10^6],现在要求所有本质不同的连续子区间的最大值的和。

 

本质不同的连续子区间,考虑到后缀数组。

suffix(sa[i])和suffix(sa[i + 1])之间的lcp为height[i]。那显然从sa[i+1]开始长度为height[i]以内的子区间,在前面都出现过本质相同的,不必考虑。所以对于每个suffix(sa[i+1]),都只考虑从sa[i + 1]开始,到[sa[i+1] + heigth[i],len]结束的子串,就达到了去重的效果。

我们再考虑,将序列中每个数,连向它右侧第一个比他大的数,将较大的数作为父亲,边权为距离。显然可以形成一片森林。

那么考虑,用ST表,从sa[i + 1]到sa[i + 1] + height[i] - 1这范围内最大的数x。假设他的父亲y为在locy。那么显然以sa[i + 1]开始,到[sa[i + 1] + height[i],locy - 1]这一段作为结尾,的子序列,都会以x作为最大值,贡献一些答案。并且依次类推,y的父亲z在locz位置,显然,y也会作为以sa[i + 1]开始,从到locy,locz - 1]结束的子段的最大值贡献答案。

所以每次,我们单独计算下x的贡献。我们就把从y开始,到根节点的每一个值都+1。表示,这些点贡献了其原序列值*到父亲边权*树上的值的答案。最后一起统计即可。

posted @ 2019-10-03 16:02  IAT14  阅读(350)  评论(0编辑  收藏  举报