奥术神杖

给你一个长度为的串,字符集为1234567890.。另外给你个小串,字符集为1234567890。每个小串有一个权值,对应为。设表示中出现的次数。现在要求你把所有.替换为一个数字。设,则要求你在替换后,最大化。不用输出答案,输出任意一个替换方案。

摘要:对数,二分,AC 自动机上 DP,精度。

设答案为,则做一下对数可以变成,就是一个经典的 01 分数规划问题了。你把理解为是。设,那么得到。就可以二分了。

相当于,字符串每一次出现的权值变成了,问是否存在一个替换方案使得权值和大于 0(or 小于)。这个可以对建立 AC 自动机后 DP,设表示对应 AC 自动机上的状态时的最大权值和。转移的时候记一下前驱和方案即可。

注意精度,大于 0 要写成大于 eps。

代码

光线

层玻璃。第层玻璃的透光率和反光率分别是。问层玻璃从上到下依次叠一起时,从上到下的透光率。

摘要:叠一起后,你从上往下和从下往上就是不对称的情况(如果只有一层玻璃仍然是对称的)。

表示前 i 个玻璃叠一起时,从上往下的透光率。答案就是。特别地,

如何转移?考虑从转移到,相当于我们这一束光先透过前层玻璃,然后透过第层。但是会有一部分光反弹回第层玻璃上去,这部分又可能弹回来。

因此我们还需要再设表示前 i 个玻璃,从下往上的反光率。这样我们就可以得到

由于,因此无穷级数可以化简封闭形式。类似地,也从转移:

时间复杂度

代码

勘破神机

题意:设表示用多米诺骨牌填满的矩阵的方案数,表示用多米诺骨牌填满的矩阵的方案数。给出,请分别求出

对 998244353 取模。

。(组数据)

摘要:斯特林反演下降幂转普通幂,特征方程求通项公式,然后做等式数列求和。要对根号扩域。

A 部分

对于,可以先转化为求,然后有

根据第二类斯特林数的普通幂转下降幂,再套一个斯特林反演上去就可以反过来做:

于是得到

我们要快速算后面这部分,就得再做更多转化。容易发现,相当于是一个斐波那契数列(其实,移了一位)。由于

,于是我们得到

后面是个等比数列求和,可以写成封闭形式加速。

做到这里看似没有问题。但是在模 998244353 意义下不是二次剩余!但这也不难。我们对数扩域,把每个数表示成的形式即可。最后算出来的答案一定满足。因此不必担心。

B 部分

的难点在于递推式的推导。容易发现为奇数时等于,因此我们设。我们尝试推导的递推式。

经过一番推导可以发现。然后解一下特征方程就得到了

这样就可以求答案了。注意有点小细节,就是在这里是没有移一位的,所以而不是

时间复杂度

代码

排兵布阵

你有一个的非负整数矩阵,满足。你可以任意构造一个长度为的非负整数序列,使得。你的序列的权值为

求最大权值。

摘要:简单 DP。

发现每一列是独立的,把每一列的当作一组背包起来即可。

换一个说法,你想一个时间复杂度为的算法就随便过了。

写的时候想写一个小优化,结果边界没处理好被卡 90 了好久……

代码

送别

题面太长

摘要:估计是让你送别 OI 才出的这道题。

把一堵墙拆成两条并列的边。那么摸着墙走相当于在边上走。

进一步发现,整个图一定由若干个环构成。

于是我们用平衡树维护环,对于询问操作就先看他们在不在一个环上,在就查询距离,不在就输出 -1。

修改操作相当于要考虑加一个环,删一个环,把两个环连起来,把环断开。讨论即可。

时间复杂度。平均代码复杂度 7k。

代码

删数

对于任意一个数列,如果能在有限次进行下列删数操作后将其删为空数列,则称这个数列可以删空。一次删数操作定义如下:记当前数列长度为,则删掉数列中所有等于的数。

现在有一个长度为的数列,有次修改操作:

  • 单点修改;
  • 所有数

求第次修改后的,至少需要修改几个数才能删空?

线段树 构造

对于一个静态的序列如何求出答案?

考虑建立权值数组,表示的出现次数。那么不妨把当成一摞方块,那么我们把这个柱子向左平推推倒,这样会覆盖。对每个权值这样操作后,没有被覆盖的位置的个数就是答案。证明:从合法性和最优性两个角度。

那么对于修改操作,所有数相当于是数组的平移,记个指针就行。单点修改也很好维护。

使用线段树维护。时间复杂度