总结:CSP2024-S模拟赛
A. 人事调动
长得非常像一道模拟,但是由于set会去重,map开的大小会达到 $N^2$ ,所以,我们可以使用multiset(其增删改查时间复杂度近似:O(log N),即总时间复杂度为O(N log N))。
1 |
|
B. 失意
比较一眼的贪心,以区间左端点从小到大排序,用优先队列从小到大维护右端点,每次队列里有m个元素,就比较一次大小,超过m就把右端点最小的弹出去。每次比较记录此时的最大L和最小R(答案即R-L),最后再循环一边找到符合的m个区间。
注意:要特判答案为0的时候,任意输出m个区间即可
1 |
|
C. 位于LIS概率
又是C>>>>>>D,扣C结果在还有3分钟结束的时候想到了正解,错失D大好90pts
70pts的做法就是没有线段树/树状数组优化的正解:求出整个数列的LIS长度mx;对于每个 $i∈{1…n}$ 求出以i结尾与以i开头的LIS长度 $x1$, $x2$ 和数量 $t1$, $t2$ ,如果其 $x1+x2-1=mx$,说明这是一种LIS,i在LIS中的情况数+= $t1\times t2$,最后用快速幂求逆元即可。
用树状数组维护比较短(改成线段树只要改架构就行了)。
1 |
|
D. 排队
暴力有90早知道不扣C了
补题之后感觉不是很复杂,不知道做法有没有假掉。
首先由题目我们明确了一些排序规则:
- 子节点在父节点前面
- 编号小的的子节点在编号大的子节点前面
因此,我们可以用dfs给每一个节点排序,并用优先队列维护空房间顺序。
对于操作1(来人):弹出x次优先级最高房间,输出最后一个编号
对于操作2(走人):我们发现对于被移动的人x,他只会影响他的祖先,倍增,直到到空房间,输出其上跳步数即可。
1 |
|
END…
总结:CSP2024-S模拟赛
install_url
to use ShareThis. Please set it in _config.yml
.