2021.07.02 新高二一期暑假集训 1

挂分情况:B -70,D -90。

A. 走夜路

\(f_i\) 表示充的电能够支撑的路程为 \(i\) 的最小花费。

每到一个充电站,其实就是在一个范围内做一个这样的转移

\[f_i\leftarrow f_j+P\times (i-j) \]

这就可以转化为一个数轴上的线段覆盖问题,用一个栈来维护当前最优的连续段,贪心即可。

B. t2

数位 DP 入门题。

要注意前导 0 的情况。

C. 奇怪的集训队

我们去钦定每一个大小为 \(i\) 的集合作为所有人的交集,然后剩下的元素随意,设方案数为 \(f(i)\)。很好求,枚举大小为 \(i\) 的子集,\(\displaystyle f(i)={n\choose i}2^{2^{n-i}}\)

注意 \(f(i)\) 并不能简单的认为是至少 \(i\) 个元素相同的方案数,仔细想想会发现有很多重复情况。

然后设 \(F(i)\) 表示恰好 \(i\) 个元素相同的方案数。

考虑每个大小为 \(j~(j\ge i)\) 的集合对 \(f(i)\) 的贡献,可以得到容斥系数为 \(\displaystyle {j\choose i}\)

\[f(i)=\sum_{j\ge i}{j\choose i}F(j) \]

这个式子二项式反演就好了。

需要注意指数上应该对 \(\varphi(P)\) 取模。

D. 最短路

\(a,b\) 要求在同一条最短路径上,那么可以考虑建出最短路 DAG,统计 DAG 上 \(a\) 能够到达 \(b\) 的点对数。

并没有什么好解法,使用 std::bitset 优化暴力即可。复杂度 \(\mathcal O\left(\dfrac{nm}{w}\right)\)

手写 64 位的结果把 __builtin_popcountll 写成 __builtin_popcount 了挂的很惨。

posted @ 2021-07-02 16:44  RenaMoe  阅读(100)  评论(1)    收藏  举报