做题记录 25.10.11

· · 个人记录

\purple\odot P7219 [JOISC 2020] 星座 3

从下往上扫描,用并查集维护极大不存在船的连续段

考虑反悔贪心,建立一棵树状数组,i 位置保存在 x=i 处放置一个星星,为了消除矛盾而需要的代价

扫描到 y=i 时,枚举星星 (j,c),令 cs 为放置在 j 的代价,若 c\le cs 则消除当前的更优,令答案加上 c,否则消除之前的更优,答案加上 cs,并令树状数组上 j 所在连续段对应的区间整体加上 c-cs,表示反悔的代价

时间复杂度 O(n\alpha(n)+m\log n)

代码

参考

QOJ #3869. Gastronomic Event

对于一种排列方式 a_{1\sim n},对于任意一条边 u,v,若 a_u<a_v 则定向 u\to v,否则定向 u\gets v,显然一种 a 唯一确定一种定向,一种定向至少对应一种 a,而一种定向对应答案为有向路径数量

转化为选择一种定向方式使得答案最大

a\to b 表示存在有向边 a\to b,用 a\dashrightarrow b 表示存在 ab 的有向路径,反方向同理

定理 1:对于 a,b,c,d 满足 a\to b\dashleftarrow c\to d,调整为 a\gets b\dashleftarrow c\to d 并翻转子树 a 内(此处子树指以 a-b-c-d 链为根时的子树,下同)边的方向,或调整为 a\to b\dashleftarrow c\gets d 并翻转子树 d 内边的方向,两种操作中至少一种使答案增加

证明:

由定理 1 可得:任意一条路径都可调整为至多改变方向一次且答案不劣(显然答案有限,因此一定存在最优状态使得所有路径都至多改变一次方向)

定理 2:最优解中存在点 u,使得以 u 为根时,u 的所有子树内的点定向相同(其中一个点的定向为它和它父亲之间边的定向,向上或向下)

证明:

考虑枚举点 u,设它的子树大小为 sz_{1\sim k},每个子树内部贡献为子树内点深度之和(深度定义为到 u 的距离),与定向无关,容易换根 dp 求出

设定向为指向根的子树大小总和为 s,则剩余部分贡献为 (s+1)(n-s)

u 不是重心时,一定存在一个子树大小 >\frac n2,取该子树为 s 最优

u 为重心时,这样的 u 至多两个,对应的 sz 至多 O(\sqrt n) 种,二进制分组后至多 O(\sqrt n) 个值,用 bitset 求出所有合法的 s,时间复杂度 O(\frac{n\sqrt n}\omega)

定理 3:存在最优解使得选择的 u 为重心

证明:

因此实际上只需要选择任意一个重心,按之前的算法求出答案即可

总时间复杂度 O(\frac{n\sqrt n}\omega+n)

代码

参考