20231013

发布时间 2023-10-13 19:12:10作者: programmingysx

20231013 NOIP#19(33daiOJ)总结

时间安排

7:25~8:00

看题,\(A\) 一点不会,\(B\)\(15\) 分,\(C,D\) 各会一档。

7:50~8:00

\(D\) 的第一档。

8:00~8:10

\(B\) 的前两档。

8:10~8:40

\(C\) 的第一档。

8:40~9:00

想到写了 \(B\)\(n^2\)

9:00~10:25

会了 \(A\) 题,但是因为 \(upper_bound\) 学艺不精没过大样例,调了半天改了线段树二分。

10:25~11:00

\(C\) 题尝试拼包。

11:00~11:50

都写完了,试图切 \(B\) 失败。

总结反思

  • 考试捡有把握的写

题解

A.数据结构

找第一小于 \(x\) 的位置和区间询问最大值,数据结构随便搞。

B.贪心+数据结构

合并一定是 \(n\) 此操作,只考虑交换要多少次。
如果一个线段(被)包含于另一个线段,那么显然这两个线段不会产生交换次数,所以即求在一个区间内有多少线段只出现了一个端点。
那么可以将其按左端点排序,询问区间内有多少线段的右端点,数据结构维护即可。

C.构造

\(h=2\) 时问题很好解决,手推一点就会了。
如果 \(h>2\)\(w=2\) 那么可以翻转坐标,变成 \(h=2\) 的情况解决。
如果 \(h>2\)\(w>2\) 判断目标点是否在 \(S := \lbrace (1, 1), (2, 1) (3, 1), \ldots, (h, 1), (h, 2) \rbrace\) 集合内。如果在则翻转坐标变成不在的情况,如果不在则将 \(S\) 集合覆盖并垂直翻转。

D.计数DP

\(f[i][j][k]\) 表示走到第 \(i\) 步,已经扩展了 \(j\) 种点,包含 \(1\) 号点的最大的强连通子图的点数为 \(k\) 时的方案数。
起点都在上次移动的终点处,当移动时,终点就有三种情况:
\(1.\) 终点属于未拓展的点 \(f[i+1][j+1][k]+=f[i][j][k]\times (n-j)\)
\(2.\) 终点在不包含 \(1\) 的强连通里 \(f[i+1][j][k]+=f[i][j][k]\times (j-k)\)
\(3.\) 终点在包含 \(1\) 的强连通里 \(f[i+1][j][j]+=f[i][j][k]\times k\)
初始 \(f[0][1][1]=1\) ,答案为 \(f[m][n][n]\)