2025 NOIP模拟赛 1
2025 NOIP模拟赛 1
A
诈骗。
注意到虽然说要求修改后仍然单调,但是可以手推一下这些操作先后顺序是不成环的。
因此只需要考虑 \(|a_i-b_i|\) 即可。
贪心地,你必然是尽可能均匀地拆分这个数字。
因此问题就变成了一个给每个数分配操作次数的问题了。
注意到 \(c\) 分配 \(k\) 次是 \(\frac{c^k}{k^k}\) 是一个凸函数,因此可以进行贪心:使用优先队列,最开始假定每个数都只分配1,每次取出多给一次操作收益最大的进行操作。
B
注意到一个数分为两个阶段,往前跳和往后跳。
设 \(pre_i=\sum_{j=1}^i[a_j>a_i]\)
则前 \(pre_i\) 轮都会往前跳,这是容易的。
对于第二种情况,我们考虑计算出 \(k\) 轮后有多少数字在 \(a_x\) 后面。
因为是第二种情况了,所有大于 \(a_x\) 的数都是满足的,现在考虑小于 \(a_x\) 的数,还在它后面没跳到前面来的条件。
可以发现,跳过一个数字(值)的数是递减的。
所以可以得到若 \(a_y<x,y>x\) 在 \(k\) 次操作后仍然可行的条件是:
注意到这个条件的满足与 \(y\) 无关,可以利用主席树上二分到一个 \(t\),\(y\ge t\) 就合法了。
因此我们还需要一个 区间小于 \(a_x\) 的数求和,主席树也是可以办到的。
C
很神奇,想到了超级钢琴但是没有想到怎么划分。
我们仿照超级钢琴的思路,我们想要把当前的决策范围根据最优解不重不漏进行划分,且仍然能容易得到各部分最优解。
根据部分分提示,可以想到,若 \(l\in I,r\in D\),若 \(I\cap D=\varnothing\),则是容易的,\(l\) 取 \(I\) 的最大,\(r\) 取 \(D\) 的最小。
若 \(I=D\) 也是容易的,可以线段树 pushup 时计算。
并且最初,\(I=D=[ql,qr]\)
那么我们只需要找到方案,可以将 \(I,D\) 划分为同样满足上面两种情况之一的各个部分即可。
这是可以做到且容易想到的:设最优解为 \((x,y)\)
-
\(I\cap D=\varnothing\)
设 \(I=[l_1,r_1],D=[l_2,r_2]\) ,拆为
- \([l_1,x-1],[l_2,r_2]\)
- \([x,x],[l_2,y-1]\)
- \([x,x],[y+1,r_2]\)
- \([x+1,r_1],[l_2,r_2]\)
-
\(I=D=[l,r]\),拆为:
- \([l,x-1],[l,x-1]\)
- \([l,x-1],[x,r]\)
- \([x,x],[x,x]\)
- \([x,x],[x+1,y-1]\)
- \([x,x],[y+1,r]\)
- \([x+1,r],[x+1,r]\)
这启发我们:
寻找易于解决,给出范围找最优解的情况
将已知情形尽可能划分为易于解决,易于划分的情况
二元问题可以引入平面工具
也即,此类 \(k\) 优解问题,直观的思路会直接思考如何有效地划分,但,当一般情形求算答案较为困难时,也可以寻找容易计算答案的情形反过来提示划分方案
D
树上行走问题,树上带权重心问题等,都可以考虑将贡献分拆到各条边上。
如此题,当只需要选出一个重心时,边 \((u,v,w)\) 的贡献显然是(\(u\) 为 \(v\) 的父亲,设 \(s\) 表示子树 \(a\) 和)
根据重心的性质,这是容易证明可以取到的,且这显然是一个下界。
现在需要选出两个重心,显然,某条边一定是没有贡献的(在其左边的会去左边的重心,右边的去右边的重心)。
因此不妨枚举这条边 \((u,v,w)\),则其代价是:
- \((u',v',w')\) 在 \(v\) 子树内:\(w'\min(s_v-s_{v'},s_{v'})\)
- 否则:\(w'\min(s_1-s_v-s'_{v'},s'_{v'})\),这是因为断掉边后,对于 \(v\) 的祖先,其 \(s\) 需要进行改动。
现在就是考虑如何计算每条边的计算了。
-
子树内:
按照 \(s_x\) 是否 \(\le \frac{s_v}{2}\) 进行讨论。
通过 dfn 将其拍到序列上,并将边权下放到点权记作 \(val\),则这个问题就相当于:
- 计算 \(dfn_x\in [l,r],s_x\le \frac{s_v}{2}\) 的 \(val_x\times s_x\) 的和
- 计算 \(dfn_x\in [l,r],s_x>\frac{s_v}{2}\) 的 \(val_x\) 和以及 \(val_x\times s_x\) 的和
这可以通过离线树状数组解决
-
子树外其实是类似的,我们只需要考虑 \(v\) 的祖先链的影响。
不妨考虑容斥,先按照原本的 \(s\) 进行计算,然后单独撤掉 \(v\) 祖先链的错误贡献并加上正确贡献。
第一步和上一个其实是本质等价的。
对于这祖先链的计算?由于祖先的 \(s\) 必然从下往上递增,因此可以通过树上倍增找到分界点并通过一定的预处理进行计算。
复杂度 \(O(n\log n)\)
计算易于计算的全局,再将特殊部分的错误贡献去掉并加入正确贡献,乃明智的选择

浙公网安备 33010602011771号