BJOI 2019
奥术神杖
给你一个长度为的串,字符集为
1234567890.
。另外给你个小串,字符集为1234567890
。每个小串有一个权值,对应为。设表示在中出现的次数。现在要求你把中所有的.
替换为一个数字。设,则要求你在替换后,最大化。不用输出答案,输出任意一个替换方案。。
摘要:对数,二分,AC 自动机上 DP,精度。
设答案为,则做一下对数可以变成,就是一个经典的 01 分数规划问题了。你把理解为是个。设,那么得到。就可以二分了。
相当于,字符串每一次出现的权值变成了,问是否存在一个替换方案使得权值和大于 0(or 小于)。这个可以对建立 AC 自动机后 DP,设表示对应 AC 自动机上的状态时的最大权值和。转移的时候记一下前驱和方案即可。
注意精度,大于 0 要写成大于 eps。
光线
有层玻璃。第层玻璃的透光率和反光率分别是。问层玻璃从上到下依次叠一起时,从上到下的透光率。
。
摘要:叠一起后,你从上往下和从下往上就是不对称的情况(如果只有一层玻璃仍然是对称的)。
设表示前 i 个玻璃叠一起时,从上往下的透光率。答案就是。特别地,。
如何转移?考虑从转移到,相当于我们这一束光先透过前层玻璃,然后透过第层。但是会有一部分光反弹回第层玻璃上去,这部分又可能弹回来。
因此我们还需要再设表示前 i 个玻璃,从下往上的反光率。这样我们就可以得到
由于,因此无穷级数可以化简封闭形式。类似地,也从转移:
时间复杂度。
勘破神机
题意:设表示用多米诺骨牌填满的矩阵的方案数,表示用多米诺骨牌填满的矩阵的方案数。给出,请分别求出:
对 998244353 取模。
。(组数据)
摘要:斯特林反演下降幂转普通幂,特征方程求通项公式,然后做等式数列求和。要对根号扩域。
A 部分
对于,可以先转化为求,然后有
根据第二类斯特林数的普通幂转下降幂,再套一个斯特林反演上去就可以反过来做:
于是得到
我们要快速算后面这部分,就得再做更多转化。容易发现且,相当于是一个斐波那契数列(其实,移了一位)。由于
设,于是我们得到
后面是个等比数列求和,可以写成封闭形式加速。
做到这里看似没有问题。但是在模 998244353 意义下不是二次剩余!但这也不难。我们对数扩域,把每个数表示成的形式即可。最后算出来的答案一定满足。因此不必担心。
B 部分
的难点在于递推式的推导。容易发现在为奇数时等于,因此我们设。我们尝试推导的递推式。
经过一番推导可以发现。然后解一下特征方程就得到了
这样就可以求答案了。注意有点小细节,就是在这里是没有移一位的,所以而不是。
时间复杂度。
排兵布阵
你有一个的非负整数矩阵,满足。你可以任意构造一个长度为的非负整数序列,使得。你的序列的权值为
求最大权值。
。
摘要:简单 DP。
发现每一列是独立的,把每一列的当作一组背包起来即可。
换一个说法,你想一个时间复杂度为的算法就随便过了。
写的时候想写一个小优化,结果边界没处理好被卡 90 了好久……
送别
题面太长。
摘要:估计是让你送别 OI 才出的这道题。
把一堵墙拆成两条并列的边。那么摸着墙走相当于在边上走。
进一步发现,整个图一定由若干个环构成。
于是我们用平衡树维护环,对于询问操作就先看他们在不在一个环上,在就查询距离,不在就输出 -1。
修改操作相当于要考虑加一个环,删一个环,把两个环连起来,把环断开。讨论即可。
时间复杂度。平均代码复杂度 7k。
删数
对于任意一个数列,如果能在有限次进行下列删数操作后将其删为空数列,则称这个数列可以删空。一次删数操作定义如下:记当前数列长度为,则删掉数列中所有等于的数。
现在有一个长度为的数列,有次修改操作:
- 单点修改;
- 所有数。
求第次修改后的,至少需要修改几个数才能删空?
。
线段树 构造
对于一个静态的序列如何求出答案?
考虑建立权值数组,表示的出现次数。那么不妨把当成一摞方块,那么我们把这个柱子向左平推推倒,这样会覆盖。对每个权值这样操作后,没有被覆盖的位置的个数就是答案。证明:从合法性和最优性两个角度。
那么对于修改操作,所有数相当于是数组的平移,记个指针就行。单点修改也很好维护。
使用线段树维护。时间复杂度。
修订记录
- 2022年8月5日 第3次修订
- 2021年2月11日 第2次修订
- 2020年4月24日 创建文章