A 运算
给定 n+1 个整数 a0 到 an,其中 a0=0,你可以在每两个数之间填上加,减,除,按位与,按位或,按位异或中的任意一个运算符(不可以填乘),然后不计优先级,从左至右进行运算,得到一个结果。求结果最大值。
这里的按位与,按位或,按位异或一个数为按位与,按位或,按位异或一个数的绝对值。除为向 0 取整。
对于全部数据,1≤n≤5×105,−109≤ai≤109。
题解
容易证明,答案为所有数绝对值的和。
B “经典”问题
给定一个序列,m 次查询区间的 mex 值,mex 表示最小的没出现过的自然数,n,m≤105。显然可以使用经典算法轻易解决这个经典问题。
现在蒟蒻 djy 魔改了一下它,给定一个 0 到 n−1 的排列,m 次查询区间的 mex 值,但是 n,m 变大了,你能帮帮他吗?
n,m≤107,输入数据在程序内生成。
题解
答案为区间 [1,l−1] 和区间 [r+1,n] 的最小值。
证明:小于答案的数在区间外没出现过,因为排列每个数恰好出现一次,所以在区间出现过。答案在区间外出现过,在区间内没出现过。
C 维护序列
你要维护两个长度为 n 的序列 a,b,支持以下两种操作:
1 l r k
,表示对于每个 i∈[l,r] 执行 k 次以下操作:交换 ai,bi,然后 ai 变为 ai+bi。
2 x
查询 ax 和 bx 的值,分别对 109+7 取模。
操作共 m 次。
n,m,k≤105。
题解
考虑一个毫不相干的问题:如何不用数组递推斐波那契数列?可以用两个变量来表示当前项和上一项。这样看,递推k次时恰好就是一操作的内容。
所以我们要求的就是以初始序列作为第一项和第二项的广义斐波那契数列的两项。
这样我们只需要维护当前每个位置是第几项,然后查询时矩阵快速幂求解即可。区间加,单点查询,差分树状数组就行了。
D
题意: 你有一个 r×c 的六边形网格,一共有 r 行 c 列,第 i(1≤i≤r) 行第 j(1≤j≤c) 列的格子有一个权值 Ai,j。其中 (i,j) 相邻的格子为 (i,j−1),(i,j+1),(i−1,j),(i−1,j+1),(i+1,j−1),(i+1,j) 其中存在的格子。 注意,你并不需要知道网格具体长什么样,只需要知道格子的邻接关系即可。 每次操作,你可以选择一个格子,然后将其权值加上 1。希望经过不超过 k 次操作之后,相邻格子差的最大值最小。输出这个最小值。 数据范围: 1≤r×c≤105,k≤1018,Ai,j≤1012。
题解
先二分答案,容易转化成要求出每个格子至少要多少,统计一下需要补到多少即可。 这部分如果使用 Dijkstra,那么有两个 log,不一定能过。 优化大概有这么些方法: 1. 一开始将所有点排完序。每次做的时候使用两个队列的技巧模拟Dijkstra。 2. 根据图的特殊性,两点之间一定存在一条标号先递增后递减,或者先递减后递增的路径。所以只要正反正反更新几次即可
E 刀虎二象性
沈阳大街今犹在,不见当年整活人。
维护一个数列 a ,这个数列初始为空。
对于这个数列 a ,总共有 q 次操作,每次操作分为如下五个种类:
1 x
,在数列末尾加一个数字
2 x y
,将数列中所有值为 x 的数的值替换成 y
3 x
,查询值为 x 的位置的个数
4 x
,查询位置 x 上的数
5 x y
,满足 a[x]=a[y] 求最早的使得 a[x]=a[y] 的时刻
我们定义每次操作 / 询问为一个时刻。
强制在线
q≤2×105。
题解
考虑维护一个森林,森林中的节点分为两类:
-
权值点,每个点表示一个权值。
-
位置点,每个点表示一个位置。
对于一个位置点,考虑使得该位置所在树的根节点的权值为该位置的权值。
如果一个权值在当前的森林中不是根节点,就在森林中新添加一个权值点。
那么对于第二种操作可以看成在森林中新添加一条边。
对于查询 3,考虑其对应的权值点是否为一棵树的根节点,如果不是则为 0,如果是相当于子树内位置点的个数。
对于查询 4,等价于查一个位置点所在树的根节点的权值。
对于查询 5,可以在每个点和树上的每条边上维护被加入时的时间戳,那么等价于查位置点树上路径的最大值。
使用 LCT 动态维护森林,复杂度 O(qlogq)。
F 抽奖
NaCly_Fish 去抽奖,每次抽到奖品的概率都是 ba。
她想要 m 个奖品,于是她决定连续抽奖,直到自己拿够 m 个奖品为止。
设随机变量 x 为 NaCly_Fish 的抽奖次数,她很快就算出了 x 的数学期望值;但是她想知道 xk 的数学期望值是多少。
她并不希望你进行太复杂的运算,故你只需要告诉她答案对 998244353 取模的值。
(1≤k≤107,1≤m≤9×108,1≤a<b≤108)
题解
考虑枚举每此抽到奖品需要的次数,恰好抽 n 次后中奖的概率就是 (1−q)n−1q,就有计算式:
E(xk)=(1−q)mqm∑n1=1∞∑n2=1∞⋯∑nm=1∞(∑i=1mni)k∏j=1m(1−q)nj
根据 ik=k![xk]eix,答案就可以写为
E(xk)=(1−q)mqm[k!xk]∑n1=1∞en1x(1−q)n1∑n2=1∞en2x(1−q)n2⋯∑nm=1∞enmx(1−q)nm
注意到这样各个和式之间就不相关了,可以直接写为各和式的乘积:
E(xk)=(1−q)mqm[k!xk](1−(1−q)ex1−1)m
那么现在的问题就变为提取 rmemx(1−rex)−m
的 xk 系数,使用 FFT 就可以做到 Θ(klogk) 的时间复杂度,但这显然是不够的。
根据 EI 总结的一套方法,设 F(x)=(x+1)m(1−r(x+1))−m,所求即 rm[xk]F(ex−1)。
由于 ex−1 没有常数项,所以次数高于 xk 的项对于答案没有贡献,我们只需知道 F(x)=F(x)modxk+1,然后求 [xk]F(ex−1) 即可。
直接这样算并没有优化复杂度,但 F(x) 的系数是可整式递推的,设 G(x)=F(x−1),则 G(x) 也是可整式递推的,其前 k 项系数可以 Θ(k) 计算,再配合线性筛就可以计算出 [xk]G(ex)。
具体来讲,求导一下可以得到 F(x) 的 ODE:
(1+x)(q−rx)F′(x)−m(r+q)F(x)=0
提取 xn−1 系数:
nqFn+(q−r)(n−1)Fn−1−r(n−2)Fn−2−m(r+q)Fn−1=0
设 fn=[xn]F(x),u=−(k+1)qFk+1,v=−rkFk,就有
nqfn+(q−r)(n−1)fn−1−r(n−2)fn−2−m(r+q)fn−1=[n=k+1]u+[n=k+2]v
写做 ODE 就是
(1+x)(q−rx)F′(x)−m(r+q)F(x)=uxk+vxk+1
做代换 x=t−1,得到 G(t) 的 ODE:
t(q−r(t−1))G′(t)−m(r+q)G(t)=u(t−1)k+v(t−1)k+1
直接提取系数就能得到递推式,这里就不赘述了。
总时间复杂度 Θ(k)。