首页 > 其他分享 >#20230924

#20230924

时间:2023-09-24 21:12:21浏览次数:36  
标签:20230924 10 frac times popcount 区间

20230924 NOIP#14总结

时间安排

8:10~8:35

看题,\(B,D\) 看完没一点想法先放放。

8:35~9:20

写 \(A\) 的前两档和 \(C\) 的第一档。

9:20~9:40

瞪出来了 \(A\) 的正解写了。 (但是因为没判 \(-1\) 导致 \(100\Rightarrow 30\)

9:40~10:00

写 \(B\) 的第一档。

10:00~11:55

觉得 \(B,C,D\) 里 \(D\) 最可做,想了半天终于会写了。

11:55~12:05

检查文件并抱怨为什么还不来收题我要吃饭。

总结反思

  • 细心做题少犯小毛病

题解

A.最短路

做 \(n\) 遍 \(dijkstra\) 求全源最短路,对于 \(\forall i\in [1,n]\) 若 \(dis_{i,j}\leq t\) 则连一条 \(i\) 到 \(j\) 边权为 \(c\) 的边。再最后跑一遍 \(dijkstra\) 求出答案。

B.套路题

转换成一共有一个 \(n\) 行 \(m\) 列的矩阵满足:每一列最多有一个 \(1\);对于第 \(i\) 行 \([1,l_i],[r_i,n]\) 列中各有恰好一个 \(1\)。
设 \(f_{i,j,k}\) 表示考虑了前 \(i\) 列了,前 \(i\) 列中有 \(j\) 个右区间还没有被满足,还有 \(k\) 列没有选 \(1\) 的方案数。
转移时考虑这一列是否用来匹配一个右区间,以及之前的 \(k\) 列跟当前以 \(l_i\) 结尾的左区间匹配,这两步是同时进行的。
而发现 \(k\) 可以通过 \(i,j\) 计算出来,可以优化一维复杂度。

C.位运算#

考虑 \(x\ xor\ y\) 的性质,若 \(popcount(x)\% 2==popcount(y)\% 2\) 则 \(popcount(x\ xor\ y)\% 2==0\) ,反之亦然。那么直接用线段树维护区间并集中 \(1\) 的个数为奇数和偶数的数的个数即可。
\([1,n]\) 中二进制下有奇数个 \(1\) 的数字个数为 \(x/2+(x\% 2||popcount(x)\% 2)\) #

D.点分治+"组合计数"

设一个人占据了 \(k\) 个点,则对于一个点对,被占据的概率是 \(\frac{C_{n-2}^{k-2}}{C_n^k}=\frac{k\times (k-1)}{n\times (n-1)}\) ,设点对共有 \(s\) 个(这个可以用点分治求),则答案为 \(ans=s\times \frac{k\times (k-1)}{n\times (n-1)}\)

标签:20230924,10,frac,times,popcount,区间
From: https://www.cnblogs.com/programmingysx/p/17726298.html

相关文章