CF1747
题目链接点击标题处的TX即可
T1
题面翻译
给定一个整数序列,将之分成两个,求这两部分和的绝对值之差的最大值,即\(max(|sum1|-|sum2|)。\)
范围:\(n=10^5,a_i\in[-10^9,10^9]\)
做法
猜测贪心,考虑一个一定可行的方案,进行邻项交换,看什么样的方案比它优。
我们将正数全部塞到一边,负数全部塞到另一边,令和较大的成为sum1。
我们令正数总和更大,记正数为\(a_1,a_2,…,a_n\),负数为\(b_1,b_2,…,b_m\)。
考虑将一些正数放到第二个序列,记这些正数和为\(tmp\):\(sum1'=sum1-tmp\)
若\(tmp<=sum2\),则\(sum2'=sum2-tmp\),\(sum'=sum1+tmp-sum2\)答案不变
若\(tmp>sum2\),则\(sum2'=tmp-sum2\),\(sum'=sum1+sum2-tmp\),小于\(sum=sum1+tmp-sum2\)
其余情况同理可证
故而,这种情况就是最优解,直接做做完了
T2
题面翻译
给定一个n,代表一个由n个“BAN”拼成的字符串,每次可以交换两个位置的字符,最小化使得字符串中不存在“BAN”子串的操作数,并输出一种方案
数据范围:\(n<=10^5\)
注意:
此题的SPJ疑似有误,口胡了不要直接写代码
做法
注意到,一次交换最多破坏两个“BAN”子串,对于剩下的单个,我们交换一下,所以答案为\(\lceil \frac{n}{2}\rceil\)
对于方案的构造,然后我们跨过中线交换就做完了。(此题好像只能跨过中线交换?我全部邻项交换寄了,但是手模是过的)
T3
题面翻译
给定一个正整数序列,两个绝顶聪明的人进行游戏,求谁有必胜策略:
每次\(a_1-1\),并选择一个其他位置与\(a_1\)交换
若一个人操作前\(a_1\)是0,则输掉游戏
数据范围:\(n<=10^5,a_i\in[1,10^9]\)
此题做法
我们画出流程:
\(player_1\begin{cases}a_1-1\\swap\end{cases}\)
\(player_2\begin{cases}a_1-1\\swap\end{cases}\)
…
\(player_x\begin{cases}a_1==0\\I'm\ loser\end{cases}\)
由于\(-1\)的对象事实上由上一个玩家选定,归于上一个玩家的策略范畴,我们考虑一个等价转换,将\(a_1-1\)归入上一个玩家:
\(a_1-1\)
\(player_1\begin{cases}swap\\a_1-1\end{cases}\)
\(player_2\begin{cases}swap\\a_1-1\end{cases}\)
…
\(player_x\begin{cases}swap\\a1==0\\I\ win\end{cases}\)
此题有一个很好的性质,上一个人选择的-1对象下一个人不能再次选择并-1,即两次相邻操作独立,
也就是说,对于一个玩家,只要每次选能选的最小值,将之不断-1,就是一个玩家最早的获胜时间,且不受另一个玩家影响
此时最优策略变得显然,两个人都会选取能选的最小值-1,更早将最小值减成0的获胜。
于是,我们只需要比较\(player_1\)和\(player_2\)能选择的最小值即可,我们发现,当第二个玩家能选到的比第一个玩家更小,当且仅当初始的\(a_1-1\)后成为了整个序列的唯一最小值。直接扫一遍整个序列就做完了
T4
题面翻译
给定一个序列,每次询问一个区间全部归零的最少操作次数,不能归零输出-1。
操作为:将一个奇数长度的区间全部赋值成区间的异或和
数据范围:\(n,q<=2×10^5\)
此题做法:
考虑对于一个区间,我们怎么在这个区间内操作都不改变区间的异或和。因为奇数长度区间赋值异或和,对于整体区间的异或和,偶数个数消去,剩下一个有贡献的,是这个区间的异或和。
那么,区间异或和为0,才有可能做。
对于本身全是0的区间,不需要操作
对于奇数长度区间,直接一次操作推平即可;
对于偶数长度区间,当且仅当这个区间存在一个长为奇数的异或和为奇数的前缀时有解。
这几个判断都是好做的,就做完了。
T5
前置知识:二项式反演
解决问题:计数问题
f(m):至多m个/至少m个 ⇒ g(m):恰好m个的方案数
前置公式:
将\(a=1,b=-1\)代入二项式定理 \((a+b)^n=\sum_{i=0}^n{C_n^ia^{n-i}b^i}\)
二项式定理推论:\(\sum_{i=1}^n{(-1)^iC_n^{i}=[n==0]}\)
组合数分离式:\(C_n^mC_m^k=C_n^kC_{n-k}^{m-k}\)
即从n中选m个,再从m个中选k个,等价于从n直接中选k个,在从剩下的n-k个中选m-k个
从而推出二项式反演公式:
\(f(n)=\sum_{i=0}^n{C_n^ig(i)}\) ⇔ \(g(n)=\sum_{i=0}^n{(-1)^{n-i}C_n^if(i)}\)
证明:代入即可
双相关\(\sum\)的取出方法:标号点对,考虑对于内部的同一个j,有哪些i会枚举到它
至多问题:
\(f(m)=\sum_{i=0}^m{C_m^ig(i)}\) ⇔ \(g(m)=\sum_{i=0}^m{(-1)^{n-i}C_n^if(i)}\)
至少问题:
\(f(m)=\sum_{i=m}^nC_n^ig(i)\) ⇔ \(g(m)=\sum_{i=m}^n{(-1)^{i-m}C_m^if(i)}\)
注意:二项式反演和多步容斥本质不同
多步容斥:单纯给不少于…计数,对于同一个f(i),内部不重复,但对于不同的f(i),由于记重复,要去重
二项式反演:钦定m个必须选,剩下的随便算,对于同一种方案,在同一个f(i)中也可以多次被计数
此题做法
参考了Leasier的题解,更加建议阅读原题解,不建议阅读本人本篇题解,毕竟今天刚学二项式反演,目前还是已知半解的感觉。
容易发现合法序列长度 \(<=n+m+1\)——因为每次 a,b 中至少有一个-1。
然后发现每存在一个位置不合法,我们就可以把不合法的位置删掉——反正重复了,删了也不影响剩下的部分。当我们把所有不合法位置删完后,你会发现它变成了一个合法序列。
设f(x)表示长度恰好为 x 的合法序列的方案数,g(x) 表示长度恰好为 x 的不一定合法序列的方案数。
现在考虑 g(x)。注意到其实我们可以任取一个长度为 x的满足不降限制的 a,b序列,于是 \(g(x)=C_{n+x−2}^nC_{m+x−2}^mg(x)\)。
答案为\(\sum_{i=2}^{n+m+1}{if(i)}\)
然后代入一下式子
\(f(x)=\sum_{i=2}^x{(−1)^{x−i}C_{x−1}^{i−1}g(i)}\)
注意一下细节,就做完了。

浙公网安备 33010602011771号