CSP-S2019

括号树#

题意:给定一棵树,以 1 为根,每个点有字符 ()

定义 sii 到根的路径的子串中合法括号序列的个数,求 i=1ni×si1n5×105

pii 的父亲,aii 到根的路径以 i 结尾的合法括号序列个数。

显然有 si=spi+ai,只要求 ai 即可。

dfs 过程中模拟栈匹配,假设 i) 且能和某个未被匹配的 ( j 匹配,ai=aj+1

时间复杂度 O(n)submission

划分#

题意:长度为 n 的数组 {a},求一个划分 S={p1,p2,,pk} 满足:

i=1p1aii=p1+1p2aii=pk+1nai

最小化

(i=1p1ai)2(i=p1+1p2ai)2(i=pk+1nai)2

数据范围:1n4×107

f(i,j) 表示长度为 i 的前缀,最后一个分割点在 j 的最小值:

f(i,j)=(sisj)2+min(sisj)2(sjsk)2f(j,k)

存在结论:f(i,j)f(i,j1)

  • 只有一个分割点,两部分分别为 x,y,在 yx>1 的前提下,xx1, yy1 显然更优。

  • 否则设分割点数为 k,假设对于 1k1 都已经满足这个性质。

    将最后一个点左移:

    假设存在 j,使得 1j 保持不动,(j+1,k] 集体左移,在维持不降性质的同时使答案变小。

    可以看作 [pj+1,i] 上的一个子问题,而其规模小于 k,已经被证明不优了;

    否则所有分割点集体左移,设第 i 段长度为 li,存在一种最优方案使前 k 段每段长度不增。

    即:lilixi, lk+1lk+1+xi

    结论成立的一个充分条件为:lili1, lk+1lk+1+1 不优,这是显然的。

因此每个 f(i) 的转一段是唯一的,记作 prei

需要满足 sispreispreispreprei,移项即 si2spreispreprei

单调栈找到最大的 j 满足 si2sjsprej,那么 prei=j,时间复杂度 O(n)

不是很懂为什么要卡空间,把 pre 处理出来后从后往前扫一遍即可,只要开一个 i128

submission

树的重心#

题意:x 为树的中心当且仅当其最大子树大小不超过 n2,一棵树只可能有一个或两个重心。

删去边 e 使整棵树分裂为两部分,求:

eE(x 是 T1 的重心x+y 是 T2 的重心y)

数据范围:n3×105

选定原树的一个重心作为根 rt

先考虑 xrt 的情况。

如果断点一条边后 x 是重心,那么这条边不可能出现在 x 子树内。

sxx 子树大小,则 sxn2,如果断在子树内,则包含一棵大小为 nsx 的子树,与 x 是重心矛盾。

gxx 最大子树大小,S 为另一棵数的大小,需要满足:

{2gxnS2(nSsx)nS

整理一下:

n2sxSn2gx

对于一个 x,要找满足以下条件的边的个数:

  • n2sxSn2gx
  • 不在 x 子树内。

只考虑第一个限制:对于 faurt 的链,S=nsy,其他地方 S=sy,容易用树状数组维护。

利用出入子树时的增量把第二部分容斥掉(可以线段树合并)。

考虑 rt 作为根的次数,只关心最大子树 x 和次大子树 y,分类讨论断边位置即可。

submission

树上的数#

讲一下 CSP-S 史上最难题《树上的数》(只需入门组知识就能做的黑题)

posted @   Lu_xZ  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示