【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. AllowsTransparency="True" 怎么放大缩小窗体

    后台都不用写任何代码! xaml: <Window x:Class="TestNoBorderWindow"         xmlns="http://schem ...

  2. Python爬虫使用selenium爬取qq群的成员信息(全自动实现自动登陆)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: python小爬虫 PS:如有需要Python学习资料的小伙伴可以 ...

  3. 数据库-表操作(CRUD)

    1.数据增删改 2.单表查询 3.正则表达式 4.多表查询 ​ 笛卡尔积 ​ 内连接 ​ 外链接 ​ 子查询 一.数据的增删改 为什么不说查 因为查询语句 有很多细节 所以先从简单的说起 添加数据: ...

  4. Winform中双击DevExpress的TreeList的树形节点怎样获取当前节点

    场景 DevExpress的TreeList怎样设置数据源,从实例入手: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10254 ...

  5. The method newInstance() from the type Class is deprecated since version 9

    newInstance()在 java9中已被弃用 JAVA9之前用法 Class.forName("类的全限定名").newInstance(); JAVA9之后用法 Class ...

  6. 安全意识第三期丨关于高速ETC办理的这些新骗局,速看!

    近期,最火爆的莫过于ETC了. 不仅各大银行,甚至微信和支付宝都推出了办理服务. 虽说更加便捷了,却也带来了安全隐患. 下面这个案例,大家一定要注意,已经有很多车主“中招”,落入了骗子的圈套. 注意: ...

  7. 在linux上安装postgresql数据库

    #postgres useradd postgres chown -R postgres:postgres /media su postgres mkdir -p /media/Data1/postg ...

  8. 解决vue中百度地图覆盖物引用本地图片问题

    这次的主要目的是在百度地图中引用自定义的覆盖物,路径是再asset/images/文件夹下,直接引用出错.需要先导入再引用. 在<script></script>代码中增加如下 ...

  9. 渗透测试学习 十九、 XSS跨站脚本漏洞详解 续2

    二阶注入环境搭建 74cms 3.4 直接将源码放在PHPstudy的www路径下,在地址栏中输入127.0.0.1回车 然后进入网站首页,在填写简历里面存在二阶注入 先注册一个账号 创建简历 前面的 ...

  10. Jmeter设置默认中文启动

    安装好jmeter,启动的页面是全英文,对于不熟悉jmeter的人来说,理解起来还是很困难的.如何设置成中文页面呢? 方法一:打开jmeter后,设置Options—choose language—C ...