【Wannafly挑战赛29F】最后之作(Trie树,动态规划,斜率优化)

题面

牛客

题解

首先考虑怎么计算\([l,r]\)这个子串的不同的串的个数。
如果\(l=1\),我们构建\(Trie\)树然后第\(i\)层的点的个数就是\([1,i]\)的答案。
如果\(l\)要向右移动一位,显然就是我们要把最上面那一层给删掉。
那么我们暴力对\(Trie\)树进行合并,因为每个点最多只会被合并一次,所以复杂度是\(O(|\sum|*tot)\)的,其中\(tot\)是\(Trie\)树点数,\(|\sum|\)是字符集大小。
因为数据范围较大,显然不可能暴力把所有\([l,r]\)的答案都维护出来,但是我们发现当\(l\)固定的时候,\(r\)单增时,\([l,r]\)不同的串的个数也是单增的,所以我们只需要维护一下单增的位置就行了。
考虑维护数组\(g[i][j]\)表示当前左端点在\(i\),不同的串的数量为\(j\)时最靠左的右端点。这个每次二分一下就行了。
接下来就把\(g[i][j]\)设为\([i,j]\)这段区间的不同的串的个数了,这个只需要在我们预处理的东西里二分。
如果\(dp\)的话,显然大家都会\(O(len^2)\)的暴力。
因为上面预处理是右侧的第一个右端点,所以我们考虑从后往前\(dp\)。如果要从前往后\(dp\)的话就维护以这个点为右端点的第一个左端点。这样子的话串要反着插入进\(Trie\)中。
设\(f[i]\)表示当前已经考虑完了\([i,len]\)的最大贡献,显然\(i\)是左端点,我们就需要枚举一个右端点,此时的转移是:
\[f[i]=\max_{r=i}^{len}\{f[r+1]+p*g[i][r]+a[i]*(r-l+1)+b[i]\}\]
我们对于\(g[i][r]\)相同的一段\(r\)可以一起考虑,这样子要求的本质上就是\(val[r]+a[i]*r\)的最大值,其中\(val[r]\)是只和\(r\)相关的东西。发现这个东西是一个一次函数的形式,要求在\(x=a[i]\)位置时的最大值。不难想到这是一个斜率优化的形式,于是就可以拿李超线段树直接维护了,这样子的复杂度是\(O(n*len*logn)\)。

首先注意到因为\(p>0\),所以即使我们可以直接把\(g[i][r]\)更大的\(r\)也给当成当前的\(g[i][r]\),也就是我们每次转移都是从一段后缀转移过来。
于是我们的问题可以变成从后往前依次把点加入进凸壳,在每个时刻凸壳加入完之后,我们要把它给转移到若干位置上去。这样子发现逃脱不了在凸壳上二分的问题。也就是我们并不能优化复杂度。因为\(a_i\)不具有单调性。
那么,现在我们把\(dp\)正过来做,变成:
\[f[i]=\max_{l=1}^{i}\{f[l-1]+p*g[l][i]+a[l]*(i-l+1)+b[l]\}\]
于是要求的东西变成了\(val[l]+i*a[l]\)最大。
我们要构建的凸壳也变成了前缀凸壳,每次查询的\(x=i\)。
这个时候发现查询的东西具有了单调性,那么我们就可以有更加有趣的做法了。
考虑对于\(k\in[1,n]\)维护一个在凸壳上的指针,维护的表示的是\(g[l][i]=k\)时,在凸壳上查询的指针。每次修改凸壳的时候,如果当前指向的位置为删掉了,显然指针就会减一,然后再暴力向右移动就好了。
因为凸壳的点不单调,所以要用平衡树维护凸壳,简单的用\(set\)实现就好了。
这样子的复杂度是\(O(nm+nlogn)\)。

代码它咕咕咕了。

【Wannafly挑战赛29F】最后之作(Trie树,动态规划,斜率优化)的更多相关文章

  1. Wannafly挑战赛10F-小H和遗迹【Trie,树状数组】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/72/F 题目大意 \(n\)个字符串,包括小写字母和\(\#\).其中\(\#\)可以替换为任意字符串.求有多 ...

  2. 【BZOJ3672】【NOI2014】购票(线段树,斜率优化,动态规划)

    [BZOJ3672][NOI2014]购票(线段树,斜率优化,动态规划) 题解 首先考虑\(dp\)的方程,设\(f[i]\)表示\(i\)的最优值 很明显的转移\(f[i]=min(f[j]+(de ...

  3. Wannafly挑战赛18 E 极差(线段树、单调栈)

    Wannafly挑战赛18 E 极差 题意 给出三个长度为n的正整数序列,一个区间[L,R]的价值定义为:三个序列中,这个区间的极差(最大值与最小值之差)的乘积. 求所有区间的价值之和.答案对\(2^ ...

  4. BZOJ 1212 HNOI2004 L语言 AC自己主动机(Trie树)+动态规划

    标题效果:给定词的列表,并m串 每个字符串q个最长前缀,这个前缀可满足拆分成一些字符串 这些字符串中存在的词汇太 再也不怕错误的数据范围--有一个很明显Trie树能解决的问题竟然被我写的AC自己主动机 ...

  5. 4.15 省选模拟赛 编码 trie树 前缀和优化建图 2-sat

    好题 np. 对于20分 显然可以爆搜. 对于50分 可以发现每个字符串上的问号要么是0,要么是1.考虑枚举一个字符串当前是0还是1 这会和其他字符串产生矛盾. 所以容易 发现这是一个2-sat问题. ...

  6. 【BZOJ-3672】购票 树分治 + 斜率优化DP

    3672: [Noi2014]购票 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1177  Solved: 562[Submit][Status][ ...

  7. Wannafly挑战赛23F-计数【原根,矩阵树定理,拉格朗日插值】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/161/F 题目大意 给出\(n\)个点的一张图,求它的所有生成树中权值和为\(k\)的倍数的个数.输出答案对\ ...

  8. Wannafly 挑战赛22 D 整数序列 线段树 区间更新,区间查询

    题目链接:https://www.nowcoder.com/acm/contest/160/D 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K ...

  9. Wannafly挑战赛2 C.Butterfly(线段树优化枚举)

    题目链接  C.Butterfly 令$fd[i][j]$为以$s[i][j]$为起点开始往下走最大连续的‘X’个数 令$fl[i][j]$为以$s[i][j]$为起点开始往左下走最大连续的‘X’个数 ...

随机推荐

  1. solidity 智能合约之间的调用

    智能合约之间的调用 在区块链上,有些功能往往无法通过一个智能合约完成,此时便会用到智能合约之间的调用.本篇文章带大家通过具体示例来了解一下智能合约之间的调用. 在智能合约的编译过程中,有两种情况:调用 ...

  2. CentOS安装Docker-ce并配置中国国内加速(aliyun)镜像

    前提条件 1.系统.内核 CentOS7 要求64位系统.内核版本3.10以上 CentOS6 要求版本在6.5以上,系统64位.内核版本2.6.32-431以上 查看内核版本号 uname -r # ...

  3. hive creating temporary folder on: Error encountered near token 'TOK_TMP_FILE'

    执行create tmp.tablename  as select .....语句的时候报以下错误: SemanticException 0:0 creating temporary folder o ...

  4. python基础(9):基本数据类型四(set集合)、基础数据类型补充、深浅拷贝

    1. 基础数据类型补充 li = ["李嘉诚", "麻花藤", "⻩海峰", "刘嘉玲"] s = "_&qu ...

  5. DevExpress的TreeList实现自定义右键菜单打开文件选择对话框

    场景 DevExpress的TreeList实现节点上添加自定义右键菜单并实现删除节点功能: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...

  6. 马蜂窝 iOS App 启动治理:回归用户体验

    增长.活跃.留存是移动 App 的常见核心指标,直接反映一款 App 甚至一个互联网公司运行的健康程度和发展动能.启动流程的体验决定了用户的第一印象,在一定程度上影响了用户活跃度和留存率.因此,确保启 ...

  7. PHP setcookie 网络函数

    setcookie - 发送 Cookie. 语法: setcookie ( string $name [, string $value = "" [, int $expire = ...

  8. 区块链社交APP协议分析:Qbao

    - Qbao是什么 - Qbao报文情况 本节我们开始使用Qbao软件,并抓取其报文进行分析. 对APP进行协议分析抓包的一般过程是: 1.打开抓包APP进行抓包: 2.打开APP开始使用: 3.对每 ...

  9. arcgis api for javascript 学习(二) 发布并调用地图切片

    文章将从发布切片地图到调用切片地图整个过程都展示出来. (一).切片地图的发布 1.还是前面的arcgis展示的地图 2.与发布动态地图前面的步骤是一样的 打开分享后,如图 3.一切就绪后,到达缓存的 ...

  10. MySQL基于报错注入2

    目标站点: 0x1 注入点判断 http://www.xxxxxx.com/pages/services.php?id=1 #true http://www.xxxxxx.com/pages/serv ...