[2024.11.06]NOIP 模拟赛
不会tarjan不会广义串并联图……
赛时
T1 看上去很可做。
看到中位数首先想到二分。在二分的背景下,问题转化为求当前最多能使多少个元素大于等于某个定值。
我们不妨先让所有的元素都选择 \(a\) 值,然后相当于要选择一段连续的 \(b\) 替换一些 \(a\),要求最后总和最大。所以可以新设一个代价数组 \(v\),并令:
然后跑一个最大连续子段和就可以了。
T2 第一眼看上去以为 \(n,m\le 10^3\) 以为不可做。然后问了旁边的人他说 \(n,m\le 15\)。
因为 \(2^{15+15}=1,073,741,824>>300,000,000\),所以我猜正解是类似状压什么的东西。旁边的人告诉我没有部分分,所以我只能去推正解了。
但是推着推着这道题变成了子序列和为定值的存在性问题,这个显然没有非指数级做法,不会了,我又问了一遍旁边的人,他说没有部分分。
大概 9:30 的时候题目终于下发部分分了,当我看见 T2 的部分分表格时,我直接红了啊,然后去把旁边的人😡🤬
忍住气,去把 T2 的 \(17+10+13+13\) 写了,写完以后我发现当精确计算复杂度的时候会 TLE 13pts。
其它部分分不会写,但此时我已经感觉这道题像是一个 dfs+剪枝 了。
自己手推了一些,比如和为定值直接返回,和大于等于定值直接返回,剩下和小于定值直接返回……
写完以后本地自己造的样例跑了 1.58s,于是我开始卡常,用变量代替数组,能不开 long long
就不开……,写到大概 10:00 感觉差不多了。
此时在比赛首页看到一个压缩包,点开以后才知道这场比赛原来是有大样例的。我测了测,然后出事了,T1 挂了。
我慌了,检查发现是自己 \(v\) 数组赋初值时逻辑嵌套有问题,改过以后就过了。
去看 T3,一开始读错题了,没看到两条路径,去写了个 Floyd 回来发现样例假了才意识到。
然后想到该条件等价于两点在一个边双内,所以去写 Tarjan 了。
写到大概 11:40 调过了小样例,但是大样例假了。
手推了推发现该思路好像不成立,正确思路应该是从一个边双向外拓展。此时感觉有点来不及写完了,T4 也不想看了,就接着去给 T2 卡常了。
赛后
T3 的思路其实没有假,赛时应该是代码问题。好在只挂了十分。
T3 旁边的人说思路不难想,但是写不动。
T2 发现赛时所有的 100pts 只有我是单向搜索+剪枝,但是时间碾压所有的双向搜索,看来还是要相信剪枝的复杂度。