【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. Zabbix 数据清理

    目录 Zabbix 数据清理的一系列操作 一.问题 二.解决办法 Zabbix 数据清理的一系列操作 基本信息: Zabbix 版本 4.0.9 MySQL 版本 5.5 一.问题 我们将 Zabbi ...

  2. Redisson实现分布式锁(1)---原理

    Redisson实现分布式锁(1)---原理 有关Redisson作为实现分布式锁,总的分3大模块来讲. 1.Redisson实现分布式锁原理 2.Redisson实现分布式锁的源码解析 3.Redi ...

  3. 帝国CMS系统目录结构介绍

    帝国CMS目录结构介绍 / 系统根目录├d/            附件和数据存放目录 (data)│├file/       附件存放目录│├js/         JS调用生成目录│└txt/   ...

  4. python中自带的三个装饰器

    说到装饰器,就不得不说python自带的三个装饰器: 1.@property 将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A(): @propert ...

  5. Java入门——初识Java

    Java入门——初识Java 摘要:本文主要对Java这门编程语言进行简单的介绍. Java简介 说明 Java语言历时十多年,已发展成为人类计算机史上影响深远的编程语言,从某种程度上来看,它甚至超出 ...

  6. Jquery选择器个人总结

    1.选择第一级子节点 通过> 或者children方法实现 $('#XtraTabPage8>.datagrid-ftable') $('#XtraTabPage8').children( ...

  7. Kotlin介绍(非原创)

    文章大纲 一.Kotlin简介二.Kotlin相比Java优势三.Kotlin与Java混合使用四.参考文章   一.Kotlin简介 1. 什么是Kotlin 安卓和Java,前者是最受欢迎的移动开 ...

  8. MVC 、MTV 模式

    著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的对象(ORM),视图负责与用户的交 ...

  9. Python股票历史数据的获取

    获取股票数据的接口很多,免费的接口有新浪.网易.雅虎的API接口,收费的就是证券公司及相应的公司提供的接口.收费试用的接口一般提供的数据只是最近一年或三年的,限制比较多,除非money足够多.所以本文 ...

  10. day74_10_21 三大认证

    一.权限六表. 一般在django中,基于用户权限访问控制的认证是RBAC(Role-Based Access Control) 还有一些基于auth的认证规则. Django框架采用的是RBAC认证 ...