7月暑期集训补题(7.14 ~ 7.27)
咕咕咕。
堆
你发现先插入后删除能够保证当前最大值单调不增,那么操作就变成在桶上维护最大值指针,如果新插入的数成为最大值直接删去,否则移动最大值指针。指针最多移动 \(n\) 次均摊下来就是 \(O(n)\)。
P3960 [NOIP 2017 提高组] 列队
你发现每一行和最后一列之间相对独立,考虑拆成 \(n + 1\) 组,第 \(m\) 列为第 \(n + 1\) 组,其余 \(n\) 行每行一组。
由于涉及到单点查询、插入、删除的操作,但是点数很大考虑动态开点维护。对于删除操作我们考虑一种方便的软删除,即用 \(0/1\) 表示未删除/已删除,维护区间和就可以实现查询 \(k\) 大。同时我们维护每组的 vector 表示在该组末尾插入的新数。那么这样在每组中查第 \(k\) 大就可以查到当前 \((x,y)\) 的值。
流程如下:
- 在第 \(x\) 组查询到第 \(y\) 个。
- 把它插入到第 \(n + 1\) 组的末尾,在线段树上删掉它。
- 在第 \(n+1\) 组查询到第 \(x\) 个。
- 把它插入到第 \(x\) 组的末尾,在线段树上删掉他。
对于 \(y = m\) 的情况就是一维上的问题,同理。
CF461B Appleman and Tree
记 \(f_{x, 0/1}\) 表示 \(x\) 节点最终状态属于不存在黑色节点/存在黑色节点的联通块内的方案数。
考虑 \(x\) 与其子节点 \(v\) 的关系。
-
若 \(x\) 最终属于存在黑色节点连通块,则有:
- \(x,v\) 都属于存在黑色节点连通块,断掉这条边。
- \(v\) 不属于存在黑色节点连通块,\(x\) 属于存在黑色节点连通块,连到 \(x\) 上。
- \(x\) 不属于存在黑色节点连通块,\(v\) 属于存在黑色节点连通块,连到 \(v\) 上。
-
若 \(x\) 最终属于不存在黑色节点连通块,则有:
- \(x,v\) 都不属于存在黑色节点连通块,连断都可。
- \(v\) 属于存在黑色节点连通块,\(x\) 不属于,断开边。
则可以得到转移:
-
\(f_{x,1} \leftarrow f_{x,1} \times f_{v,1} + f_{x,1} \times f_{v,0} + f_{x,0} \times f_{v,1}\)。
-
\(f_{x,0} \leftarrow f_{x,0} \times f_{v,0} + f_{x, 0} \times f_{v,1}\)。
答案就是 \(f_{1,1}\)。
P3177 [HAOI2015] 树上染色
考虑树上背包,子树内选点染色。
考虑记 \(f_{u, i}\) 表示 \(u\) 子树内选了 \(i\) 个点染黑的收益最大值。
考虑每条边被经过的贡献(好像是个经典 Trick),比如假设我们在这条边的一侧选了 \(s\) 个点,另外一边选了 \(t\) 个,那么这条边对答案产生的贡献可能就是 \(s \times t \times val_i\) 一类的。
那么可得转移:
分别表示子树内选的黑/白点和子树外的黑/白点产生在这条边的贡献。
答案为 \(f_{1,m}\)。
QOJ #7566. Interval Addition
你发现对于区间内的数能否通过加 \(z\) 变成 \(0\) 只跟其差分有关,差分之后就需要实现某处加某处减使区间为 \(0\)。
那么我们想要求最多能划分出的和为 \(0\) 的集合数,同时 \(n \leq 23\) 考虑枚举子集的暴力 dp,即记 \(f_{S}\) 表示 \(S\) 集合中最多能够划分出和为 \(0\) 的集合数,那么其实我们只需要枚举当前集合差什么数即可,复杂度就是 \(O(n2^n)\)。
P3623 [APIO2008] 免费道路
转化题意成鹅卵石路边权为 \(1\),水泥路边权为 \(0\),求一个构造生成树的方案使得生成树上边权和恰为 \(k\)。
首先考虑哪些 \(1\) 的边需要留,即存在于 MST 上的边一定会留,考虑调整法边权从大到小排再跑 kruskal 取没有选过的鹅卵石路。
P8386 [PA 2021] Od deski do deski
考虑合法可删序列 \(p\),若存在另一合法可删序列 \(q\),则 \(p + q\) 一定合法,即可删空。若 \(p\) 包含 \(q\) 则肯定删 \(p\) 更优,即删除区间不重。
那么考虑 \(p + x\) 合法,则 \(p + x + x\) 也合法,以此类推。
记 \(f_{i,j,0/1}\) 表示在长为 \(i\) 的序列后添加 \(j\) 种数是否合法的方案数。
答案为 \(\sum\limits_{i=1}^{m}{f_{n,i,1}}\)。
CF1679E Typical Party in Dorm
直接计数肯定不好做,考虑算不同大小的字符集 \(A\) 对答案的影响。
你发现 \(n \leq 1000\),那么我们可以暴力枚举回文中心,我们钦定要使 \([l,r]\) 回文,当然如果两端有确定字母不同则结束该中心的扩张。
那么会有几种情况(假设新扩张的左右两个下表分别为 \(x,y\)):
-
\(s_x = \text{?},s_y \neq \text{?}\) 或者 \(s_x \neq \text{?},s_y = \text{?}\),那么两者其中的问好一定是能被确定的,那么这个字符一定存在于字符集 \(A\) 中。
-
\(s_x = s_y = \text{?}\),只要两者相同即可,则有 \(17\) 种选择。
-
\(s_x = s_y \neq \text{?}\),不必理会。
能够确定的问号我们不用管,那么会产生不同 \(A\) 方案数贡献的只有不被确定的问号,其每个都会带来 \(\left|A\right|\) 的贡献。记其个数为 \(t\)。
考虑预处理 dp,记 \(f_{st,i}\) 表示字符集大小为 \(i\),状态为 \(st\) 时对答案的贡献。那么有 \(f_{st,i} = \sum\limits_{j=1}^{17}{j^t}\),当然我们要对每个以当前回文中心为回文中心的字串 \([l,r]\) 统计。
由于这样处理存在串与串包含的情况,那么对于 \(st' \subseteq st\) 会对 \(st\) 产生贡献,那么我们需要算 \(f_{st,i}\) 的高维前缀和。你发现正常枚举状态会算重,那么先枚举位在枚举状态就可以不算重。那么有:
每次询问答案就是 \(f_{st,\left|\sum\right|}\)。其中 \(st\) 为询问的字符集状态。
CF173D Deputies
如果这个二分图一边的点数是三的倍数直接就对了。
否则我们令点数模三余一的一边为黑色点,另一边模三余二的为白色点,你发现我们只需要判断一组一黑二白的组合或者两组二黑一白的组合是否存在即可。

浙公网安备 33010602011771号