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

    心之所动 且就随缘去吧
  • 相关阅读:
    register based 和 stack based虚拟机的区别
    Java in a Nutshell学习笔记
    Java中interface和abstract class的区别和联系
    Java中final的作用
    Android 源码下载
    Android Fragment 你应该知道的一切
    Android Fragment 真正的完全解析(下)
    Android Fragment 真正的完全解析(上)
    IntelliJ IDEA 使用总结
    Linux在目录中查找某个函数
  • 原文地址:https://www.cnblogs.com/iat14/p/11619935.html
Copyright © 2020-2023  润新知