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。表示,这些点贡献了其原序列值*到父亲边权*树上的值的答案。最后一起统计即可。

转载于:https://www.cnblogs.com/iat14/p/11619935.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值