复健

大家都去备战国赛了,就我还在复健/ng

记录一些最近开的题,都比较简单。

P10653 [ROI 2017] 存储器 (Day 2)

考虑特殊性质,\(t\) 字符全相等,那么只需要考虑 \(s\) 能不能合并成一段 +-,暴力的做法就是一直看每个段能不能合并,是 \(n^2\) 的,然后发现每次合并只会影响相邻的段是否能合并,用链表/并查集维护即可。

对于一般的情况按 \(t\) 的极长的相同段分开,然后每一段跟特殊性质做法是一样的,注意判断一下分段的地方的合法性。

P13252 [GCJ 2014 #1B] The Bored Traveling Salesman

评分虚高。感觉很一眼。

题目选出的实际上是一颗生成树,要先序遍历字典序最小。首先根一定是最小值,然后考虑往树上加点,每次把能选的权值最小的点加入。因为要维护先序遍历,考虑维护一条根到当前点的一条链,每次选一个点后删去个后缀再在末尾加一个点。

考虑判断一个点能不能选,只需要跑一遍 bfs 看通过链上的点是否能到达剩下的所有点,注意中途不能经过之前已经选过的点。

因为 \(n\) 只有 \(50\),随便写都能过。

P3626 [APIO2009] 会议中心

用倍增可以快速求一个值域区间的答案。

要方案字典序最小,直接从 \(1\) ~ \(n\) 依次看每个区间选了过后答案会不会变,随便维护一下就行。

P6908 [ICPC 2015 WF] Evolution in Parallel

不会贪心/yun。

把所有串按长度排序,直接贪心加字符串,维护当前两个序列的末尾 \(A,B\),考虑加入一个 \(s\)

假如 \(s\) 只能接 \(A,B\) 中的一个,直接接上去就行。假如都不行就是无解。

问题在于 \(A,B\) 都能接的时候,这里需要决策,考虑把都能接的串存在一个序列 \(C\),假如后来有一个 \(s\) 只能加入 \(A\),那就把 \(C\) 放到 \(B\) 后边,\(B\) 也是同理的。对于有多个串都是 \(A,B\) 都能接的串,假如这些串能接一起就接成一个串存在 \(C\) 里,否则这些串就要分成两个串,把这两个串分别接到 \(A,B\) 后边就行。

[ARC086E] Smuggling Marbles

深度不同的点贡献可以拆,然后就很简单了。

不动脑子不想写长剖可以直接对 \(\text{dep}\) 相同的点建虚树,然后就是个简单的 0/1 dp。

长剖维护 dp 就能线性。

P11847 [USACO25FEB] True or False Test P

\(a+b\) 排序,变成对每个 \(k\) 求 $\sum_{i\ge p} a_i $ 减去 \(b\)\(1\)\(p-1\) 的前 \(k\) 小的和的最大值。

根据知觉这东西有决策单调性,然后用主席树快速求值即可。

QOJ12118 Dendrology / 树木学

很 educational 的题。

先考虑静态的答案怎么求,不难先想到对每个点求它在多少个区间的虚树中出现。

然后发现对点的约束有一点复杂,因为一个点连着多个点,于是考虑边,对于一条边 \((u,v)\) 而言,要出现在虚树上相当于存在两个点分别在 \(v\) 子树内和子树外(不妨 \(u\)\(v\) 的父亲)。

然后考虑对于边 \((u,v)\),我们将 \(v\) 子树内的点的位置覆盖成 \(1\),子树外的覆盖成 \(0\),那么 \((u,v)\) 不出现在虚树上的区间就是全为 \(0/1\) 的区间。对于 0/1 序列我们可以用线段树动态维护答案,然后 dsu on tree 过后只会有 \(n\log n\) 次染色的修改,复杂度 \(n\log^2 n\)

然后考虑修改,因为修改只交换一条边的两个点,前边对静态问题求解时,算边 \((u,v)\) 的答案只在乎一个点是否在 \(v\) 子树内,所以只对这条边的贡献有影响。

于是我们可以在修改记录每次交换的 \((u,v)\),实际上是让 \(u,v\) 当中一个点出子树 \(v\),一个点进入子树 \(v\),然后把修改挂在这条边上离线,然后就能求出这次修改对答案的变化量。最后把变化量前缀和就是答案。

P6009 [USACO20JAN] Non-Decreasing Subsequences P

直接猫树分治 \((q+n\log n)k^2\) 就过了。

然而很愚蠢的是这里转移矩阵是可以求逆的,维护前缀积就是 \((n+q)k^2\),看来数据还得开大。

P6235 [eJOI 2019] 矩形染色

首先矩形的每个格子只被两条对角线覆盖,然后发现题目求的是二分图最小点覆盖。

两种对角线可以写出它们的解析式是 \(x+y=k\) 以及 \(n-x+1+y=k\)

然后发现相交的对角线的奇偶性是相同的,所以按奇偶分组做两遍。

对于一条对角线 \(x+y=k_1\),枚举 \(x\),对角线 \(n-x+1+y=n-x+1+(k_1-x)=n-2x+1+k_1=k_2\) 与其相交,所以对于每个 \(k_1\) 连边的 \(k_2\) 是一个区间。

然后变成左边每个点连一个区间求最大流,这是经典问题,按右端点排序贪心就行。

posted @ 2026-07-13 16:59  yzq_yzq  阅读(18)  评论(1)    收藏  举报