12.2
P7706 「Wdsr-2.7」文文的摄影布置 FST=1
题目中的信息可以直接在区间上合并,于是用线段树维护即可。
12.3
P5278 算术天才9与等差数列 FST=19
每次询问的等差数列是可以求出的,于是可以数列 Hash,因为数据水,所以可以判最小最大+线性和+平方和水过。
12.5
被锁在机房外\kk
12.6
P9073 [WC/CTS2023] 楼梯 FST=1
神仙题,没看懂第一篇题解的特殊性质。
所形成的阶梯可能很大,所以考虑维护其边界,令竖直的边界为 1,水平的为 0,那么楼梯就变成了 01 序列,还有一个神奇的性质:任何一段连续的 1...0 都是一个子楼梯!接着发现每次询问的 q 很特殊,都是边界数 sum−1 的因子,显然不是用来根号分治的, 神仙的点在于,设边界为 B1∼sum,单独拎出 B1,B1+q,B1+2q,...,Bsum,若有相邻的 B1+i×q,B1+i×q+q 为 1,0,那么就能找出一组解,而 B1=1,Bsum=0,必然可以用二分找出一组解!
题目中有回退操作,可以用可持久化线段树维护,复杂度 O(nlog2n)。
P8557 炼金术(Alchemy) No FST
开始水题。
分别考虑每种金属,方案数显然为 2n−1,然后乘法原理即可。
P5303 [GXOI/GZOI2019] 逼死强迫症 FST=1
记 fi 为斐波那契第 i 项(f0=f1=1),sfi 为 ∑j=0ifj,那么答案为 ∑i=0n−3fi×sfn−i−3,经推式子可知能用距乘求解,用到的一个可能只有我不知道的结论就是 sfi=fi+2−1。
P5239 回忆京都 No FST
前缀和即可。
12.7
CF13C Sequence P4597 序列 sequence CF713C Sonya and Problem Wihtout a Legend No FST
感谢 @xhgua 送的经验。
先考虑单调不降,递增就只需再减去下标。
如果一段区间要修改为同一个数,显然要取中位数,如果有两个相邻区间中位数逆序就直接合并即可,要用可并堆。
12.9
P8576 「DTOI-2」星之界 FST=50+
一眼切,但是调两天。
修改操作很套路,直接分块+并查集即可,对于询问,可以发现这就是多重集的排列,预处理阶乘即可。
但是还没有做完,这样只有 70pts,需要时空都进一步优化:
- 并查集尽量少新建节点,能替代就替代。
- 可以预处理快速幂,不然会被卡。
P8360 [SNOI2022] 军队 By Mouth
做法同上题,只是维护的标记变了。
12.10
P9361 [ICPC2022 Xi’an R] Contests FST=1
如果某次在第 i 行跳并且下次在第 j 行跳的话,显然要跳可以跳到的在第 j 行排名最小的才最优,并且对于一个选手,他能调到的第 j 行的最优点是确定的(总共就 m 种情况),于是设 ft,k,j 表示选手 j 跳 2t 步到第 k 行的最优点,询问只要倍增查询即可。
CF1511G Chips on a Board No FST
显然询问是个 Nim 博弈,我们只需求出每个棋子能走的步数的异或和即可。
根据标签可知这个题关于 2 的次幂的合并有优美的性质,例如合并两个长度为 2x,y 的区间(y≤2x),右区间增加的 2x 贡献只与右区间的点数有关,很方便维护,于是倍增即可。
P3643 [APIO2016] 划艇 No FST
想写拉插,结果写成了这个题。
直接 dp,设 fi,j 表示第 i 个学校出 j 个划艇的方案数,但这样的话时空均爆炸,考虑将所有的 [ai,bi+1) 离散化为 O(n) 个区间,将状态改为第 i 个学校出的游艇数在第 j 个区间内的方案数,那么 fi,j 就会等于 fp,j−1 乘上一些学校艇数在第 j 个区间里的方案数,显然可以算出 p+1∼i 中艇数能在第 j 个区间的学校数 m,问题就转化为了在 len 个数中选不超过 m 个数的方案数。
有一个巧妙的构造,即该问题等价于在 m 个 0 和 1∼len 组成的序列(即 0,0,0,...,0,0,1,2,3,...,len)中选 m 个数的方案数,选择第 i 个 0 等价于第 i 个学校不参与,于是答案为 Cm+lenm。但是本题强制第 i 个学校选,所以应为 Cm+len−1m。
如此 dp 即可做到 O(n3)。
12.12
P8290 [省选联考 2022] 填树 WA&TLE
调两天终究没调出来的题。
对于第一问,显然可以枚举取值区间 [x,x+k],但要求必须有最小值,于是可以容斥,转化为 w(x,x+k)−w(x+1,x+k) 的形式,于是可以树上换根 dp 做到 O(nw),但值域过大,可以发现 x 在一定范围内时,每个点的种类数可以表示为一次函数,而这样的范围离散化后只有 O(n) 种,于是扫描线,可以求出对应的多项式再用拉格朗日插值优化求出。
对于第二问也同理。
12.13
P3306 [SDOI2013] 随机数生成器 FST=6
关于 b 的项是一个等比数列,于是化简可得:ax−1≡x1t−x1+bat−a+b(modp),直接 BSGS 即可。
CF1106F Lunar New Year and a Recursive Sequence No FST
乘积又乘方不好处理,这种时候不妨取离散对数,以 998244353 的原根 3 为底数,就能出现一个齐次线性递推的柿子,另 fk=g1,那么可以距乘求出 fn=ga(注意此时模数为 998244352),故 fka≡m(mod998244353),仍使用原根,设 fk=gx,m=gb,那么 b 可通过 BSGS 求出,最终转化为 ax≡b(mod998244352),利用 exgcd 求解即可。
可以发现,原根的好处就是可以把一个未知数表示为 gx,实现降幂,方便求解。
12.15
P3723 [AH2017/HNOI2017] 礼物 FST=1
c 取非负与取任意整数是等价的,于是转化为求 ∑i=1n(ai+c−bi)2=∑i=1nai2+∑i=1nbi2+nc2+2c∑i=1n(ai−bi)−2∑i=1naibi。
前面的部分可以取对称轴,问题转化为求 ∑i=1naibi 的最大值,将 b 倒序后就变成 ∑i=1naibn+1−i,是一个卷积的形式,于是可以将 b 复制两倍,将多项式 a,b 相乘,取 n+1∼2n 项系数的最大值即可。
12.19
P6406 [COCI2014-2015#2] Norma FST=2
数据结构不好维护这个柿子,发现没有修改,于是考虑 cdq 分治,对于跨过 mid 的部分,枚举左端点,右端点可按照贡献种类分为 3 段,分别讨论即可。
12.20
P3350 [ZJOI2016] 旅行者 FST=8
对于每个询问,我们可以选择一个行 s,求出 s 上的每个点到询问点的最短路,再合并就能求出一个可能答案,对于两点在 s 异侧的点,显然这就是答案,否则在两侧递归处理即可。
P8231 [AGM 2022 资格赛] 农场 No FST
整体分治板题。
CF1217F Forced Online Queries Problem WA&Fake
如果没有强制在线,直接线段树分治+可撤销并查集即可。
如果有强制在线,第一篇题解告诉我不影响答案,于是写了并且假了。
注意起影响作用的 lst∈{0,1},所以只有两类情况,一条边的影响可以分解为若干区间来做。明天月考,就不补了。
P1641 [SCOI2010] 生成字符串 No FST
一个经典的模型转化:从 (0,0) 出发,每次向上或向右走,不穿过 y=x 的直线到 (n,m) 的方案数。
不考虑限制,方案数为 C(n+m,m)。
对于经过直线 y=x 的方案,我们考虑第一步直接走到 (0,1),那么到 (n,m) 就必定经过 y=x,如果不是一开始就走 (0,1) 的方案,可以翻转图案得到这个结果,这样从 (0,1) 出发的方案就对应了所有不合法的情况,此时情况数为 C(n+m,m−1)。
二者相减即为答案。
12.24
P3206 [HNOI2010] 城市建设 FST=6
神仙抽象题。
考虑分治,也就是说我们要使处理一个区间的复杂度在 O(len) 级别,当分治到 l=r 的区间时,我们希望除了第 l 次修改的边其他边都能被更新好。
对于区间 [l,r],不妨设 [l,r] 的修改牵扯到的边为动态边,其余的为静态边。
- 先强制选择所有动态边,再跑 Kruskal,则静态边可分为两类:必选边与可选可不选边。
- 把必选边都计入答案,并将此时的图(不包含动态边)缩点,这样就保证了点数在 len 级别。
- 强制不选择所有动态边,再跑 Kruskal,则可选可不选边中会出现一类无用边,直接删去即可。这样也保证的边数在 O(len) 级别。
这样就满足了上面的要求。只需要在点数 =1 或 l=r 时特判即可。
P8321 『JROI-4』沈阳大街 2 No FST
把 a,b 两数列合并,从大到小排序,属于 a 的染白, b 的染黑,问题转化为求将一个数组中白黑元素两两配对,一对的权值为靠后的元素的权值,一种方案的权值为 n 对权值之积,求所有方案权值之和。
直接 dp 即可。
P8688 [蓝桥杯 2019 省 A] 组合数问题 P6669 [清华集训2016] 组合数问题 FST=3
用卢卡斯定理,可将 (mn) 拆解为若干 (yx)(x<k,y<k) 的乘积,(mn) 为 0 当且仅当存在 (yx) 且 x<y,考虑容斥,用总方案数减去全部满足 x≥y 的方案数,直接数位 dp 即可。
P8594 「KDOI-02」一个仇的复 FST=1
先从简单的情况考虑,如果要用 k 个矩阵填满一个 1×n 的网络,那么可以令第 x 个元素选的意义为方案中存在以 x 为左端点的矩阵,第一个元素是必选的,故方案数为 (k−1n−1),两行的方案数为 ∑i(i−1n−1)(k−i−1n−1),利用范德蒙德卷积可得这可以化简为 (k−22n−2)。
对于题目,我们假设两个并排的 1×x 矩阵有 i 段,2×1 的有 j 个,那么:
- 1×x 矩阵的方案数可以用上述方法合并为 (k−i−2j2n−2i−2j),但由于要分成 i 段,还要乘上 (i−1n−j−1)。
- 再考虑把 j 个 2×1 矩阵插入 i+1 个空位(首尾还有 2 个)中,其中首尾的可以不放,中间的至少要放一个,方案数为 (ij+1)。
最终答案为 ∑i=1k∑j=0k(k−i−2j2n−2i−2j)(i−1n−j−1)(ij+1)+[n=k]。
12.25
P8367 [LNOI2022] 盒 FST=50+
神仙题,写了个假做法调了一节课。
先把几个 trick 写在前面:
- j(ji+j−1)=i(ii+j−1)。展开即可证得。
- (nn+m)=∑j=0m(ji+j)(m−jn−i−1+m−j)。考虑组合意义:从 (0,0) 走到 (n,m) 的方案数相当于走到第 i 行并从 (i,j) 走到 (i+1,j) 的方案数。
- ∑i=0q(ip+i)(m−in−p−1+m−i)=∑i=p+1n(ii+q)(n−in−i+m−q−1)。考虑组合意义:前者相当于从 (0,0) 走到 (n,m) 时,从 (p,i) 到 (p+1,i) 的 i 不能超过 q,即第 p 行到 p+1 行时列不超过 q 的方案数;后者相当于从第 q 列到第 q+1 列时行已超过 p 的方案数,二者显然是等价的。
- i 个非负元素相加等于 j 的方案数:(i−1i+j−1),由隔板法可得。
令 ci 为 ai 的前缀和,那么有:
ans=i=1∑n−1wij=0∑S∣ci−j∣(i−1i+j−1)(n−i−1n−i−1+S−j)
令 resi=∑j=0S∣ci−j∣(i−1i+j−1)(n−i−1n−i−1+S−j),拆去不等号并化简,得到从 0 开始的形式:
j=0∑S(j−ci)(ji+j−1)(S−jn−i−1+S−j)+2j=0∑ci(ci−j)(ji+j−1)(S−jn−i−1+S−j)
先拆开左式,右式同理解决:
j=0∑Sj(ji+j−1)(S−jn−i−1+S−j)−cij=0∑S(ji+j−1)(S−jn−i−1+S−j)
利用 trick 可得:
ij=0∑S(j−1i+j−1)(S−jn−i−1+S−j)−cij=0∑S(ji+j−1)(S−jn−i−1+S−j)
为了使左右两边的形式相同,我们把左式的上界向下挪一位:
ij=0∑S−1(ji+j)(S−j+1n−i−1+S−j+1)−cij=0∑S(ji+j−1)(S−jn−i−1+S−j)
ij=0∑S−1((i+1)−1(i+1)+j−1)((n+1)−(i+1)−1(n+1)−(i+1)−1+S+1−j)−cij=0∑S(i−1i+j−1)(n−i−1n−i−1+S−j)
令 f(n,s,i,k)=∑j=0k(i−1i+j−1)(n−i−1n−i−1+s−j),那么上式等于 i×f(n+1,S−1,i+1,S−1)−ci×f(n,S,i,S),另一式也同理即可得出:
resi=i×f(n+1,S−1,i+1,S−1)−si×f(n,S,i,S)+2×f(n,S,i,si)−2i×f(n+1,S−1,i+1,si−1)
虽然单次计算是 O(k) 的,但是根据公式,可以由 f(n,s,i,k) O(1) 转移到 f(n,s,i,k+1),可 i 的转移就不好办了,这个时候就可以用上 trick:
j=0∑k(i−1i+j−1)(n−i−1n−i−1+s−j)=j=i+1∑n(kj+k−1)(n−jn−j+s−k−1)
就也可以 O(1) 实现 i 到 i+1 的转移了。
12.26
P4562 [JXOI2018] 游戏 FST=4
显然如果选择了 x,其因数不会被覆盖,那么选 x 就是无用的,不妨找出最大的因数(不包括自己)不在 [l,r] 的数,特别地, 1 也算,记总个数为 cnt,记这些数为关键数,那么 t(p) 为最后一个关键数的位置,直接计数即可。
P2606 [ZJOI2010] 排列计数 FST=3
将 ⌊2p⌋ 向 p 连边,就构成了一颗以 1 为根的二叉树,在树上 dp 即可。
然后 WA 100 pts,被 hack 了。
n 可能超过模数,逆元就不存在,这时套路的另开一个数组存模数的次幂即可。
12.27
P8863 「KDOI-03」构造数组 No FST
记 ∑i=1nbi=sum,∑j=1ibj=ai,若 sum≡1(mod2) 那么无解。
否则,问题等价于有 n 种元素,每种有 bi 个,组成 2sum 个无序数对且同种元素不能在一对的方案数的方案数。
按编号依次考虑每种元素,这样就可以不用考虑无序关系。
对于第 i 种元素,前面的元素占用配对的情况一定只有三种:2 个,1 个,0 个。记其个数分别为 kk,k,j,那么有:
kk+k+j=2sum
2kk+k=ai
所以 k,j 一定都可以用 kk 表示,故设 fi,kk 为第 i 种元素放完后有 kk 个满配对的方案数,那么:
fi,kk=p=0∑max{kk,bi}fi−1,kk−p(bi−pj+bi−p)(pk+p−(bi−p))
时间复杂度 O(sum2),但是能过(?
P4456 [CQOI2018] 交错序列 FST=8
显然 x+y=n,所以一种情况的贡献值为 (n−y)ayb,展开后可得:
xayb=i=0∑a(ia)ni(−1)a−iya+b−i
(ia)ni(−1)a−i 这部分显然可以提出来,故只需算出 ya+b−i 的系数即可。
设 fi,j,0/1 表示第 i 位为 0/1 的 ya+b−i 项的系数,那么:
fi,j,0=fi−1,j,0+fi−1,j,1
fi,j,1=k=0∑j(kj)fi−1,k,0
矩阵快速幂即可。
然后获得了比暴力多 10 分的好成绩
卡常技巧:
- 矩乘时先乘后统一取模。
- 在交换循环顺序的情况下,进入第三层循环前判断 a[i][k] 是否非 0。
P5163 WD与地图 By mouth
显然要先倒序操作,把删边变为加边。
如果边是无向的,只要动态合并连通分量即可,可以用合并权值线段树解决。
但这题边是有向的,可以发现发生合并的时间就是某条边第一次在一个连通分量内的时间,并且这个时间是可二分的,于是整体二分即可。
具体地,用可撤销并查集维护联通情况,跑只与新加的边有关的点的 tarjan。