[DMY]2024 CSP-S 模拟赛 Day 10
赛时
T1
对于 T1,看懂题面以后感觉很可做。
首先明确正解复杂度应该是基于 \(N\) 的线性做法。
把输入按照开始时间排序,然后依次处理。
赛时考虑到一个元素在覆盖过程中遇到其他元素时无法确定时间先后,确定后想要找到该元素的当前位置和重新覆盖有些困难,写了 1h 以后先放弃了。
舍远求近,基于时间写了一个 \(\mathcal{O}(nk)\) 的做法,发现时间很大,用 20min 对时间进行离散化,跑过了小样例。
时间还剩下 1h 的时候,看别人都过掉了 T1,便回去改。
想到了一个利用优先队列并基于时间节点的方法(其实就是正解,但是实现要复杂得多,赛后发现完整写完需要 170 多行),代码很长,用 30min 写了一个将近 200 行的代码,剩下的时间都在查错,结果到最后也没有调出来。
T2
T2 的话可以根据每个 \(b_i\) 相对于 \(a_i\) 的正负性列方程搜索求解,复杂度 \(\mathcal{O}(2^n)\)。
想了一会发现并不是太会低复杂度做法,先去看后面的题。
T4
T3 和 T4 一开始的时候都不太会暴力做法,这时候我面临去改 T1 还是继续拿暴力分的选择。
上个厕所回来会了 T4 的暴力做法,可以每次直接连边,然后做一遍 Floyd,在里面查找最值后再做一次查找满足条件的点。
T3
T3 的话我用结构体存储一个队列表示两个学校的情况,每次对于不合法的情况进行拓展,合法的累加答案。
为了在遍历的时候复杂度低于 \(n^2\) 做到 \(nlogn\) 使用了 set
,赛后发现 T 了导致爆蛋。
赛时有点急躁了,并没有细想 vector
该如何优化复杂度,使用 set
会占用大量的空间和时间。
赛后
班里的分数差距主要在于 T1。
如果当时没有去写暴力分并且 A 掉 T1 的话,我将以 110 分的成绩挤进首页。
但是 T3 暴力写挂了,T1 只拿了 50 分。
想想看来 T1 其实很简单,赛时没有考虑到按照时间排序以后其实可以直接大胆覆盖,不会出现占用状况。
正解其实很短,可以做一个多源 bfs 最短路,只需要用优先队列稍微维护一下,然后正常按照时间模拟即可。
T3 的话主要是 set
浪费了时间,赛时其实使用 vector
的话也可以做到低于 \(n^2\)。这个不难想,但是赛时没有想出来。
打的不太好,差距主要还是在 T1。