今天的题都好好啊。
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\) 的情况下最少的时间。
转移也很显然:
- \(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)\) 即可处理出答案。