CF712E Memory and Casinos
有 (n) 个位置,处于第 (i) 个位置时,有 (p_i=frac{x_i}{y_i}) 的概率会走到 (i+1) ,有 (1-p_i) 的概率会走到 (i-1) ,现在有 (q) 次操作,分为两种:
1 i x y
将 (p_i) 改为 (frac{x}{y})2 l r
初始在位置 (l) ,不断随机游走,走到 (r+1) 时停止,问行走过程中没有任意一时刻走到 (l-1) 的概率,绝对误差 (<10^{-4})
- (n, qleq10^5)
- (1leq xleq yleq10^9)
- 保证任意时刻 (p_i) 不降
假设询问区间为 ([1, n])
我们记 (f_i) 为,从位置 (i) 开始,走到 (n+1) 时停止,没有任意一时刻走到 (0) 的概率
那么有 (f_0=0, f_{n+1}=1, f_i=p_if_{i+1}+(1-p_i)f_{i-1} (1leq ileq n)) ,答案为 (f_{1})
即 (f_i-f_{i-1}=p_i(f_{i+1}-f_{i-1}))
我们记 (g_i=f_{i}-f_{i-1}) ,则有 (g_i=p_i(g_{i+1}+g_{i})) ,即 (g_i=displaystylefrac{p_i}{1-p_i}g_{i+1})
注意到 (f_{n+1}=displaystylesum_{i=1}^{n+1}g_i=1) ,并且 (g_i=g_{n+1}displaystyleprod_{j=i}^nfrac{p_j}{1-p_j}) ,我们可以求出 (x=1+displaystylesum_{i=1}^nprod_{j=1}^nfrac{p_j}{1-p_j}) , 那么 (g_{n+1}=frac1x) ,则有 (f_1=g_1=g_{n+1}displaystyleprod_{i=1}^nfrac{p_i}{1-p_i})
区间的 (x) 和 (displaystyleprod_{i=1}^nfrac{p_i}{1-p_i}) 可以用线段树求出,但这样会炸精度
实际上我们也可以考虑 (g_{i+1}=displaystylefrac{1-p_i}{p_i}g_i)
则有 (f_{n+1}=displaystylesum_{i=1}^{n+1}g_i=g_1(1+sum_{i=1}^{n+1}prod_{j=1}^ifrac{1-p_j}{p_j})=1)
我们只需求出 (x=displaystyle 1+sum_{i=1}^{n+1}prod_{j=1}^ifrac{1-p_j}{p_j}) ,答案即为 (frac1x) ,而在线段树维护过程中,如果 (x) 的值大于 (10^4) ,我们可以直接将其看作 (inf) ,可以避免炸精度
CF493E Vasya and Polynomial
给定 (t, a, b) ,问有多少个非负系数的多项式满足 (f(t)=a, f(a)=b)
(1leq t, a, bleq10^{18})
注意到如果 (f(x)) 有多于一个系数不是 (0) ,那么一定有所有系数均小于 (a) ,那么此时 (f(x)) 可由 (b) 在 (a) 进制下的表示唯一确定
若 (f(x)) 仅有最高项不是 (0) ,特判掉 (t=a=1) 的情况,那么 (f(x)) 的次数不会超过 (60) ,暴力枚举即可
CF494D Birthday
给定一棵 (n) 个点的带正边权树, (q) 次询问,每次给定 (u, v) ,问
[displaystylesum_{xin subtree(v)}dis(u, x)^2-sum_{x otin subtree(v)}dis(u, x)^2 ](n, qleq10^5) ,答案 (mod10^9+7)
做法一:
首先可以换根 dp 对所有 (u) 求出 (dp_u=displaystylesum_{x=1}^ndis(x, u)^2)
那么答案即为 (2displaystylesum_{xin subtree(v)}dis(u, x)^2-dp_u)
如果 (u otin subtree(v)) 是很好做的,直接将距离拆成 (dis(u, x)=dis(u, v)+dis(v, x)) 即可
否则我们枚举链 ((u, v)) 上的一点 (y) ,统计 (lca(u, x)=y) 时的答案
大力划一波式子再套上一个线性 (lca) 即可做到 (O(n)) ,但并不好写
做法二:
将询问离线,把询问 ((u_i, v_i)) 挂在点 (u_i) 上,从根往下 dfs
对于当前 dfs 到的 (u) ,我们维护 (a_i=dis(i, u)^2, b_i=dis(i, u))
不难发现,当我们从 (u) 转移到其某个儿子 (v) 时,这个可以直接用线段树维护
这棵线段树需要支持:
- 区间加
- 询问区间平方和
时间复杂度 (O(nlog n)) ,比上一种做法不知道好写到哪里去了
CF314D Sereja and Straight Lines
给定平面上 (n) 个点 ((x_i, y_i))
选择一个点 ((x, y)) ,如果存在两条穿过 ((x, y)) 的直线,且与 (x) 轴正方向夹角分别为 (45^{circ}, 135^{circ}) ,定义 ((x_i, y_i)) 到 ((x, y)) 的权值为 ((x_i, y_i)) 到两条直线的曼哈顿距离的最小值,定义点 ((x, y)) 的权值为对于所有 ((x_i, y_i), 1leq ileq n) , ((x_i, y_i)) 到 ((x, y)) 的权值的最大值
问在所有可能的选择 ((x, y)) 的方案中,权值最小是多少
- (nleq10^5)
- (|x_i|, |y_i|leq10^9)
先将坐标轴顺时针转 (45^{circ}) ,然后考虑二分答案 (leq mid)
做法一:
对于 ((x_i, y_i)) ,合法的 ((x, y)) 的取值范围是一个以 ((x_i, y_i)) 为中心的十字形,且它的边长是 (2mid)
现在的问题是对于 (1leq ileq n) , ((x_i, y_i)) 所形成的十字架是否有交,使用可以得到一个 (O(nlog^2 n)) 的优秀做法
做法二:
对于 ((x, y)) ,需要满足 (forall 1leq ileq n, (x_i, y_i)) 坐落于以 ((x_i, y_i)) 为中心、边长为 (2mid) 的十字架
那么枚举 (1leq ileq n) ,找到 (j) 满足 (x_j) 最小且 (x_i-x_jge2mid) ,这部分将所有点按 (x_i) 排序后可以使用扫描线
我们将位置 (x_i) 看作该十字架的平行于 (y) 轴部分的矩形的右端点的横坐标,接下来只需要判断对于所有 (x_k>x_i) 和 (x_k<x_j) ,它们的纵坐标的极差是否 (leq2mid)
时间复杂度 (O(nlog n))
CF587E Duff as a Queen
给定一个长为 (n) 的序列 (a_1, a_2, cdots, a_n) ,有 (q) 次操作,操作分为两种:
1 l r k
,将区间 ([l, r]) 中的 (a_i) 异或上 (k)2 l r
,询问这个区间所有子集的异或和形成的集合的大小(空集合法,异或和为 (0) )
- (nleq2 imes10^5)
- (qleq4 imes10^4)
- (0leq a_ileq 10^9)
记 (b_i) 为 (a_i) 的异或差分序列,即 (b_i=a_ioplus a_{i-1})
我们选一个区间 ([1, n]) 的子集 (S={p_1, p_2, cdots, p_k}) ,则 (egin{aligned}&a_{p_1}oplus a_{p_2}opluscdotsoplus a_{p_k}\&=b_{p_1+1}oplus b_{p_1+2}opluscdotsoplus b_{p_2}oplus a_{p_3}oplus a_{p_4}opluscdotsoplus a_{p_k}\&=b_{p_1+1}oplus b_{p_1+2}opluscdotsoplus b_{p_2}oplus b_{p_3+1}oplus b_{p_3+2}opluscdotsoplus b_{p_4}oplus a_{p_5}oplus a_{p_6}opluscdotsoplus a_{p_k}\&cdotsend{aligned})
我们总可以将 (a_{p_1}oplus a_{p_2}opluscdotsoplus a_{p_k}) 对应到一个 (B) 的子集 (T) 上,反之亦然
那么对于询问 ([l, r]) ,我们考虑集合 ({a_l, b_{l+1}, b_{l+2}, cdots, b_r}) 的所有子集的异或和,和原问题等价
可以用线段树维护一个区间的 (b_i) 构成的线性基, pushup 时暴力 (O(log^2a_i)) 合并两个线性基即可
对于修改 ([l, r], k) ,对序列 (b) 造成的影响是, (b_lleftarrow b_loplus k, b_{r+1}leftarrow b_{r+1}oplus k) ,再用一个树状数组维护 (a_i) 的单点取值即可
时间复杂度 (O(nlog^3n))
CF283E Cow Tennis Tournament
- 有 (n) 头牛, (k) 次操作。
- 每头牛有个能力值 (s_i) 。对于两头牛,令能力值大的那个向能力值小的那个连一条有向边。
- 第 (i) 次操作中, ( m Farmer John) 会选择一段区间 ([a_i, b_i]) ,并且对于 (forall x, y in [1, n] land s_x, s_y in[a_i, b_i]) ,将 (x) 与 (y) 间的连边反向。
- 请你求出,进行 (k) 次操作之后,图中有多少三元环。
- (3 leq n leq 10^5) ,(0 leq k leq 10^5) ,(1 leq s_i leq 10^9) , (1 leq a_i < b_i leq 10^9) 。保证 (s_i) 互不相同,不保证 (a_i) 或者 (b_i) 与某个 (s_j) 相同。
考虑如何统计竞赛图三元环个数
容斥,我们枚举一个 (1leq uleq n) ,三元组 ((u, v, w)) 不能形成三元环,当且仅当 (u) 连出去的两条均为出边 / 入边,这样每对不合法三元环只会在点 (u) 处被统计一次
那么答案等于 (displaystyleinom n3-sum_{i=1}^ninom{d_i}2) ,其中 (d_i) 是点 (i) 的出度 或 入度
考虑原题,我们要对每个点求其出度,考虑原图邻接矩阵,初始时 (G_{i, j}=[j<i]) ;而离散化后,操作 (i) 会导致左上角为 ([a_i', a_i']) ,右下角为 ([b_i', b_i']) 的矩形中的 (0/1) 取反
扫描线一下即可
CF30E Tricky and Clever Password
给定字符串 (S) 。求一个长度为奇数的回文串 (T) 以及一个不超过 (n=|T|) 的正整数 (x) ,使得存在至少一组字符串 ((S_2, S_2, S_3)) ( (S_1, S_2, S_3) 可以为空)满足 (S = S_1 + T [1, x] + S_2 + T [x + 1, n − x] + S_3 + T [n − x + 1, n]) 。 (T [l, r]) 表示 (T) 的第 (l) 到第 (r) 字符组成的子串,从 (1) 编号。 求满足条件的长度最大的 (T) 的长度是多长。
(nleq10^5)
由于 (T[n-x+1, n]) 必定是 (S) 的一段后缀,考虑枚举 (x)
我们想让 (T[1, x]) 即 (T[n-x+1, n]) 的反串在 (S) 中的最靠前出的现位置,这样就能给 (T[x+1, n-x]) 留出”尽量多的空间“
我们考虑让 (S) 的反串 (S^R) 与 (S) 匹配,对于每个位置 (i) 我们求出一个最大的 (m_i) 使得 (S[i-m_i+1, i]) 与 (S^R[1, m_i]) 相等,可以用 kmp 求出,那么最小的 (m_x=id) 就是 (T[1, x]) 最靠前的出现位置就是 ([id-x+1, id])
那么现在的问题是,找到 (S[id+1, n-x]) 中最长的长为奇数的回文串,这个就是 (T[x+1, n-x])
用 manacher 求出以 (i) 为中心的最长回文串长度 (ext_i)
考虑二分答案 (mid) ,只需要判断区间 ([id+1+frac{mid-1}2, n-x-frac{mid-1}2]) 是否存在 (ext_ige mid) 即可
时间复杂度 (O(nlog n))
CF455E Function
有一个递推式 (f(i, j)=min(f(i-1, j-1), f(i-1, j))+a_j) ,其中 (2leq ileq jleq n)
给定 (f(1, k)) , (1leq kleq n) ; (q) 次询问 (f(x_i, y_i))
(n, qleq10^5)
记 (s_i=displaystylesum_{k=1}^if(1, k))
首先需要注意到一个结论,假设 (f(x, y)) 最终从 (f(1, k)) 转移得到( (y-x+1leq kleq y) ),那么转移路径一定形如 (f(1, k) o f(2, k) o f(3, k) ocdots, f(t, k) o f(t+1, k+1) o f(t+2, k+2) ocdots o f(x, y))
如果将 (f(i, j)) 放在一个 (n imes n) 网格的第 (i) 行第 (j) 列,转移就形如:先向下转移一段,接着不断向右下转移
可以反证,应该也挺能感性理解的
那么 (f(1, k)) 对 (f(x, y)) 的贡献路径是唯一的,得到的值为 (s_y-s_k+(x-y+k)cdot f(1, k)) ,注意到这对于 (k) 而言是一个以 (x-y) 为自变量的一次函数,那么我们的问题就变成了求编号在一段区间中区间的直线在横坐标为 (x-y) 时纵坐标的最小值
可以用线段树维护凸包,时间复杂度 (O(nlog^2n))
CF213E Two Permutations
给定一个 (n) 的排列 (P) 和一个 (m) 的排列 (Q)
问有多少个 (x) 满足,序列 (P_1+x, P_2+x, cdots, P_n+x) 是 (Q) 的子序列
(nleq mleq 2 imes10^5)
注意到序列 ({P_i+x}) 始终满足极差为 (n-1) ,考虑从这里入手
我们升序枚举 (x) ,考虑排列 (Q) 中,仅保留值域在 ([x+1, x+n]) 的元素,得到的序列
只要其差分数组等于排列 (P) 的差分数组,该 (x) 就合法
当 (x) 转移到 (x+1) 时,我们会删掉 (Q) 中元素 (x+1) ,添加元素 (n+x+1)
可以用数据结构维护如上操作后得到的序列的差分序列的 hash 值
时间复杂度 (O(nlog n))
CF1067D Computer Game
有 (n) 个游戏,第 (i) 个游戏有收益 (a_i) 升级后有收益 (b_i) 。每秒可以选一个游戏玩,第 (i) 个游戏有 (p_i) 的概率成功,如果成功则获得当前收益,并可以选择任意一个游戏进行升级。求 (t) 秒后期望收益的最大值
- (nleq10^5)
- (tleq10^{10})
- (1leq a_i<b_ileq10^8)
不难发现,如果我们成功了至少一场游戏,那么之后我们一定会持续游玩 (t=b_i imes p_i) 最大的游戏,但这并不意味着最优的游戏过程中,我们最多只会玩两种不同的游戏
记 (f_i) 为还剩 (i) 分钟的答案,那么有 (f_i=displaystylemax_{1leq jleq n}{(1-p_j)f_{i-1}+p_j(i-1)t+a_jp_j})
那么对于一个 (k (p_k<p_j)) , (f_i) 由 (j) 转移得到比由 (k) 转移得到劣,当且仅当
可以发现 (g_i=f_i-it) 是单减的
确定决策点后 (f_i) 可以用矩乘快速转移
我们不妨二分在什么时间转移的决策点会改变
如果直接二分,时间复杂度是 (O(nlog^2t)) 的
但可以预处理矩阵的 (2^k) 幂,然后可以倍增做到 (O(nlog t))
CF1458C Latin Square
给定一个 (n imes n) 的矩阵,其每行每列都是一个 (n) 的排列,有 (m) 次操作,有以下几种类型:
UDLR
将矩阵每行 / 每列 往某个方向循环移动一格IC
将矩阵每一行 / 列上的排列变为其逆排列求最后的矩阵
(nleq1000; mleq10^5)
我们将矩阵元素 (a_{i, j}) 看作三元组 ((i, j, a_{i, j}))
那么 UDLR
对三元组 ((x, y, z)) 的影响为:
U
((x, y, z)leftarrow(x+1, y, z))D
((x, y, z)leftarrow(x-1, y, z))L
((x, y, z)leftarrow(x, y+1, z))R
((x, y, z)leftarrow(x, y-1, z))
操作 IC
对其影响为:
I
((x, y, z)leftarrow(x, z, y))C
((x, y, z)leftarrow(z, y, x))
我们求出这 (m) 个操作造成的影响即可推得操作后的矩阵
记得将主席树空间稍微开大一点