suxxsfe

一言(ヒトコト)

333

1

所有有星星的格子,要么消失,要么移动到 \((i+b,j+a)\) 的位置。

我们从上到小,从左到右决定每个地方有没有星星。
如果输入的位置 \((i,j)\) 为空,那么原来这个地方肯定没有星星。

如果这个地方为灰色,那么判断 \((i-b,j-a)\) 位置有没有星星(这个位置肯定已经被决策过了),如果有,那么这个位置 \((i,j)\) 可以没有星星(因为要求星星总数最少),如果没有,或者根本没有这个位置,那么位置 \((i,j)\) 就需要有星星。

如果输入的位置 \((i,j)\) 为黑色,那么如果 \((i-b,j-a)\) 不存在,或者这个位置肯定没有星星,那么输入不合法。否则,\((i,j)\)\((i-b,j-a)\) 都需要有星星。

2

考虑要求 abb 式的不同子序列个数。

那么显然对于每个数 \(x\),只需要考虑第一次出现的时候,让它作为 abb 中的 a。
我们从后往前扫,记录有多少种数字已经出现了两次(就是作为 abb 中的 b),可以用桶来实现。
那么每当遇到满足上述条件的 \(x\) 时,将这个数字的种数累加即可。

3

该题要求反转一个区间后,\(a,b\) 数组有 \(i\) 个位置相同的方案数。

考虑枚举反转的区间的中心,该中心可能是某个位置(区间长度为奇数),也可能是某两个位置的中间(区间长度为偶数)。

两种情况类似,我们这里讨论长度为奇数的情况。
从这个中心往两边扫,设当前区间的左右边界是 \(i-k\)\(i+k\),我们只需要比较这两个位置上 \(a,b\) 数组的相等情况,即可维护出 \(cnt\) 表示区间 \([i-k,i+k]\) 反转后,这段区间中 \(a,b\) 有多少个相等的位置。
只需要再提前计算 \(a,b\) 的每个前缀、后缀有多少个相等的位置,就可以得出反转这段区间后,两个数组整体有多少个相等的位置。
累计到桶中,最后输出答案即可。
时间复杂度 \(O(n^2)\),空间复杂度 \(O(n)\)

posted @ 2025-01-25 03:57  suxxsfe  阅读(50)  评论(0)    收藏  举报