task5

Flamire Lv4

[TOC]

1. CF1746F - Kazaee [Keter] ⭐

题面

给定数列 a1,a2,,anq 次操作,每次操作为以下两种中的一种:

  • 给定 i,x,执行 ai:=x
  • 给定 l,r,k,判断对于任意 x,是否都有 xa[l:r] 中的出现次数为 k 的倍数

1n,q3×105

题解

Sol

这个,很不可做啊!

所以不应该想靠谱做法。

注意到,如果我们随机选择一部分数,算它们的出现次数之和,如果该询问答案为“是”,那么出现次数之和一定还是 k 的倍数,否则至少有 12 的概率不是 k 的倍数

因此多次选择值域子集即可,剩下的问题就是统计区间中 1 的个数,树状数组容易维护

复杂度 O(nlog2n)


2. CF1696F - Tree Recovery [Keter] ⭐

题面

有一棵你不知道的树,你知道它有 n 个节点,并且对于任意 i,j,k,你知道 dis(i,j) 是否等于 dis(j,k)

请构造一棵符合条件的树或判断无解。

1n100

题解

Sol

如果确定了一条边,那么可以直接唯一确定整棵树

那么直接暴力枚举 1 和谁相连,然后将树建出来判断是否合法即可

复杂度 O(n3)


3. CF1738G - Anti-Increasing Addicts [Euclid]

题面

给定 n×n 的网格,有些格子可以染黑,有些格子不能染黑

给定 k,你需要染黑恰好 (nk+1)2 个格子,使得不存在没涂黑的格子 (x1,y1),(x2,y2),,(xk,yk) 使得 x1<x2<<xky1<y2<<yk

给出方案或判断无解

2kn1000

题解

Sol

首先将 kk1

这样每条左上-右下的斜线最多只能留白 k 个,算一下留白的上界是 (nk)2,这意味着我们不能浪费任何一个格子

我们把不能染黑的格子,以及左下角的长为 k 的阶梯与右上角长为 k 的阶梯称为不能染黑的点

定义每个不能染黑的点 (x,y) 的权值为:所有满足 i<x,j<y 的不能染黑的点 (i,j) 的权值最大值 +1

如果存在一个点的权值 >k 显然无解,否则一定可以构造出解,具体地,对每个 i[1,k],从最左下的权值为 i 的点开始,优先向右走,不能向右走则向上走,可以走出来一条只向右或向上的包含所有权值为 i 的点的路径,将这条路径全部染黑即可

不难发现 k 条路径都不会有相交

复杂度 O(n2)


4. CF1637F - Towers [Keter]

题面

给定一棵 n 个点的树,点有点权 ai,你需要在树上建塔,一个点可以建任意多个塔,你可以给塔任意指定权值 e

对每个点 i,需要满足存在两个塔 x,y,使得 ixy 的路径上,并且 min

\sum e 的最小值

2\le n\le2\times10^5,1\le a_i\le10^9

题解

Sol

可以证明,所有塔都一定在叶子上。

首先,每个叶子上一定要有塔,否则叶子的限制无法满足。

其次,如果一条路径上有 x-y-z 的塔,我们令 e_x\leftarrow\max(e_x,e_y),并把 y 拆除,一定不会更劣

那么我们只需要确定每个叶子的 e 大小即可

那么由外向内贪心即可

复杂度 O(n)O(n\log n)


5. AGC053C - Random Card Game [Keter] ✔️

题面

2n 个数,将这些数随机分进两个排列 a_1,a_2,\cdots,a_nb_1,b_2,\cdots,b_n

每一回合你可以选择 1\le k\le\min(|a|,|b|),并将 a_kb_k 中较小的从所在排列中删去,后面的递补

定义 f(a,b) 为将至少一个排列删空的最小回合数

f(a,b) 的期望,对 10^9+7 取模

1\le n\le 10^6

题解

Sol

考虑 f(a,b) 怎么求,不含有 2n 的排列一定会被删空,我们只要最小化含有 2n 的排列删的数量即可

不妨设 b 含有 2n,对于一个 a_i,设 j 为最小的满足 b_j>a_i 的数,那么有一个下界是 \max(j-i),事实上,这个下界也很容易取到

最大值,差分一下,转化成小于某数,具体地,定义 f(d) 表示所有 j-i\le d 的概率,那么要求的就是 2n-\sum_{d=0}^nf(d)

j-i\le d 成立当且仅当每个 a_i 都不是 a[1:i]\cup b[1:\min(n,i+d)] 的最大值,因此概率可以通过 \prod_{i=1}^{n-d}\frac{2i+d-1}{2i+d}\times\prod_{i=n-d+1}^n\frac{n+i-1}{n+i} 来计算

前缀积优化容易做到 O(n)O(n\log n)


6. AGC052C - Nondivisible Prefix Sums [Keter] ⭐

题面

给定 n 和质数 p,求有多少值域为 [1,p-1] 的整数序列 a_1,a_2,\cdots,a_n 满足:存在一种方式将 a 重排使得任意前缀和都不是 p 的倍数

答案对 998244353 取模

1\le n\le5000,2\le p\le10^8

题解

Sol

考虑什么样的序列 a 不满足条件

首先总和是 p 的倍数的情况是显然的,我们先不考虑

直觉上来说,一个数不能出现太多次,那么我们考虑众数,可以通过乘逆元使得序列中 1 的出现次数最多

结论:设序列中剩下的数为 b_1,b_2,\cdots,b_k,那么该序列不满足条件当且仅当 1 的个数超过 (p-1)+\sum_i(p-b_i)

必要性比较显然,考虑充分性如何证明

按照如下方式构建,一定能构造出解:

设当前众数为 x,当前前缀和为 cur,如果 p\nmid cur+x,那么直接在序列后面加上 x,否则任选一个其他数 y,在后面加上 y,x

这个算法出问题只有可能是第二步中,选不出其他的数 y,也即此时只剩 x,那么由于一开始 1 是众数,容易发现经过上面的算法,1 一直是众数

那么我们的序列形如 (p-1)\times1,b_1,(p-b_1)\times1,b_2,\cdots,b_k,(p-b_k)\times 1,而此时还有剩余的 1,违反了我们的假设,因此充分性得证

满足条件的情况不好统计,我们用和不为 p 倍数的序列,减去和不为 p 的倍数且众数出现次数过大的序列

可以假设众数为 1,然后把算出来的结果 \times(p-1)

那么我们需要知道 (p-1)+\sum_i(p-b_i),记到 dp 状态里即可

dp_{i,j} 表示 i 个数,\sum_i(p-b_i)=j,由于不合法,所以只用考虑 j\le n

那么前缀和优化一下就是 O(n^2)


7. AGC019E - Shuffle and Swap [Euclid]

题面

给定两个 01 串 A,B,保证 AB 中 0 和 1 的个数均相等

A 中的 1 的位置分别为 a_1,a_2,\cdots,a_kB 中的 1 的位置分别为 b_1,b_2,\cdots,b_k

对于 1,2,\cdots,k 的排列对 (p,q),定义 f(p,q) 为:对 i:1\rightarrow k,依次执行 \text{swap}(A_{p_i},A_{q_i}),得到的最后的 A

求有多少 (p,q) 满足 f(p,q)=B,对 998244353 取模

1\le|A|=|B|\le10000

题解

Sol

显然,可以只考虑 (a_i,b_i) 二元组 (1,1),(0,1),(1,0) 个数分别是多少,而 (0,1)(1,0) 的个数相等

这启发我们记到状态 dp_{i,j} 里,然后讨论第一步的交换

我们发现只有几个不能 O(1) 转移的情况,即 (1,1)(1,1) 交换,可能涉及许多 (1,1) 的数对

但这个转移只在 (1,1) 内部,因此我们可以再进行一个 O(n^2) 的 dp,求出 f_{i,j},从而把初值直接赋在 dp_{i,0}

复杂度 O(n^2)


8. BJWC2018 - Border 的四种求法 [Keter] ✔️

题面

给定一个字符串 sq 次询问,每次给出 l,r,求 s[l:r] 的最大 border

1\le n,q\le2\times10^5

题解

Sol

对于 $lr,其中 lcp(l,p) 表示以 l 和以 p$ 开头的后缀的 lcp

也就是说,对每个询问我们要找到最小的 p 满足 p>llcp(l,p)+p>r

把二叉的后缀树建出来,那么 lcp(l,p) 就转化为树上的 lca,并且所有后缀一定是树上的叶子

把询问离线,挂到 l 对应的叶子上,当询问的 l 变到 sa 序上的下一个时,lca 发生的变化是比较小的,因此我们可以考虑通过一次 dfs 处理询问

有一个 O(\sum siz) 的暴力:我们每次 dfs 到一个点 u,假设接下来要进左子树,就把所有右子树的 h_{lca}+p 值加到一个数据结构中,这样我们到叶子时就直接查询这个数据结构中满足条件的即可,而这个数据结构可以用一个下表为 p,值为 h_u+p 的线段树来实现

但是这样复杂度可能会很劣,考虑优化。

我们在 dfs 的过程中,会涉及将子树加入数据结构的操作:

  • 如果需要加的子树是轻儿子,我们就暴力加,总共会加 O(n\log n) 次,复杂度 O(n\log^2n)
  • 否则我们启发式合并得到子树内的所有 p 值的 set,然后由于对这棵子树,h_{lca} 是固定的,因此我们可以直接在这个 set 上查出最小的符合条件的 p,而这样的情况只会在我们进轻子树时发生,因此对每个叶子只用查 O(\log n) 次,复杂度是 O(n\log^2n) 的,启发式合并也是 O(n\log^2n)

因此总复杂度 O(n\log^2n)


9. WC2016 - 论战捆竹竿 [Keter] ✔️

题面

有足够多个竹竿,每个竹竿上都写着一个同样长为 n 的字符串 s

你有一个字符串 t,初始为空,你需要进行非零次以下操作:

  • t 的末尾插入不超过 n 个任意字符,使得这步操作后 t 的末尾 n 个字符组成的字符串是 s

求在 |t|\le w 的情况下,你能产生多少种 t 的长度

T 组数据。

1\le T\le5,1\le n\le5\times10^5,1\le w\le10^{18}

题解

Sol

问题相当于初始 |t|=n,每次我们可以选择一个 s 的 border x,然后 |t|\leftarrow|t|+x,问能得到多少 \le w|t|

w\leftarrow w-n,现在初始 |t|=0

这是一个经典的问题,可以用同余最短路解决,具体地,假设我们可以选择 +a_1,+a_2,\cdots,+a_n 中的操作,那么我们任选一个 +a_i,然后通过最短路计算出来,对每个 0\le k<a_i,能凑出来的最小的 \equiv k\pmod{a_i} 的数

但是这样复杂度是 O(n^2) 的。

考虑优化,有一个性质:长为 n 字符串的 border 长度可以表示为 O(\log n) 个值域不交的等差数列,这启示我们将一个等差数列放在一起处理

假设当前等差数列为 a,a+d,a+2d,\cdots,a+rd,通过直觉,我们感受到在 \bmod a 意义下进行会比较舒服,因此我们考虑如何解决 \bmod a 下的问题

那么我们每次相当于可以 +d,+2d,+\cdots,+rd,但由于建出来的边都是转圈的,所以不是很好做

观察到一件事情,对于 dis 最小的点,跨过它的转移一定不优,因为我们可以直接将其转变为从最小点出发的转移

那么可以将这个圈从 dis 最小的点处断开,而剩下的部分我们就可以用单调队列处理了

但是还有一个问题:不同等差数列的模数是不同的,我们需要一种能够切换模数的方法

假设现在是 \bmod a_0 意义下,我们需要切换到 \bmod a_1 意义下

f_i 表示 \bmod a_0 意义下 i 的最短路,g_i 表示 \bmod a_1 意义下 i 的最短路

由于有 +a_1 的操作,所以我们仍然只需要求出来能够访问的最小的 \equiv k\pmod{a_1} 的数即可

f_i 的意义是 f_i+ka_0 均可访问,那么我们可以将 g_{f_i\bmod a_1} 先用 f_i 更新,然后对于每个 i,从 g_ig_{(i+a_0)\bmod a_1} 转移,这样仍然可以从最小点处断开,重复一边上面的过程就可以做到换模数了

总复杂度 O(Tn\log n)


10. CF1864H - Asterism Stream [Keter] ⭐

题面

你有一个数 x,初始为 1,每一步操作你有 \frac12 的概率 x\leftarrow x+1,另 \frac12 的概率 x\leftarrow2x

t 次询问,每次给定 n,求 x\ge n 的期望操作次数,对 998244353 取模

1\le t\le100,1\le n\le10^{18}

题解

Sol

在讨论区看到一个有趣的做法,遂写。

首先将操作反过来,定义 f(i) 表示 x>n 的期望操作次数,那么有递推式:

但是这个我们不太会搞。

然后伟大的 amiya 先生说,你的矩阵里存 [f(n),f(\lfloor n/2\rfloor),f(\lfloor n/4\rfloor),\cdots,1],就可以转移了

具体地,n\rightarrow n+1 的转移只和 n 二进制表示中末尾 1 的个数有关系,用 M_{ct1(n)} 表示

我们可以用 O(\log^4n) 的时间,对每个 k,预处理出 \prod_{i=0}^{2^k-2}M_{ct1(i)},由此便可以在 O(\log^3n) 的时间内处理每个询问

那么最后的复杂度就为 O(\log^4n+t\log^3n)


11. 六省联考 2017 - 相逢是问候 [Euclid]

题面

给定长为 n 的数组 a_1,a_2,\cdots,a_n,以及常数 c,p,你需要维护 m 次操作,每次操作为以下两种中的一种:

  • 0 l r,对所有 i\in[l,r] 执行 a_i\leftarrow c^{a_i}
  • 1 l r,求 \sum_{i=l}^ra_i\bmod p

1\le n,m\le5\times10^4,1\le p\le10^8,0<c<p,0\le a_i<p

题解

Sol

根据扩展欧拉定理,一个数叠 O(\log p) 层次方塔后结果就不会变了,因此对于每个数只会有 O(\log p) 次变化

那么我们用一棵线段树来维护,每次对区间内仍变化的位置暴力修改

而每次修改需要求一遍次方塔,这可以用扩展欧拉定理解决,复杂度 O(\log^2p),加上分块快速幂就是 O(\log p)

那么总复杂度 O(m\log^2p)


12. 湖北省选模拟 2023 - 棋圣 [Euclid]

题面

给定一个 n 个点 m 条边的简单无向连通图,边有边权,初始有 k 个节点上分别有一个棋子,这些棋子可能是黑子或白子,颜色和棋子位置由输入给定

你可以进行若干次(可以为零)以下操作:

选择任意一个没有棋子的点 u,然后对每个棋子,设其在节点 v,你需要选择一条 v\rightarrow u 的简单路径,然后让这个棋子沿这条路径走一步(一个节点可能)

最后对于每一对有边直接相连的黑白棋子,你会获得这条边边权的收益

求最大收益

3\le n\le100,n-1\le m\le\frac12n(n-1),1\le k\le n-1,边权 \le10^5

题解

Sol

如果这张图有一个不为链的生成树,这显然是一个二分图,那么我们可以将所有点在度数 \ge3 的点上反复摩擦,一定将可以将所有在这棵树左部点上的棋子聚到一起,右部点上的棋子聚到一起

对于二分图,我们可以将这些点运送到边权最大的边两端,这样一定是最优的

如果不是二分图,我们可以用奇环来让黑点都在左部点,白点都在右部点,这样再运送到边权最大的边两端

但我们还需要考虑链的情况。

注意到链是二分图,并且棋子的相对顺序不会改变,并且相邻棋子之间的距离不增,那么我们可以进行一个 dp,令 f_{i,l,r} 表示链的前 i 个位置,第 i 个位置上有 [l,r] 的棋子,转移 O(n)

最后的复杂度就是 O(n^4)


13. 湖北省选模拟 2023 - 环山危路 [Keter]

题面

n 个点的竞赛图,m 次询问,每次询问形如:

给定 t,k,s_1,s_2,\cdots,s_k,求以 s_1,s_2,\cdots,s_k 为源点,t 为汇点,所有边容量都为 1 的最大流

1\le n\le3000,1\le m,\sum k\le30000

题解

Sol

一般最大流的模型不是很好考虑,因此我们转成最小割

设最后源点所处连通块为 S,汇点所处连通块为 T,那么由于任意两个点之间都有边,最小割的边数可以表示为 \sum_{u\in T}in_u-\frac12|T|(|T|-1)

也就是说,当 |T| 一定时,\sum_{u\in T}in_u 越小越好

那么每次询问,我们按 in 排序,贪心扫一遍对每个 |T| 求出最小的 \sum_{u\in T}in_u 即可

复杂度 O(n^2+nm)


14. 湖北省选模拟 2023 - 山路长环 [Safe]

题面

按如下方式定义 F(w_1,w_2,\cdots,w_k)

两个人在一个长为 k 的环上玩游戏,第 i 条边边权为 w_i,有一个棋子一开始在某个节点上,两个人轮流移动棋子,每一步可以将棋子移到其某个相邻点,然后将经过边的边权减少任意正整数,但需要保证边权始终非负

无法操作者输,F(w_1,w_2,\cdots,w_k) 的值为有多少棋子初始位置使得先手必胜

给定长为 n 的数列 a_1,a_2,\cdots,a_nq 次操作,每次操作为以下两种中的一种:

  • 1 x y,执行 a_x\leftarrow y
  • 2 l r,输出 F(a_l,a_{l+1},\cdots,a_r)

1\le n,q\le3\times10^5,0\le y,a_i\le10^6

题解

Sol

考虑当 w_1,w_2,\cdots,w_k 确定时,如何判断某个特定起点是否合法

观察到一件事情,如果当前棋子相邻的两条出边有一条边权为 0,则棋子下一步一定把另一条出边的边权变为 0,否则对手下一步可以让棋子再走回来,并将这条出边的边权变为 0

分情况讨论,首先是有边权为 0 的情况,这种情况我们可以从边权为 0 的位置拆开,转化成链上的问题

如果当前棋子位置的两边,有一边有奇数条边,那么先手直接走过去并把边权变为 0,就能保证获胜

而两边都是偶数条边的情况,后手可以采取类似的策略取得胜利

因此获胜的点数只和非零连续段的长度有关

考虑没有边权为 0 的情况,如果 k 是奇数,那么先手直接把一条边边权取成 0 一定必胜

如果 k 是偶数,那么谁先取出一条 0 边谁输,这意味着两个人都不能走边权为 1 的边,而这和我们直接把原问题的所有边权 -1 没有任何区别,所以我们可以将边权不断 -1,直到有边权为 0 的边为止,也就是我们只关心不为最小值的连续段的长度

这些信息是容易放到线段树上维护的,复杂度 O(n\log n)


  • Title: task5
  • Author: Flamire
  • Created at : 2023-08-03 00:00:00
  • Updated at : 2023-09-02 09:33:36
  • Link: https://flamire.github.io/2023/08/03/task5/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.2.2