传送门 - Educational Codeforces Round 85 (Rated for Div. 2)
题目难度尚可,手速快点大概可以阿克?(虽然不会做 G
总结:做简单题的时候心态要平稳,手速要快,不要犹豫。(做后面几题的时候才提起兴趣是不好的
A
模拟,吃了三发罚时,吐力。
B
注意到可选的是一个集合而不是一个区间。如果要凑出 (i) 个合法的数,最好的方法就是用前 (i) 大的数凑。因此排序后扫一遍即可。时间复杂度 (O(nlog n)) 。
C
显然是选定一个怪,将这个怪打死,然后引发爆炸,收割残血。
枚举第一个被打死的怪是哪个即可,时间复杂度 (O(n)) 。
D
手玩一发:
- 从 (1) 出发,走完 (2) 至 (n-1) 后走向 (n),这里的序列是
121314...1n
。这个时候与 (1) 相关的边基本走完了,最后剩下一条 (n ightarrow 1) 的边显然是最后走的。 - 接着 (n ightarrow 2) ,然后现在有 (n-1) 个点,仍然在最小点上开始走,这是原问题的一个子问题。按从小到大的顺序走完 (2) 相关的边后,走向 (n) ,然后 (n ightarrow 3) ,变成了更小的原问题的子问题。
最优的策略就浮出水面了,最终的答案一定是 1213..1n 2324..2n 3435..3n ..n1
这样的。
然后就枚举每一段直接算即可。
E
对于 (v|u) 的情况,最优解一定是从 (u) 一直向下走到 (v) 。对于 (v ot| u) 的情况,最优解一定是先到 (gcd(u,v)) 再到 (v) ,其实和第一种是等价的。
那么最短路是怎么形成的呢?
考虑用 ((a_1,a_2,cdots,a_n)) 表示 (p_1,p_2,cdots,p_n) 的次数,走一步的意义就是将 (a_i) 减去一。假设当前一步改变了 (a_i) ,下一步改变了 (a_j) ,考虑这两步的贡献以及交换后的贡献:
发现交换两步,距离仍然是不变的。因此 ((a_1,a_2,cdots,a_n)) 走向 ((0,0,cdots,0)) 的最短路径数其实就是:
然后就做完了。时间复杂度 (O(sqrt{D}+d(D)q)) ?
F
容易想到用 (dp_i) 表示以 (i) 这个位置结尾的最小答案,如果 (a_i otin {b_1,b_2,cdots,b_m}) 的话不做定义。
发现 (dp_i) 的转移其实就是找 (b) 序列中 (a_i) 的上一个数出现的位置。不妨以 (a_i) 为下标开桶维护贡献。定义 (sum_j) 表示 (minlimits_{kleq i,a_k=j}dp_k+calc(k+1,i)) ,然后转移显然就有:(dp_i=sum_{las(a_i)}) ,其中 (las(i)) 表示数字 (i) 在 (b) 序列中的上一个数的值。
现在更新了位置 (i),考虑如何维护 (sum) :
- 对于 (b_k<a_i) :那么必须选,(sum_k=sum_k+p_i) 。
- 对于 (b_kgeq a_i) :可选可不选,(sum_k=max(sum_k,sum_k+p_i)) 。
- 对于 (b_k=a_i) :考虑上述情况后,还需要对 (dp_i) 取 (min) 。
用线段树简单维护就好。时间复杂度 (O(nlog n)) 。
G
卷积匹配,学到了。
考虑 (s_i) 和 (t_j) 匹配的条件是 ((s_i-t_j)(p_{s_i}-t_j)=0) ,如果要整个串都匹配的话注意要平方一下再加起来,不然容易出问题,即 (sum(s_i-t_j)^2(p_{s_i}-t_j)^2=0) 意味着匹配成功。
将 (s) 翻转后可以发现这是个卷积,然后卷一下就没了。
不过有许多细节。
首先,(sum (s_i-t_j)^2(p_{s_i}-t_j)^2) 可能大于模数,然后这样就变成了一个相当危险的单模哈希。处理方法有二:
- 拿两个模数各跑一遍,相当于双模哈希。
- 给每个字符赋上一个随机值。
第二种显然好写一些,然后就写了第二种(
然后,如果是用 ((s_i-t_j)^2(p_{s_i}-t_j)^2) 来卷的话,拆开是九个式子,两个可以前缀和处理,剩下的只能 ( m{NTT}) ,这样就要做 (7) 次 ( m{NTT}) ,本地极限数据要跑 (1.4s) 。
不知道怎么搞,然后就学 EA 的做法信仰一波卷 ((s_i-t_j)(p_{s_i}-t_j)),随机种子瞎打了一个交上去过了(/qiang(不过后面连着调了好几个种子都过不去 /dk