*Teza Round 1 (Codeforces Round 1015, Div. 1 + Div. 2)

A

考虑放 \(n,1,\dots,n-1\),不会证明。

B

首先这两个东西里面必有至少一个 \(\le \min a_i\)

考虑如果是 \(\gcd < \min a_i\) 就没救了,所以只能是 \(=a_i\)

于是先找出一个 \(\min a_i\) 放到取 \(\min\) 的集合里,那么就是要判断其余的数中能否选一些数使得它们的 \(\gcd=\min a_i\)

考虑 \(\min a_i\) 的倍数,全部除以 \(\min a_i\) 后就是判断能否选数使得 \(\gcd=1\)。显然选全部时合法是充要条件。

C

简单构造题。

挂了一发:以后处理 \(i\rightarrow p_i\) 这样的东西时,如果是从前往后一个个扫,那么要 while 而不是 if。

D

考虑 \(m=1\),发现前后两部分均匀放答案肯定最大。

于是考虑分成 \(x\) 段,每段都是 \(0,\dots x-1\),最后随便放一点。

那么只要 \(\frac{n}{x}>m\),答案就可以取 \(x\)

直接找到最大的合法的 \(x\) 即可。

E

\(-1\) 个数前缀和为 \(sum\)

考虑拆贡献,对于每一个数 \(x\) 计算有多少种排列和区间的组合方案使得这个区间的 mex 为 \(x\)

首先 \(<x\) 且存在的数是必选的,容易求出它们构成的极大区间。

\(<x\) 且不存在的数的个数为 \(h_x\)

设包含这个极大区间且有 \(i\)\(-1\) 的区间个数为 \(f_i\),那么答案就是 \(\sum_i i!(sum_n-i)!\binom{sum_n-h_x}{i-h_x}f_i\)(还要减去包含 \(x\) 在内的方案数,先不管)。

那么 \(f\) 就是前缀和后缀做卷积的结果了。直接做肯定是不行的,所以考虑从大到小扫 \(x\),每次区间会往里面缩(直到缩到没有,先不管)。那么每次缩一个位置后可以 \(O(n)\) 更新卷积结果,所以是对的。

接下来要减去 \(x\) 在内的方案数。如果 \(x\) 没有出现的话就减去 \(h_x\leftarrow h_x+1\) 的结果即可。否则要减去这一轮缩之前的卷积结果(下标平移这一轮缩的 \(-1\) 个数)再算。

接下来考虑没有区间的情况,那么 \(<x\) 的数都不存在。不考虑减去包含 \(x\) 在内的方案数的话就直接预处理即可。

考虑减去包含 \(x\) 在内的方案数,因为 \(x\) 没有出现时是好算的,而只会有最大的一个 \(x\) 出现,所以暴力即可。

时间复杂度 \(O(n^2)\)

赛时 AC 记录,注释特别乱,有些注释还是假的

F(补)

需要注意到 \(b\) 合法当且仅当 \(a\) 中顺序对在 \(b\) 中也是顺序对。

那么每个未确定的数 \(i\) 会被已确定的数限制在区间 \([l_i,r_i]\) 中,这个区间可以用线段树简单求出。

若不考虑未确定数之间的限制则直接贪心,从前往后填 \(l\le i\)\(r\) 最小的数即可。

注意到 \(l_x\le l_y\)\(r_x\le r_y\),那么这样填一定是对的。

posted @ 2025-04-05 22:31  ax_by_c  阅读(220)  评论(0)    收藏  举报