专栏文章

题解:P5044 [IOI 2018] meetings 会议

P5044题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mip29lvg
此快照首次捕获于
2025/12/03 04:59
3 个月前
此快照最后确认于
2025/12/03 04:59
3 个月前
查看原文
模拟赛场上想出来的神秘做法。
对于单组询问,我们考虑在笛卡尔树上 DP,显然有转移:
fu=min(flsu+au(szrsu+1),frsu+au(szlsu+1))f_u=\min(f_{ls_u}+a_u(sz_{rs_u}+1),f_{rs_u}+a_u(sz_{ls_u}+1))
考虑怎么刻画区间笛卡尔树:找到区间最大值,把从左端点开始的前缀 max\max 及其右儿子和从右端点开始的后缀 max\max 及其左儿子合并起来。接下来我们只考虑右侧的做法。
从左往右扫,维护一个递减的单调栈并维护当前每个点的 DP 值 gig_i。考虑加入一个点 ii 产生的影响:
  • gig_i 显然是 flsi+aif_{ls_i}+a_ilsils_i 就是整个序列的笛卡尔树上的左儿子。
  • 前面的某个点 jjgjmin(gj+aj,gnxtj+aj(szlsj+1))g_j\gets\min(g_j+a_j,g_{nxt_j}+a_j(sz_{ls_j}+1))(从右往左依次转移),nxtjnxt_j 是单调栈上右边的元素。
看起来第二个不是很好维护,但是我们只需要求 QQgg,考虑不直接维护每个 DP 值。假如我们要询问的是 gxg_x,可以发现肯定是从询问时存在的某个 flsy+ayf_{ls_y}+a_y 转移过来的,被加上的一定是 yxy-xaya_y(显然吃最右边的最优)和他们之间的节点的 ai(szlsi+1)a_i(sz_{ls_i}+1) 的和,可以在单调栈上做一个前缀和,就是插入和询问的时候各加一个常数。
这样问题就变成了每个点有 aia_ibib_i,要支持单点修改,全局 bibi+aib_i\gets b_i+a_i,求区间 minbi\min b_i。显然可以 KTT 维护,时间复杂度 O(nlog2n)O(n\log^2n),常数很小。
code

评论

0 条评论,欢迎与作者交流。

正在加载评论...