核桃 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\) 遍就能过。
天依宝宝可爱!

浙公网安备 33010602011771号