核桃 10w 选手 S 模拟赛

暴力分给的很足,好评了。

笑点解析:10w 人。


【S组 第二轮】信息学竞赛10w选手模拟考

链接:link
题解:暂无

时间:4h (2025.09.15 7:45~11:45)
题目数:4
难度:

A B C D
\(\color{#FFC116} 黄\) \(\color{#52C41A} 绿\)
*1400 *1700

估分:60 + 100 + 45 + 50 = 255
得分:15 + 100 + 45 + 50 = 210
Rank:72/3922


场祭

读题。

开 A,发现先把一定可以选的加入后,对于每个未选的暴力枚举倍数就可以……哦好像不可以,因为多测 \(O(T) \times O(V \ln V)\) 会 T 飞。

不会了,这样有 60pts,扔了。

开 B,好像有点困难,开 C,好像也有点困难。

所以去写 B 暴力了。但是推特殊性质过程中发现了正解。可以注意到满足 \(b_i \subseteq s \subseteq a_i\)\(s \le n\) 的个数 \(tot\) 是可以算出来的,从高位往地位贪心即可。然后 \(c_i \gets c_i \bmod tot\) 就变成了 \(c_i \le n\) 的情况,只需要贪心地确定当前位置 \(P\) 在所有被选数的排名,就可以算出操作后的排名,然后再将排名转化回位置,就可以了。

但是比较难写,感觉有大模拟的味道了。

不过最后两次就写出来了,过大样例的时候吓我一跳来着。

2h。

开 C,不会,果断打暴力。特殊性质,发现 \(00000 \ldots 11111\) 这样的序列直接 dp \(f_{i,j}\)\(i\)\(0\)\(j\)\(1\) 的方案数就可以 \(O(n^2)\) 做;全 \(0\) 直接输出 \(1\)。其他的就不会了。

开 D,还是暴力,如果给定 \(l,r\) 可以发现是可以从右往左反悔贪心的,于是 \(n \le 2000\) 时就可以枚举每个 \(r\),再向左扩展,这样 \(O(n^2 \log n)\) 预处理,\(O(1)\) 查询。\(q\) 很小的时候就不预处理了直接 \(O(n \log n)\) 查询。

这样竟然有 50pts。

回去想 A,但是还是不会。

哦忽然注意到 D 这个做法似乎可以莫队 \(O(q \sqrt n \log n)\) 做!想了想需要回滚莫队,但是发现不会回滚,最后 10min+ 的时候才想到可以记录对优先队列的每次操作就容易回滚了,过了小样例,大样例好像是 T 了,不管了最后 10s 直接交了。


补题

草我 A 怎么差点挂没了,恭喜成为 \(4\) 题中最低分。哦把 \(V\) 打成 \(N\) 导致数组开小了,不过按理说这个只会影响前 \(4\) 个点啊,然后发现改过来也只有 25pts。看来做法是假的(?

糖丸了我以前怎么一直以为一个数的因数个数是 \(O(\sqrt n)\) 的 /jk,实际上只有均摊 \(O(\log n)\) 左右(

所以先预处理所有数的因数(枚举倍数来做),对于每个已选的枚举因数,来判断这个数是否能选,就可以了。不过预处理因数用 vector 存貌似常数会爆炸,有一个解决方法是这样的:

考虑直接存到一个大数组里面。先做一遍枚举倍数来确定每个数的因数有多少个,划分一下大数组每个区间存哪个数的倍数,再做一遍枚举倍数来存就好了。

但是不需要,因为 \(\sum n \le 10^6\),所以离线所有询问,把用到的数都记录一下,只跑这些数就好了。

WA 了,不过没关系,多筛几遍就可以了(指上面「判断这个数是否能选」),实测 \(3\) 遍就能过。


天依宝宝可爱!

posted @ 2025-09-15 14:31  little__bug  阅读(37)  评论(0)    收藏  举报