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\) 的贡献分为四种:

  1. \(u\) 为根子树内没有黑点,此时 \(u\) 对没有答案任何贡献。
  2. \(u\) 为根的子树内的黑点全在 \(u\) 的某一棵子树中,此时 \(u\) 对除该子树内的点有 \(1\) 的贡献(并不包括 \(u\)
  3. \(u\) 为根的子树内的黑点至少分布在 \(u\) 的两棵子树中,此时 \(u\) 对所有子孙有 \(1\) 的贡献。
  4. \(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\),那么此时势必有最小值(别问,问就是不会证)。

posted @ 2020-11-27 21:45  buzzhou  阅读(33)  评论(0)    收藏  举报