2025 NOIP模拟赛 1

2025 NOIP模拟赛 1

link

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\) 次操作后仍然可行的条件是:

\[\sum_{i=1}^y[a_i>a_x]\ge 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)\)

  1. \(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]\)
  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\) 和)

\[w\min(s_1-s_v,s_v) \]

根据重心的性质,这是容易证明可以取到的,且这显然是一个下界。

现在需要选出两个重心,显然,某条边一定是没有贡献的(在其左边的会去左边的重心,右边的去右边的重心)。

因此不妨枚举这条边 \((u,v,w)\),则其代价是:

  1. \((u',v',w')\)\(v\) 子树内:\(w'\min(s_v-s_{v'},s_{v'})\)
  2. 否则:\(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)\)

计算易于计算的全局,再将特殊部分的错误贡献去掉并加入正确贡献,乃明智的选择

posted @ 2025-04-05 16:02  spdarkle  阅读(61)  评论(2)    收藏  举报