Codeforces Round 521Codeforces #295(div. 1)

Posted denverjin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round 521Codeforces #295(div. 1)相关的知识,希望对你有一定的参考价值。

521A DNA Alignment

题意:给一个字符串\(s\),求有多少个\(t\)使得\(\rho(s,t)\)最大。

其中,\(t\)是一个和\(s\)等长的串,

\(\rho(s,t)=\max_{i=0}^{n-1}\max_{j=0}^{n-1}h(shift(s,i),shift(t,i))\)

\(h(s,t)=\sum_{i=0}^ns_i\ne t_i\)

\(shift(s,i)=s_{i+1\dots n}+s_{1\dots i}\)

思路:首先我们看最大的答案是多少。

如果我们把\(t\)全放上最大出现次数的字符,那么每一次\(shift\)都会有这么多个该字符记录进去。就是(这个字符出现次数)\(\times n^2\)

那么这个次数肯定是最大的。因为其他情况中不太可能每一回都有相同的数。

那么我们的答案就是(最大出现次数的字符个数)\(^n\)

因为我们如果\(t\)中每一位都是某个出现次数最大的字符,那么我们每一次\(shift\)都有\(n\)次跑到这个字符的出现位置上。

我第一开始看错题了,以为只是要求最大的那个\(\rho\)的值。

521B Cubes

题意:给一堆点,现在某个点肯定是被下方离他距离最近的三个点之一“托”着。

然后现在要不断地去取走某个点,然后使得去掉这个点后的还满足每个点被某个点“托”着。

两个人依次取,第一个人要求最后的序列字典序最大,第二个人要求最小。

问最后取出来的序列是怎么样的,用\(n\)进制表示。

思路:首先就是建图。

我们把一个点托着的点们连到他,作为图\(g\);把这个点练到所有托着他的点,作为图\(rg\)

那么我们就可以进行类似“拓扑排序”的东西。

就是说我们每次找到最大/最小编号的不会改变原图状态的点,把他删掉,进行对其托着的点以及托着他的点的改变。

那么我们就要看如果我们把一个点干掉之后会对他上下两层有什么影响。

首先看对上层的影响。

因为这个点现在突然消失,那么我们就知道上面的点会失去一个支撑,就会使与当前点同级的点不能随便删去。

这样的话我们就是从当前点沿着rg走一步,再沿着g走一步,走到的这些点判断一下是否可以删掉。

对于下层,由于他们可以少托一个点,说不定可能就被允许删除了。所以我们从这个点沿着g走一步,这些点判断以下是否可以删掉。

那么取出最大/最小的可删除的点就是通过一个set来处理。

用C++11的特性更好写。。。

521C Pluses everywhere

题意:给一个数字串,问将其间加入\(k\)+之后最后所有的和的和。

思路:肯定是不能把每一个和都求出来的。。。所以我们只看一个位置上的数对总数作的贡献

那么我们就是说要找到这个位置上的数在每一位(个十百千万)上出现的次数。

即对于\(i\)位而言,\(\sum_{l=0}^{n-2-i}10^lC_{n-2-l}^{k-1}d_i+10^{n-1-i}C_{i}^{k}d_i\)

其中第二段的意思是这个加数一直到最后,没有最终的加号。

这样是肯定\(tle\)的,那么前半段就转化成以\(l\)的循环:

\(\sum_{l=0}^{n-1-k}10^lC_{n-2-l}^{k-1}\sum_{i=0}^{n-2-l}d_i\)

这样只是求一个前缀和、10的幂、阶乘(及其逆元)即可。

以上是关于Codeforces Round 521Codeforces #295(div. 1)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #521 (Div. 3)

Codeforces Round #521 Div. 3 玩耍记

CodeForces Round #521 (Div.3) E. Thematic Contests

CodeForces Round #521 (Div.3) C. Good Array

Codeforces Round #521 (Div. 3)

Codeforces Round #521 (Div. 3) D. Cutting Out 二分+排序