很难发现其实删除不会改变元素位置的奇偶性,所以只需要把奇数位置的 A 和 B 互换就行了。
那么现在就是 AA 和 BB 不能删除,所以只需要 A 和 B 的数量都不超过 ⌊2n⌋ 就行了。
正难则反,得到:
Ans=3n−2×i=⌊2n⌋+1∑n(in)×2n−i
显然,所有的方案数是 3n 因为每一个位置都有 2 种方案。
然后枚举 A 或者 B 的数量,从 ⌊2n⌋+1 开始枚举所以方案一定是无法消去的。
选择 i 个位置填 A 或者 B,其它的位置乱填就行了。
需要注意,并不需要考虑重复的情况,因为数量大于 ⌊2n⌋+1 的元素肯定只有一种。
通过合理的实现,可以做到 O(n)。
这么好的 2500 的题目为什么不评紫。
考虑枚举排列 P 的得分 i,但是想要快速计算比比较困难。
所以考虑设 fi 表示操作了前 i 个之后全部染黑的方案数,需要注意并不是恰好 i 次。
对于一个第 i 次操作之后就全部被染黑的方案 P,从 [1,i] 的顺序是不重要的,影响答案的只有在 i 之前选择了哪些。
那么我们将 P1 到 Pi 从小到大排序排序,容易理解 P1=1,Pi=n−1。
在满足上面要求的同时,还需要满足 ∀k∈[1,i−1]∩Z 都有 pk+1−pk≤2。
我们记 xk=pk+1−pk−1,那么显然所有 xk∈{0,1}。
而他们之间有满足等式:
k=1∑i−1xk=(k=1∑i−1pi+1−pi)−(i−1)
同时:
k=1∑i−1pi+1−pi=pi−p1=n−2
所以就有:
xk∈{0,1}∧k=1∑i−1xk=n−i−1
那么显然 x 的方案数就是 (n−i−1i−1),再乘上排列 P 带来的贡献,得到:
fi=(n−i−1i−1)×i!×(n−i−1)!
所以得分为 i 的数量就是 fi−fi−1,那么就有:
Ans=i=⌈2n⌉∑n−1i×(fi−fi−1)
时间复杂度为 O(n)。
设 fi 表示强制选第 i 条边的最小生成树的权值,设 gi=j=1∑n[fj=i]。
如果不存在 i≤X 存在 gi=0,那么显然是没有解的,因为进行的操作只能增大生成树的值。
如果 gX=0 且 ∀i<X 都有 gi=0,那么显然这个图的最小生成树就是答案需要的,那么只要这 gX 条边存在一个颜色不一样就可以了,所以方案数为:
(2gX−2)×2m−gX
如果存在 i<X 且 gi=0,那么:
- 如果 fi<X,显然需要全部染成一个颜色。
- 如果 fi>X,因为反正都不会影响答案所以可以随便填。
- 如果 fi=X,那么只需要不是全部都与 fi<X 的颜色一样就行了。
设上面的情况分别有 a,b,c 条边满足,那么方案数就是 2×2b×(2c−1)。
时间复杂度为 O(m2logn),但是并查集的 log 能叫 log 吗?
设 x<2i,那么由题可以得到:
f(x)+f(2i)=f(0)+f(2i+x)
进而可以得到:
f(2i+x)=f(x)+f(2i)−f(0)
设 y=2i+x,那么有:
f(y)=f(y−2i)+f(2i)−f(0)
容易发现 y 的最高位是第 i 位的时候满足上式。
那么容易理解,只需要 f(0) 和所有的 f(2x) 确定下来,那么 f 就整个确定了。
设 g(i)=f(2i)−f(0),那么:
f(x)=f(0)+2i&x=0∑g(i)
假设 g 已经确定,考虑合法的 f(0) 的数量。
假设 s1=i=0∑n−1max(g(i),0),s2=i=0∑n−1min(g(i),0)。
因为 0≤f(x)≤k,所以必然有:
{f(0)+s1≤kf(0)+s2≥0
所以解的个数为 k−s1+s2+1。
然而因为 s1−s2=i=0∑n−1∣g(i)∣,所以方案数为:
k+1−i=0∑n−1∣g(i)∣
设 x=i=0∑n−1∣g(i)∣,s(x) 表示 x=i=0∑n−1∣g(i)∣ 时 g 的方案数。
那么有:
s(x)=[x=0]+i=1∑n2i×(i−1x−1)×(in)
枚举 0 的个数,符号可以乱填,最后把 x 的和分配到 i 个数上要求非空。
所以答案就是:
x=0∑k(k+1−x)×s(x)
化简:
x=0∑ks(x)=1+i=1∑n2i×(in)(j=i−1∑k−1(i−1j−1))
后面似乎是 朱世杰恒等式 ,所以得到:
1+i=1∑n2i×(in)×(ik)
另外一个式子:
x=0∑kx×s(x)=x=0∑ki=1∑n2i×(in)×(ix)×i
那么同样的可以得到:
i=1∑n2i×(in)×i×(i+1k+1)
所以:
Ans=(k+1)×(1+i=1∑n2i×(in)×(ik))−i=1∑n2i×(in)×i×(i+1k+1)
时间复杂度为 O(nlogn)。
让我很有启发的数据结构题。
考虑 DP,设 fi,j 表示填了前 i 个位置第 i 个位置为 j 的方案数,那么显然有暴力的转移方程:
fi,j=−fi−1,j+k=1∑Ai−1fi−1,k
那么考虑滚动数组,那么转移方式如下:
首先 fj←−fj,记 S=∑fj 然后把 fj←fj+S,最后把大于 Ai 的 f 清理掉。
那么对于这个操作,容易想到可以使用线段树进行维护,时间复杂度为 O(V+nlogV) 而空间复杂度是 O(V) 的无法接受。
对于整数 x,y 不存在 i 使得 x≤Ai≤y,那么显然最后 fx 和 fy 的答案是一样的,那么我们考虑把这些一样的给塞到一起。
令 Find(Ai) 为比 Ai 大的最小的元素,那么考虑对以上的操作有什么影响:
显然把所有的数全部取反和计算所有 f 的和 S 是没有影响的,唯一影响的就是区间加 S 操作。
对于区间加操作,原本的加 S 就应该改成 (Find(Ai)−i)×S。
考虑怎么初始化,显然应该有 fi=Find(Ai)−i,时间复杂度为 O(nlogn)。
完全没有见过的一种 DP 设法,设 fi,j,k 表示当前考虑到了第 i 个位置,最靠近第 i 个位置的颜色不一样的位置是 j,与 ai 和 aj 都不一样的最靠后的元素为位置为 k 的方案数。
先不考虑限制,容易理解转移分别就是枚举三种情况:
- 选择与 ai 一样的颜色,那么有 fi+1,j,k←fi+1,j,k+fi,j,k。
- 选择与 aj 一样的颜色,那么有 fi+1,i,k←fi+1,i,k+fi,j,k。
- 选择与 ak 一样的颜色,那么有 fi+1,i,j←fi+1,i,j+fi,j,k。
考虑把限制挂在右端点,那么对于一个要求 (l,i,x) 就相当于对一些下标有一些要求:
- 如果 x=1,那么要求 j,k<l。
- 如果 x=2,那么要求 j>l,k<l。
- 如果 x=3,那么要求 j,k>l。
时间复杂度为 O(n3)。