2020.11.27【NOIP提高A组】模拟 总结
2020.11.27【NOIP提高A组】模拟
怒刚 \(T1\) \(2h\) 最后刚了个寂寞,\(T2\) 没看懂题意觉得很难......错误题意下的 \(60ptes\) 也打不动。我怕是个废人了......
T1. 6897 第一题(diyiti)
一眼此题线性做法,然后就没有然后了。正解比较巧妙也不难,早上怎么就想不出来呢?!
一个点可能被其父亲或儿子感染,考虑分开维护(事实证明一起维护是没前途的,至少我不行)。
首先考虑怎么维护被儿子感染:当一个点被感染或者一个感染点被解封(操作 \(2\))时,将其父亲加入 危险集合;同时对于每个点维护其被感染且没有被封锁的儿子的个数,这个可以在操作 \(1,2\) 时简单维护;操作 \(4\) 时枚举危险集合,若元素的已感染且没有封锁的儿子个数大于等于 \(1\) 且该点未被封锁,那么该点被其儿子感染。
维护被父亲也不难:当一个点被感染或一个感染点被解封时,将其加入 感染集合,当一个未被感染点被解封时,将其加入父亲的 危险儿子集合,但需要注意,如果其父亲已被感染,则需要将其加入 感染集合;操作 \(4\) 时,枚举 感染集合 中未被封锁的点,然后枚举其 危险儿子集合 并判断是否能感染儿子。
这样子就可以 \(O(n + q)\) 维护啦!
注意细节:1. 一开始要把所有点加入其父亲的 危险儿子集合;2. 操作 \(4\) 后一定把原来集合清空后再加入新的点;3. 如果加集合时偷懒没判重那一定要小心加重之类的(比如维护已感染且没有被封锁的儿子个数时)。
T2. 第二题(dierti)
十分不争气地说出自己没看懂题面的现实(原地升天)。
出题人给的正解,树状数组扫描线 \(emmm\)...... 果断 \(Pass!\),我选择线段树!
线段树做法十分巧妙,虽然思路简单自然但我并不觉得自己考场就一定能想出来(而且这周状态这么差)。
首先转化题意,黑点 \(u\) 的 \(f_u\) 等与 其到根路径上的黑点数 + 不包含 \(u\) 的子树中有黑点的点的个数。
所以我们可以以点 \(u\) 对其子树的 \(f\) 的贡献分为四种:
- 以 \(u\) 为根子树内没有黑点,此时 \(u\) 对没有答案任何贡献。
- 以 \(u\) 为根的子树内的黑点全在 \(u\) 的某一棵子树中,此时 \(u\) 对除该子树内的点有 \(1\) 的贡献(并不包括 \(u\))
- 以 \(u\) 为根的子树内的黑点至少分布在 \(u\) 的两棵子树中,此时 \(u\) 对所有子孙有 \(1\) 的贡献。
- \(u\) 为黑点,此时对以 \(u\) 为根子树内所有点有 \(1\) 的贡献。
其中 \(3, \ 4\) 可以看作一种,所以 每个节点的状态最多只可能被修改两次。
考虑逐渐增加黑点的过程:
- 设此次将点 \(u\) 变为黑点
- 首先改变 \(u\) 的状态(\(1 \rightarrow 2 \ or \ 2 \rightarrow 3\))
- 然后向上更新 \(u\) 的祖先的状态,注意当到一个非 \(1\) 状态的点就停下(显然已经无法继续向上更新祖先状态),注意 \(u\) 在变为黑点 前 的状态
- 最后统计黑点的 \(\sum{f}\) 并乘入答案
- 注意更新状态时也要更新贡献
需维护所有点的 \(f\),黑点的 \(f\),黑点的个数。\(DFS\) 序重排后即是区间操作,线段树维护即可。
T3. 6899 第三题(disanti)
题意即要求 \(\sum{(a_i - b_i)^2}\) 最小。
\(\sum{b_i}\) 恒为 \(C\),由基本不等式可知:\(a_i - b_i\) 尽可能均匀时有最小值(由于 \(b_i \geq 0\) 所以无法保证一定相等)。
将 \(a_i\) 从小到大排序,枚举 \(i\) 使得 \(b_{1..i} = 0\),此时可以求得差值为 \(\frac{C - \sum_{j = i + 1}^{n}{a_j}}{n - i}\),若 \(b_{i + 1} = a_{i + 1} + \frac{C - \sum_{j = i + 1}^{n}{a_j}}{n - i} \geq 0\),那么此时势必有最小值(别问,问就是不会证)。