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 了挂的很惨。

浙公网安备 33010602011771号