【Wannafly挑战赛29F】最后之作(Trie树,动态规划,斜率优化)
【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树,动态规划,斜率优化)的更多相关文章
- Wannafly挑战赛10F-小H和遗迹【Trie,树状数组】
正题 题目链接:https://ac.nowcoder.com/acm/contest/72/F 题目大意 \(n\)个字符串,包括小写字母和\(\#\).其中\(\#\)可以替换为任意字符串.求有多 ...
- 【BZOJ3672】【NOI2014】购票(线段树,斜率优化,动态规划)
[BZOJ3672][NOI2014]购票(线段树,斜率优化,动态规划) 题解 首先考虑\(dp\)的方程,设\(f[i]\)表示\(i\)的最优值 很明显的转移\(f[i]=min(f[j]+(de ...
- Wannafly挑战赛18 E 极差(线段树、单调栈)
Wannafly挑战赛18 E 极差 题意 给出三个长度为n的正整数序列,一个区间[L,R]的价值定义为:三个序列中,这个区间的极差(最大值与最小值之差)的乘积. 求所有区间的价值之和.答案对\(2^ ...
- BZOJ 1212 HNOI2004 L语言 AC自己主动机(Trie树)+动态规划
标题效果:给定词的列表,并m串 每个字符串q个最长前缀,这个前缀可满足拆分成一些字符串 这些字符串中存在的词汇太 再也不怕错误的数据范围--有一个很明显Trie树能解决的问题竟然被我写的AC自己主动机 ...
- 4.15 省选模拟赛 编码 trie树 前缀和优化建图 2-sat
好题 np. 对于20分 显然可以爆搜. 对于50分 可以发现每个字符串上的问号要么是0,要么是1.考虑枚举一个字符串当前是0还是1 这会和其他字符串产生矛盾. 所以容易 发现这是一个2-sat问题. ...
- 【BZOJ-3672】购票 树分治 + 斜率优化DP
3672: [Noi2014]购票 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1177 Solved: 562[Submit][Status][ ...
- Wannafly挑战赛23F-计数【原根,矩阵树定理,拉格朗日插值】
正题 题目链接:https://ac.nowcoder.com/acm/contest/161/F 题目大意 给出\(n\)个点的一张图,求它的所有生成树中权值和为\(k\)的倍数的个数.输出答案对\ ...
- Wannafly 挑战赛22 D 整数序列 线段树 区间更新,区间查询
题目链接:https://www.nowcoder.com/acm/contest/160/D 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K ...
- Wannafly挑战赛2 C.Butterfly(线段树优化枚举)
题目链接 C.Butterfly 令$fd[i][j]$为以$s[i][j]$为起点开始往下走最大连续的‘X’个数 令$fl[i][j]$为以$s[i][j]$为起点开始往左下走最大连续的‘X’个数 ...
随机推荐
- Web前端——Html常用标签及属性
html 常用的标题等标签就不记录了,只记录一下比较少见的标签以及属性 表格 table td 单元格 tr 表的行 th 表头 td或th可以下面的两个属性达到跨行或跨列 表格跨行 rowspan ...
- RocketMQ(4)---RocketMQ核心配置讲解
RocketMQ核心配置讲解 RocketMQ的核心配置在broker.conf配置文件里,下面我们来分析下它. 一.broker.conf配置 下面只列举一些常用的核心配置讲解. 1.broker. ...
- 2019-7-3-WPF-使用-Win2d-渲染
原文:2019-7-3-WPF-使用-Win2d-渲染 title author date CreateTime categories WPF 使用 Win2d 渲染 lindexi 2019-07- ...
- 清新水墨色中国风通用教育培训课件PPT模板
模板来源:http://ppt.dede58.com/jiaoxuekejian/26220.html
- 垃圾分类环保宣传 PPT模板
模板来源:http://ppt.dede58.com/peixunyanjiang/26263.html
- RiscV汇编介绍(1)-编译过程
从c/c++源文件,到可以执行文件,需要以下几个步骤: 预处理/编译 汇编 链接 下面我们以hello world程序为例,展示整个编译链接过程. 1. 编写hello.c代码 #include &l ...
- 安卓开发笔记(三十三):Android仿写微信发现
首先我们来看看仿写之后的效果: 看到是这个界面我们首先应该思考这些按钮是怎么做出来的?有了一个整体的思路之后才知道该怎么办.最开始我想的就直接利用button控件上面直接加上png的图片就可以形成一个 ...
- 微信小程序上拉加载——分页
wxml: <view class="page"> <scroll-view class="imageViewCss_1" scroll-y= ...
- ABP进阶教程1 - 条件查询
点这里进入ABP进阶教程目录 添加实体 打开领域层(即JD.CRS.Core)的Entitys目录 //用以存放实体对象添加一个枚举StatusCode.cs //状态信息 using System; ...
- SQL Server Alwayson 主从数据库账号同步
我们建立了Alwayson后,辅助副本下的数据库是没有相应的账号的,怎么样进行账号的同步呢?怎么在不知道密码的情况下,进行账号的同步设置. 我们可以通过SP--sp_help_revlogin 来实现 ...