2024-10 记录

10.6

# 4815. Flower's Land

给定一棵 nn 个节点的树,和一个整数 kk,点有点权,对于每个点,求出包含其的大小为 kk 的连通块的最大价值。

1n4×104,1k103,8s1\le n\le 4\times 10^4,1\le k\le 10^3,8s

有一个感觉挺对的做法:先求出根节点的答案,再考虑换根,换根的本质是求不含一个儿子时的背包状态,可以分治+撤回做,最终复杂度 O(nklogn)O(nk\log n)

正解的想法很有意思:点分治也可以用来求连通块问题。

与路径类似,我们找到分治中心 rr,对于每个 uu 求包含 u,ru,r 的连通块最值,这样就必选了一条链,将子树按 dfndfn 序排序后,容易发现这条链将树分成了两个区间,于是可以转化为前后缀 0101 背包合并,总时间复杂度 O(nklognk)O(nk\log\frac{n}{k})

O. New School Term

有一个 2n2n 个节点的图,有 mm 条边,第 ii 条边边权为 2i2^i,将图黑白染色,使黑白点各 nn 个,总代价为连接两个相同颜色的点的边的边权之和,求最小代价。

n5000,m106,3sn\le5000,m\le 10^6,3s

这个边权显然是要我们从大到小谈心地选边,每次连边都是将两个二分图合并,因此 mm 是假的,因为就算不选一条边都会使两个图反过来合并,至多合并 n1n-1 次。

由于最终要求黑白点数各为 nn,因此每次贪心后还要检验是否存在解,可以用背包解决,对于每个合并好的二分图,记其中一类点的权值为 11,另一类为 1-1,一张二分图的总价值为 ww,对答案的贡献可为 www-w,若能凑出 00 则有解。

由于二分图会合并,所以我们的背包还要支持删除物品,考虑改可行性为方案数,方程为 dpi=dpiw+dpi+wdp'_i=dp_{i-w}+dp_{i+w},难以删除。实际上这种必选背包可转化为 0101 背包,先令总和为 w\sum -w,这样每个图可以不选或选并产生 2w2w 的贡献,于是就可删除了,做到了 O(n) checkO(n)\ \text{check}

总时间复杂度 O(n2+m)O(n^2+m)

10.7

偷一个翻到的博客

10.8

偶然发现一种子树直径的维护方式:先将节点按 dfsdfs 序排序,用线段树维护直径,线段树每个点记录区间内的点的直径及其端点,由于一段 dfsdfs 序区间可以看成缺少父亲的若干棵相邻子树,而直径端点必然是叶子结点,于是可以直接区间合并。用朴素的倍增 LCALCA 实现的复杂度是 O(nlog2n)O(n\log^2n) 的,使用 stst 表可优化到 O(nlogn)O(n\log n)。特别地,挖掉一棵子树的树也可以看成一棵子树,故也可以合并。

10.10

给出一棵树,初始每个点均为白色,同时指出其中 mm 条链,对于每条链可以且必须把这条链上的点或这条链外的点染黑,求最后剩下的白点数量的最大值。

显然有 O(nlog2n)O(n\log^2n) 的树剖做法,但不够优秀。

考虑每种可能的情况,本质上是将树上的点分成了 2m2^m 个等价点集,最终只有一个点集能为白色。划分用哈希来解决,具体的,对每条链随机一个权值并将这条链的点权异或上这个权值,两个点属于同一个点集当且仅当他们的点权相同,于是就做完了。

10.14

@\text{@}ciuim \color{Red}\text{ciuim }\color{Yellow}{√}博客

10.15

[ARC065E] へんなコンパス

思路比较简单,但交上去一直 MLE\text{MLE}

我在动态开点线段树中每个点开了个 set\text{set} 来维护信息,理论上空间复杂度 O(nlogn)O(n\log n),但实际上是假的,set\text{set} 本身就有较大空间,以下是实测空 set\text{set}int\text{int} 的对比:

int: 8.00B
set: 56.00B

set\text{set} 的空间是 int\text{int}77 倍!断不可乱开。树套 set\text{set} 固然好用,但动态开点就会爆炸。

10.16

[ABC311Ex] Many Illumination Plans

直接暴力背包合并是 O(nx2)O(nx^2) 的,其实对于这一类树上 max+\max + 卷积,我们可以优化到 O(nlog21+kx)O(n^{\log_2{1+k}}x)kk 为背包中值域、编号以外的状态数。

前一个算法的瓶颈在于背包合并,考虑如何把合并改为单点加入,注意到每个节点加入背包时只与他的儿子的状态有关,且 max+\max + 卷积符合交换律,所以可以考虑自下而上 DPDP,具体地,把当前的 DPDP 数组下传给儿子让其单点加即可,但每层要传两次,复杂度达到 O(2nx)O(2^nx)

考虑树链剖分,每次继承重儿子的状态,对轻儿子仍用上面的做法,利用主定理可证得时间复杂度为 O(nlog23x)O(n^{\log_23}x)

10.18

口胡了一车题,但都不想码。

Flip and Reverse

再敲打自己三遍:0101 序列 \Leftrightarrow -11\texttt{-1}-\texttt{1} 折线图!0101 序列 \Leftrightarrow -11\texttt{-1}-\texttt{1} 折线图!0101 序列 \Leftrightarrow -11\texttt{-1}-\texttt{1} 折线图!

转化后,不难发现题中操作为将等高的两点间的图像绕垂直于 xx 轴的直线水平翻转。考虑建图,具体地,记前缀和为 a0na_{0\sim n},令每种值为点,在 aia_iai+1a_{i+1} 间连边,不难发现一次翻转使 aiai+1a_i\rightarrow a_{i+1} 变为了 ai+1aia_{i+1}\rightarrow a_i,也就是说边本质上是无向的,直接建无向边,跑字典序最小的欧拉路径即可。

10.21

P9870 [NOIP2023] 双序列拓展

本来以为是那年的 Ad_hoc\text{Ad\_hoc},没想到最近模拟赛考了类似的还不会,遂补。

问题转化为当前的两个右端点 (i,j)(i,j) 扩展到满足要求的 (i+1,j)(i+1,j)(i,j+1)(i,j+1)。不妨设要求为 ai>bja_i> b_j,考虑特殊性质 ana_n 最大 bmb_m 最小。容易发现,我们扩展的其中一段为 (i,j)(i,j+1)...(i,j+k)(i+1,j+k)(i,j)\rightarrow (i,j+1)\rightarrow...\rightarrow(i,j+k)\rightarrow(i+1,j+k),然后有一段是 ii 持续扩大,可以发现,将 ii 扩大到一个 i+pi+p 使 aiai+pa_i\le a_{i+p} 一定比 ai>ai+qa_i>a_{i+q} 更优,因为 ai+pa_{i+p} 能比 ai+qa_{i+q} 扩展更多的 jj,且即使用 ai+qa_{i+q} 跳转的 jj 也不如用 aia_i 跳转,同时还有 bmb_m 最小来保底 ai+qa_{i+q} 可在 aia_i 扩展后再出现,所以若能扩展我们一定会直接扩展到 ai+pa_{i+p}。对于 bb 也同理,取 bjbj+pb_j\ge b_{j+p} 即可。

至此我们就有了一个口胡的想法,每次按 aabb 的单调栈扩展,若无法扩展则无解。但感觉写的不够优美,我们考虑倒过来做,从 (n,m)(n,m) 走到 (1,1)(1,1),这样只需要记前缀最大值而不用记单调栈,一样扩展即可,非常好写。

若没有特殊性质,考虑到序列反过来配对和正着是一样的,于是把 aa 中最大值和 bb 中最小值左边的序列正常跑,右边的序列反过来一样跑一遍即可。

10.22

[ABC376G] Treasure Hunting

场上前期浪费了一些时间,导致 FF 赛后两分钟才过,这题甚至还没看。

类似的题还有 P4437 [HNOI/AHOI2018] 排列[AGC023F] 01 on Tree,我称为树上连通块贪心模型:当且仅当一个点的父亲被选择,这个点才能被选择,且前面点的选择对交换选择的相邻两个点贡献差没有影响。

对于本题,则是要求一个点的父亲要在该点之前被选择,使得 iapi\sum ia_{p_i} 最大。显然可以套用该模型。具体地我们可以对于当前的每个连通块(初始都是单点)维护连通块内部产生的价值、点权和与大小(在具体题目中可能为别的东西),再定义一个由邻项交换推出的权重,这里连通块 SS 的权重为 iSaiS\frac{\sum_{i\in S}a_i}{|S|},将每个连通块存入优先队列中,每次取权重最小的连通块与其父亲所在的连通块合并,最终得到答案。

CF2023D Many Games

首先 pi=100p_i=100 的肯定必须选,所以只需要考虑剩下的物品。

qi=pi100q_i=\frac{p_i}{100},不妨设当前选了一些物品,总重为 WW,概率为 QQ,收益为 W×QW\times Q,新加入一个物品 (wi,qi)(w_i,q_i),新收益为 (W+wi)×Q×qi(W+w_i)\times Q\times q_i,若收益增加,则 W×Q<(W+wi)×Q×qiW\times Q<(W+w_i)\times Q\times q_i,即 W(1qi)<wi×qiW(1-q_i)<w_i\times q_i,也就是 W(100pi)<wi×piW(100-p_i)<w_i\times p_i,注意到 wi×pi<2×105w_i\times p_i<2\times 10^5,因此 W<2×105W<2\times 10^5!所以我们最终答案的物品总重在 2×1052\times 10^5 级别!(当然可能会略大一些)

于是我们考虑背包,求出总重为 WWQQ 的最大值,直接做是 O(nW)O(nW) 的。注意到对于同一种 pip_i,我们肯定优先选 wiw_i 大的,同时显然 pi106\prod p_i\ge 10^{-6},因此每个 pip_i 选的物品的总数的总和很少,在 99×ln9945099\times \ln 99 \approx 450 左右,所以在满足 pi106\prod p_i\ge 10^{-6} 的前提下 dpdp 即可。

10.24

拆点法保证路径奇偶性

将点 uu 拆成点 u1,u2u_1,u_2,将一条边 uvu\rightarrow v 拆成 u1v2,u2v1u_1\rightarrow v_2,u_2\rightarrow v_1,这样偶数条边的路径就是从一层出发回到同一层。类似的,拆 kk 次就可以使路径在模 kk 意义下有相应的偏移。

10.26

树上路径覆盖贪心

例题:P7246 手势密码CF2023E Tree of Life

一般形式为:用最少的路径覆盖树,使得其满足题目的要求。

一般考虑自底向上贪心,在子树处先贪心地合并路径一定不劣(可以后面再拆开),于是可以以此记录状态,大分讨出结果。

原来今天是 CSP\text{CSP} 啊:

BigIntger rp;
while(1)rp=rp+BigIntger(1);

10.27

补个游记

10.30

模意义下的可达01背包

nn 个数 a1,a2,a3ana_1,a_2,a_3\dots a_n,对于 t[0,m1]\forall t\in[0,m-1],判断是否存在 x1,x2,x3xnx_1,x_2,x_3\dots x_nxi{0,1}x_i\in \{0,1\},使得 i=1nxiait(modm)\sum_{i=1}^nx_ia_i\equiv t\pmod mn,mn,m 同阶。

一眼有 O(nmw)O(\frac{nm}w) 的做法,但可以更优。

考虑每次新加入物品时,我们本质上是维护一个 bool\text{bool} 数组 ss,加入的物品大小为 xx 就是 s=ss<<xs=s|s<<x,注意这里的 << 是循环移位。考虑每次找到最小的一个 ii,使得 si(s<<x)is_i\neq (s<<x)_i,然后直接修改。查找可以二分,求出 sss<<xs<<x 的最长公共前缀,可用线段树做到单次 O(log2m)O(\log^2m),最终时间复杂度 O((n+m)log2m)O((n+m)\log^2m)

10.31

[ARC186A] Underclued

看到 01 矩阵,(应当本能地)想到建二分图。左右部各 nn 个点,分别编号为 a1,a2,,an,b1,b2,,bna_1,a_2,\dots,a_n,b_1,b_2,\dots,b_n,矩阵上的 0/10/1 对应一条有向边,总共 n2n^2 条。具体的,若 ci,j=1c_{i,j}=1,将 aia_ibjb_j 连边;若 ci,j=0c_{i,j}=0,将 bib_iaja_j 连边。若两个图相似,则两图对应点的入度、出度相等。若要将一个矩阵 AA 做一个微小的改变,则要把一个点的一条入边变为出边,一条出边变为入边,然后递归下去,直到成环,显然这样的限制是充要的,也就是说,一条边不是固定的,当且仅当其在一个环中。转换成有向二分完全图就是在一个强联通分量内。

这样问题就转化为了把一张有向二分完全图缩点后的 DAG 上可能的边的个数,直接 O(n6)O(n^6) dp 即可,转移是平凡的。

posted @ 2024-10-06 21:23  luckydrawbox  阅读(13)  评论(0)    收藏  举报  来源