2021-11-15 NOIP模拟赛 6

今天的题都好好啊。

A. 【2020.12.2 NOIP模拟赛 T1】最小得分和(mark)

观察到 \(1 \leq k \leq 5 \times 10^{11}\),这就算把数对们一对一对的找出来然后\(ans++\) 都会 T 啊=-=

我们考虑二分,二分所选数对中差的绝对值最大是多少。

假设当前二分值为 \(mid\),我们把差的绝对值小于等于 \(mid\) 的数对数量统计出来,与 \(k\) 比较并继续二分。

如何统计数对数量呢?

可以排序应该不难看出吧,然后单调队列跑一遍就完了。

有了思路就很好写了吧,算出数对最大差值之后再跑一遍单调队列计算答案。

emm……用 \(sum\) 记录当前队列中元素的和,\(cnt\) 为队列中元素个数,然后进来一个 \(a_i\)\(ans += a_i * cnt- sum\)

B. 【2020.12.2 NOIP模拟赛 T2】礼物(gift)

开题之后什么 dfs,bfs 一大堆都写了一遍,结果发现都不行……

观察到 \(C \leq 16\),明显的状压,套路的状态 \(dp_{s, i}\) 表示选择状态为 \(s\) 的礼物,且最后一个礼物选 \(i\) 的情况下最少的时间。

转移也很显然:

\[dp_{s, i} = min\{ dp_{s \land |i|, j} + dist(g_j, g_i) \times count(s)\} \]

  • \(dist(g_j, g_i)\):礼物 \(j\) 到 礼物 \(i\) 的距离。
  • \(count(s)\):状态 \(s\) 中 1 的个数。

可以先对于每个礼物 bfs 一遍,预处理出来 \(dist()\)

转移的过程:先从 \(King\) 出发,计算到每一个礼物的 \(dp\) 值,然后统计答案时,从每一个礼物到 \(Queen\) 判断是否合法。

注意:每走一格花费的时间是已选的礼物数 \(x + 1\),千万不要忘了 +1 啊啊啊啊啊啊,不然 100pts -> 55pts

C. 【2020.12.2 NOIP模拟赛 T3】动物游戏(game)

考场上看完之后直接弃了……

对于一个点 \(x\),它的任意祖先为 \(k\),如果有 \(y\),使得 \(k\) 是点 \(x\)\(y\) 的公共祖先,那 \(x\) 能拿到 \(k\) 上的坚果的概率为:

  • \(dep_y < dep_x\) ,那么如果 \(y\) 要上场,\(x\) 就拿不到,所以 \(P = (1 - a_i)\)
  • \(dep_x \geq dep_y\)\(x\) 一定能拿到坚果。

所以点 \(k\) 上的坚果能被拿到的概率就是比 \(x\) 点深度小的点且 和 \(x\) 拥有相同祖先 \(k\) 的所有点 \(y\) 的出场概率的乘积,然后对于每个 \(k\) 求个和就是答案。

要按深度从小到达依次处理。

那么 树剖 + 线段树 维护一下区间和区间乘即可。

注意:每次都要先计算出当前层答案再更新。

D. 【2020.12.2 NOIP模拟赛 T4】药香(medicine)

树上有依赖背包的板子,然鹅考场时没时间写了,\(O(n^3)\) 暴力能拿 75pts。

就是 dfs 序优化一下,就变成了普通的 01 背包,\(O(n^2)\) 即可处理出答案。

posted @ 2021-11-15 18:30  xixike  阅读(23)  评论(0编辑  收藏  举报