Loading

Codeforces Round 723 Div.2

赛时通过 \(\text{A,B,C1,C2}\),排名 \(1100\)

A

略。

B

首先可以发现 \(1111,11111,\dots\) 是没用的,因为它们都可以用 \(11,111\) 表示出来。然后我们考虑一个数 \(x\) 是否能够表示成 \(11a+111b=x(a,b\ge 0)\)

有一个结论是假如 \(x,y\ge 0\land x\perp y\),那么所有大于 \(xy-x-y\) 的数都一定能被表示成 \(ax+by(a,b\ge 0)\) 的形式。

于是对于 \(>1099\) 的数输出 yes,小于等于 \(1099\) 的数暴力判断即可。

C

可反悔贪心,略。

D

找一下规律可以发现相同的字母放在相邻的位置最优。于是枚举 \(4!=24\) 种排列,转化成逆序对即可。

E

好妙的题。

用大写字母表示字符串,用小写字母表示字符。

考虑在后缀数组中相邻的两个字符串 \(xY\)\(aB\)。如果有 \(B<Y\) 那么一定有 \(x<a\)。否则只需要 \(x\le a\) 即可。

考虑表示一下这个东西:设 \(rk_x\) 为后缀 \(s_{x\dots n}\) 在后缀数组中的位置(位置从 \(1\) 开始),\(sa_x\) 为后缀数组。如果 \(rk_{sa_x+1}>rk_{sa_{x+1}+1}\) 则一定有 \(s_{sa_{x+1}}>s_{sa_x}\)

重排列 \(s\)\(s'\) 使得 \(s'_i=s_{sa_i}\)。于是问题转化成了:求有多少个 \(s'\) 满足 \(\forall i\in [1,n],1\le s'_i\le k\),且对于某些特定的位置有 \(s'_i>s'_{i-1}\),对于其他位置有 \(s'_i\ge s'_{i-1}\)

大胆猜测那些特定的位置对答案没有影响,对答案有影响的只是它们的个数。记它们的个数是 \(c\)

于是答案就是 \(\sum\limits_{x=1}^k \dbinom{x}{c}\dbinom{k-x+n-c}{n-c}\)

推式子咕了,反正时间复杂度能做到 \(O(n)\)

posted @ 2021-06-01 22:43  Alan_Zhao_2007  阅读(65)  评论(0编辑  收藏  举报