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

    心之所动 且就随缘去吧
  • 相关阅读:
    复习面向对象--继承,重写,重载,抽象详解
    复习面向对象---员工案例
    连接池介绍 + 示意图 + 手写连接池pool
    statement 和 preparedStatement 优缺点
    软件测试(二十三)
    软件测试(二十二)
    软件测试(二十一)
    软件测试(二十)
    软件测试(十九)
    软件测试(十八)
  • 原文地址:https://www.cnblogs.com/iat14/p/11619935.html
Copyright © 2011-2022 走看看