A - 加减
题目描述
给定一个长度为 n 的序列 an,一个正整数 m,以及一个非负整数 k,下标从 0 开始的无穷序列 b 如下所示:
你可以对序列 a 执行以下操作:
b
i
=
{
(
−
1
)
i
(
k
i
)
0
≤
i
≤
k
0
i
>
k
b_i=\begin{cases} (-1)^i\tbinom{k}{i} & 0\leq i \leq k \\ 0&i>k\\ \end{cases}
bi={(−1)i(ik)00≤i≤ki>k
选择两个后缀,其中一个在模 m 意义下加上序列 b,另一个在模 m 意义下减去序列 b,形式化描述如下:
- 选择两个整数 x, y 满足 1 ≤ x , y ≤ n 1\leq x,y\leq n 1≤x,y≤n,注意可以 x = y ;
- 将 a x , a x + 1 , . . . , a n a_x,a_{x+1},...,a_n ax,ax+1,...,an修改为 ( a x + b 0 ) m o d m , ( a x + 1 + b 1 ) m o d m , . . . , ( a n + b n − x ) m o d m (a_x+b_0)\ mod\ m,(a_{x+1}+b_1)\ mod\ m,...,(a_n+b_{n-x})\ mod \ m (ax+b0) mod m,(ax+1+b1) mod m,...,(an+bn−x) mod m;
- 将 a y , a y + 1 , . . . , a n a_y,a_{y+1},...,a_n ay,ay+1,...,an修改为 ( a y + b 0 ) m o d m , ( a y + 1 + b 1 ) m o d m , . . . , ( a n + b n − y ) m o d m (a_y+b_0)\ mod\ m,(a_{y+1}+b_1)\ mod\ m,...,(a_n+b_{n-y})\ mod \ m (ay+b0) mod m,(ay+1+b1) mod m,...,(an+bn−y) mod m。
注意操作3.是在操作2.修改完后的数组上进行,执行以上三步算一次操作。要求操作结束后序列 a 为全0序列,输出最少操作次数,若无解输出-1。
( k i ) \tbinom{k}{i} (ik): k 个不同的球里取 i 个的取法方案数。
a mod b = a - ⌊ a b ⌋ \lfloor \frac{a}{b}\rfloor ⌊ba⌋b,其中 ⌊x⌋表示对 x 下取整
输入描述:
每个测试点包含多个测试用例;
第一行一个整数 T (1≤T≤ 1 0 5 10^5 105)—表示测试用例的数量 。每个测试用例的格式如下:
第一行三个整数 n, k, m (1≤n≤ 1 0 5 10^5 105 , 1≤k≤200,1≤m≤ 1 0 9 10^9 109)—分别表示序列长度以及给定的 k 和模数;
第二行 n 个整数 an (0≤ a i a_i ai<m)—表示给定的序列;
保证所有测试用例的 n 之和不超过 1 0 5 10^5 105。
输出描述:
有 T 组输出,每组输出的格式如下:
第一行如果答案存在则输出最少操作次数,否则输出-1;
tag
思路
求k次前缀和,转化为 a x a_x ax加1 , a y a_y ay减1,若和模m非0则无解,对求完前缀和的数组排序,找到一个分界点,分界点前减到0,分界点后加到m,加和减的总和相同,答案为加的总和。时间复杂度O(nk+nlogn)
C - 牛哥与AI
题目描述
这天,牛国神君牛哥要求他的臣子壕哥写一篇赞美自己功绩的文章。
壕哥很担心自己写不好惹得牛哥龙怒,该怎么办呢?壕哥想到了最近在牛国网络大火的AICharGPT,他决定先用AI生成一篇文章,然后进行少量修改。
AI将会生成一篇文章(用01串来表示),随后,壕哥将对这篇文章进行修改,他所能做的修改如下:
- 1.选择一个01串中的位置,将该位置的0或1取反
- 2.选择一个01串中的位置,将该位置的0或1删除
- 3.选择一个01串中的空位,在该空位上插入一个0或者1
为了不将文章改乱,壕哥决定刚好进行两次修改,并且修改后的文章和原文章的长度要相等。
注意,壕哥是个完美主义者,如果被你统计的文章中存在能够被壕哥以1次修改甚至更低的次数获得的文章,那么他将非常不高兴,所以请不要做删除数字再加回去这种事哦。
现在壕哥想知道,他所能做的修改能够生成多少篇本质不同的文章(本质不同文章指修改后的两个01串不相等),这个问题太难了,壕哥决定向你求助。
输入描述:
输入包括一行,包括一个01串 s (2≤s.size()≤1000)。
输出描述:
输出包括一行,包括一个整数 k,表示的是壕哥根据 s 以及修改规则能够产生的本质不同01串数量。
tag
思路
数据范围是1000以内,标程是O( n 2 n^2 n2)的,但是没有刻意卡O( n 2 l o g n n^2logn n2logn)的做法。
我们可以O( n 2 n^2 n2)枚举左右位置,然后对两个位置进行转换、左删右增、左增右删这几种操作。
可以考虑哈希加set对01串进行处理,对于每个01区间我们都要进行哈希,虽然有许多重复,但是依然很容易造成哈希冲突,可以使用双哈希等进行优化,然后再在set中删除那些只进行一次甚至更少次数转换就能得到的字串,常数写得小的情况是能通过该题的。
我们这里还是来讨论一下造成重复的串是哪些:
首先,我们把连续的一段1或者0称为一个游程。
- 对于转换操作,其实很容易得出存在 C n 2 C_{n}^2 Cn2种选择方式
- 对于增删操作,由于删除和增加操作会造成长度的删减,因此一定是一个删除操作和一个增加操作,先假设删除位置为i,在增加位置为j的后面(i<j),那么这个操作就相当于选择一个区间删除头部后全部左移然后在尾部添加数字。
我们可以发现以下性质:
删除游程中的一个数字和删除游程开头的一个数字影响是一样的,因此我们枚举删除的区间可以一段一段地枚举。
在游程中增加一个相同的数字和增加在其末尾或开头影响是一样的,因此我们添加的数字只需要保证和前面那个数字相异
假设我们选中的区间只有两个游程,例如000111,那么增删之后就会变为001110,可以发现只相当于转换了两个位置,因此我们枚举的区间游程要大于2,并且只要游程是大于2的区间,就必定能产生一个新的01串
但是这样还是比答案大一些,如果区间是类似于010101这种每个游程只有一个数字的区间,那么左删右增和左增右删获得的串是一样的,这就是被我们统计重复的串,需要删除。
D - Alex的诅咒
题目描述
Alex被诅咒了,他总会把筷子用反,太恐怖了,不是吗?但是好运的是,有一个魔法师愿意帮他消除这个诅咒,不过魔法师遵守公平法则,所以他需要Alex来解决一个他在魔法阵绘制中遇到的问题。Alex不太会,所以他找到了你,希望你能帮帮他,基于公平法则,如果你帮助他解决了,他将奖励你一个AC和一个大大的气球。
魔法师的问题是这样的,他有 n 个神奇的魔法石,它们是有"灵性"的。当魔法师将魔法石掷于地面,魔法石所形成的形状蕴含着一些关于魔法阵的提示,但是魔法阵是有要求的,最多只能用到 m 个魔法石,如果多用的话会有失控的风险,魔法师告诉Alex,魔法阵的魔力取决于魔法石构成的最小凸包的面积。魔法师当然想魔法阵的魔力最大,他想知道这个值是多少,你可以帮帮魔法师,也帮帮我们可怜的Alex吗?
标准化来讲,我们此时有 n 个点,我们需要从中选取最多 m 个点,使其形成的最小凸包面积最大,输出最大面积的两倍即可。保证所有点不会共线。
输入描述:
第一行有两个整数 n, m (3≤n≤70,3≤m≤n);
接下来n行,每行两个整数 x,y (− 1 0 5 10^5 105≤x,y≤ 1 0 5 10^5 105);
保证所有点不会共线;
同一行的整数使用空格隔开。
输出描述:
输出一个整数,表示最大面积的两倍。可以证明最后的结果一定是一个整数。
tag
思路
idea来自于三角剖分求多边形面积这个知识点,首先可以证明得到,如果需要满足题目要求,那么选点都应该再凸包上,所以我们需要先求凸包,然后在凸包上进行选择,具体选择方法使用DP,我们将前一个点以及总共选取点数封装成一个状态进行DP转移,注意需要枚举所有第一个点进行DP,为了避免计算几何烦人的精度问题,选择了输出凸包面积的两倍这个技巧。
E - 序列变换
题目描述
给定一个长度为 n 的序列a=( a 1 a_1 a1,⋯, a n a_n an),你可以对序列执行以下操作:
- 选择两个整数 x, y 满足 1≤x,y≤n,注意可以 x=y;
- 将 a x a_x ax修改为 a x ⊕ a y a_x⊕a_y ax⊕ay。执行以上两步算一次操作,要求操作结束后序列 a 严格升序,即 ∀ 1 ≤ i < n , a i < a i + 1 ∀1≤i<n,a_i<a_{i+1} ∀1≤i<n,ai<ai+1且操作次数不超过 ⌈ l o g 2 n ⌉ 2 + 3 n ⌈log_2n⌉^2+3n ⌈log2n⌉2+3n。判断是否有满足以上要求的答案,若有多种答案符合条件则给出任意一种即可。
x⊕y : x 和 y 按位异或
⌈x⌉ : x 向上取整,
输入描述:
每个测试点包含多个测试用例;
第一行一个整数T (1≤T≤ 1 0 5 10^5 105)—表示测试用例的数量 。每个测试用例的格式如下:
第一行一个整数 n (1≤n≤ 1 0 5 10^5 105 )—表示序列长度;
第二行 n 个整数 a 1 a_1 a1,⋯, a n a_n an(0≤ a i a_i ai< 2 30 2^{30} 230)—表示给定的序列;
保证所有测试用例的 n 之和不超过 1 0 6 10^6 106。
输出描述:
有 T 组输出,每组输出的格式如下:
第一行如果答案存在则输出 “YES” (不含引号) 否则输出 “NO”(不含引号);
若答案存在,还需输出:
第二行一个整数 m ( 0 ≤ m ≤ ⌈ l o g 2 n ⌉ 2 + 3 n ) m (0≤m≤⌈log_2n⌉^2+3n) m(0≤m≤⌈log2n⌉2+3n)—你的操作次数;
接下来 m 行每行两个整数 x i x_i xi, y i y_i yi(1≤ x i x_i xi , y i y_i yi≤n)—表示第 i 次操作选择的整数。
tag
思路
操作结束最后每个数是原始数组若干个数的异或和,可以计算判断原始数组能有多少种不同的子集异或和判断是否有解:可以将所有数插入线性基,设k为线性基里的元素的个数,则有 2 k 2^k 2k种不同的子集异或和,若 2 k ≥ n 2^k≥n 2k≥n 则有解。主体思路是先用原数组构造出线性基,然后构造出子集异或和前 n 小。可以用不超过 3 0 2 30^2 302次操作构造一个行简化阶梯形矩阵,实际上只用成功插入 ⌈ l o g 2 n ⌉ ⌈log_2n⌉ ⌈log2n⌉个元素即可停止,因此可用不超过 ⌈ l o g 2 n ⌉ 2 ⌈log_2n⌉^2 ⌈log2n⌉2次操作构造出能生成至少 n 个数的基。然后可以用这个基构造第k小,具体方法:可用3次操作交换一对数,把构造出来的基移动到2的幂次方的位置上,然后其他位置可用一次操作清零,2次操作递推构造出第k小。总操作次数比 ⌈ l o g 2 n ⌉ 2 + 3 n ⌈log_2n⌉^2+3n ⌈log2n⌉2+3n略少,时间复杂度O(n*30)。
F - 魔王大人的打工日常
题目描述
魔王撒旦最近在730餐厅打工, 今天店长交给了魔王大人 n 个碟子, 每个碟子大小都不一样, 且大小都在区间[1,n]内, 刚开始碟子的排列是 P=(1,2,⋯,n−1,n), 排列中每个数代表碟子的大小, 现在店长要求魔王大人按照给定顺序对碟子进行重新排列, 有 m 次操作, 每次操作要求对在第 l 个到第 r 个碟子这个区间的碟子进行 k 次循环右移.
魔王大人前几天在勇者艾米莉亚那里学到了关于碟子排列的一些知识, 设 a i a_i ai为第 i 个碟子的大小, 我们称一个逆序对为碟子的排列中满足 a i a_i ai> a j a_j aj且i<j 的盘子二元组(i,j), 业界普遍认为逆序对数为偶数的碟子排列是一个好排列, 逆序对数为奇数的碟子排列是一个差排列. 现在魔王大人想在每一次无聊的操作后, 判断一下目前碟子的排列是不是一个好的排列, 但是这太费时间了, 于是麻烦你写个程序在每次操作后判断一下碟子的排列是不是一个好排列.
对在第 l 个到第 r 个碟子这个区间的碟子 P ′ = ( p l , p l + 1 , . . . , p r − 1 , p r ) P^′=(p_l,p_{l+1},...,p_{r−1},p_r) P′=(pl,pl+1,...,pr−1,pr)的一次循环右移操作使得 P ′ = ( p r , p l , p l + 1 . . . , p r − 1 ) P ^′=(p_r,p_l ,p_{l+1}...,p_{r−1}) P′=(pr,pl,pl+1...,pr−1).
输入描述:
第一行两个整数 n , m (1≤n,m≤
1
0
5
10^5
105), 表示碟子的个数和操作次数;
第二行至第m+1行,\ 每行给定操作区间左端点l和右端点r 和循环右移次数k,保证l<=r且k>0.保证k在int范围内.
输出描述:
有 m 行输出,第 i 行输出代表第 i 次操作后的碟子排列的好坏,如果排列为一个好的排列输出"hao",否则输出"huai".
tag
思路
容易知道,交换相邻两个碟子,逆序对奇偶性变化,一次循环右移相当于最后面的元素交换r-l次,所以奇偶性变换只和交换区间长度r-l+1的奇偶性和循环右移次数k有关,当k为奇数,r-l为奇数时,逆序对偶性变化。
G - Ring Fit Adventure
题目描述
今年是疫情结束的第一年,Shima Rin想起了疫情期间常玩的健身环大冒险,她准备回味一波,于是她来到了打箱子DLC。
在她的面前总共有 n×m 个箱子堆叠排列(左上(1,1),右下(n,m)),她需要推压普拉提圈,利用气流击破箱子以获得分数。
因为是DLC,分数的计算方式发生了些许变化:给出了第一行每个箱子的价值。从第二行开始,第一列的箱子等于其上方箱子的价值,其他的每个箱子的价值是它正上方箱子的价值xor它正上方左边箱子的价值。
形式化描述:设 f[i][j] 表示第 i 行第 j 列的箱子的价值,a[i] 表示第一行第 i 列箱子的价值,则:
f [ i ] [ j ] = { a [ j ] i = 1 f [ i − 1 ] [ j ] i > 1 且 j = 1 f [ i − 1 ] [ j ] ⊕ f [ i − 1 ] [ j − 1 ] i > 1 且 j > 1 f[i][j]=\begin{cases} a[j] & i=1 \\ f[i-1][j]&i>1且j=1\\ f[i-1][j]⊕f[i-1][j-1]&i>1且j>1\\ \end{cases} f[i][j]=⎩ ⎨ ⎧a[j]f[i−1][j]f[i−1][j]⊕f[i−1][j−1]i=1i>1且j=1i>1且j>1
其中 ⊕ 表示按位异或。
Shima Rin非常中意最右边一列的箱子,你能告诉她这些箱子的价值吗。
输入描述:
第一行两个整数 n,m (1≤n,m≤ 1 0 6 10^6 106)------表示有 n 行 m列箱子;
接下来一行 m 个整数 a[i] (0≤a[i]≤ 1 0 9 10^9 109)------代表第一行的箱子价值。
输出描述:
n 个整数,即最后一列箱子的价值。
tag
思路
为了方便,考虑行从第0行开始,但列仍然是从第1列开始。单独考虑第0行对于答案列的贡献,可以发现 f[0][j] 对 f[i][m] 的贡献次数是 ( i m − j ) \tbinom{i}{m-j} (m−ji)解释如下
- 思路1:对答案列贡献次数就是从(0,j)到(i,m)每次只能向下或向右下走,路径的数量,总共有i步,需要向右下走m-j步,即 ( i m − j ) \tbinom{i}{m-j} (m−ji).
- 思路2:观察给定的递推式,发现是异或形式的杨辉三角递推式,也可以得出同样的结论。
由于要求的是xor,只需要关心贡献次数奇偶性,即 ( i m − j ) m o d 2 \tbinom{i}{m-j}\ mod\ 2 (m−ji) mod 2
由Lucas定理可知, ( i m − j ) m o d 2 = ( i m o d 2 ( m − j ) m o d 2 ) ⋅ ( ⌊ i 2 ⌋ ⌊ m − j 2 ⌋ ) ( m o d 2 ) \tbinom{i}{m-j}\ mod\ 2=\tbinom{i\ mod\ 2}{(m-j)\ mod\ 2}\cdot\tbinom{\lfloor\frac{i}{2}\rfloor}{\lfloor\frac{m-j}{2}\rfloor}(\ mod\ 2) (m−ji) mod 2=((m−j) mod 2i mod 2)⋅(⌊2m−j⌋⌊2i⌋)( mod 2),考虑第一个组合数乘数,当括号下面不超过上方才为1。
所以,第一行某元素j对第i个答案的贡献次数为奇当且仅当m-j在二进制下是i的子集.
于是问题转化为了将第一行下标反转,给定集合价值,求1-n子集异或合的问题.即sos-dp问题. 直接枚举子集和使用容斥复杂度都不符合要求.
我们设 dp[mask][i] 代表 mask 子集种只有右边 i 位(下标从0开始)不同的集合状态,上述问题中即子集异或和。那么我们根据第i位的状态不同,转移方程不同,具体如下:
当第i位为0时,显然子集集合没有改变 dp[mask][i]=dp[mask][i−1]
当第i位为1时,dp[mask][i]=dp[mask][i−1]⊕dp[mask⊕2 i][i−1]
即可使用O( d ∗ 2 d d∗2^d d∗2d)的复杂度解决这个问题,其中d是二进数位数。
H - 合成大西瓜
题目描述
cccd 最近在玩一款游戏叫"合成大西瓜",为了简化题目,作如下描述:
现在有 4 种球,分别是一级球,二级球,三级球和四级球,它们的体积都是一样的。有一个垂直的管道,上端开口,下端封底,初始管道为空,管道的宽度只能容纳一个球,管道长度是无限的。当两个一级球相邻时,就可以变成一个二级球,当两个二级球相邻时,就可以变成一个三级球,当两个三级球相邻时,就可以变成一个四级球。每次操作都会从管道上方随机放入一个一、二或三级球,概率都是三分之一。当游戏出现一个四级球的时候,就代表胜利。
xm 经过 998244353 秒的思考,很快就给出了正确答案, cccd 就觉得这道题太简单了,所以他决定加大难度。
现在 cccd 已经将游戏玩到一个局面了,他想知道在此局面上达到胜利所需操作的期望次数,你能告诉他吗?
输入描述:
输入数据一共包含两行:
第一行一个整数 n (0≤n≤ 1 0 5 10^5 105)—代表当前局面的球数;
第二行一共 n 个整数,代表管道里面从下到上的球的种类,数据保证所给的局面不会有同等级的球相邻。
输出描述:
输出一个实数,代表给定局面上达到胜利所需操作的期望次数,选手输出与标准输出的相对误差或绝对误差小于 1 0 − 4 10^{-4} 10−4即视为正确。
tag
思路
当一个等级高的球在一个等级低的球之上的话,等级低的球就没用了,所以可以忽略掉
所以虽然给的n很大,看似状态很多,但其实只有8种
设:
f(0)表示现在没有球,为了达到胜利仍需操作的期望次数
f(1)表示现在有1个一级球,为了达到胜利仍需操作的期望次数
…
f(321)表示现在从下往上依次是三级球、二级球、一级球,为了达到胜利仍需操作的期望次数
然后可以列出以下方程组:
f ( 0 ) = 1 3 f ( 1 ) + 1 3 f ( 2 ) + 1 3 f ( 3 ) + 1 f ( 1 ) = 1 3 f ( 2 ) + 1 3 f ( 2 ) + 1 3 f ( 3 ) + 1 f ( 2 ) = 1 3 f ( 21 ) + 1 3 f ( 3 ) + 1 3 f ( 3 ) + 1 f ( 3 ) = 1 3 f ( 31 ) + 1 3 f ( 32 ) + 1 f ( 21 ) = 1 3 f ( 3 ) + 1 3 f ( 2 ) + 1 3 f ( 3 ) + 1 f ( 31 ) = 1 3 f ( 32 ) + 1 3 f ( 2 ) + 1 3 f ( 3 ) + 1 f ( 32 ) = 1 3 f ( 321 ) + 1 3 f ( 3 ) + 1 f ( 321 ) = 1 3 f ( 2 ) + 1 3 f ( 3 ) + 1 \ \ \ \ f(0)= \frac{1}{3}f(1)+\frac{1}{3}f(2)+\frac{1}{3}f(3)+1\\ \ \ \ \ f(1)=\frac{1}{3}f(2)+\frac{1}{3}f(2)+\frac{1}{3}f(3)+1\\ \ \ \ \ f(2)=\frac{1}{3}f(21)+\frac{1}{3}f(3)+\frac{1}{3}f(3)+1\\ \ \ \ \ f(3)=\frac{1}{3}f(31)+\frac{1}{3}f(32)+1\\ \ \ f(21)=\frac{1}{3}f(3)+\frac{1}{3}f(2)+\frac{1}{3}f(3)+1\\ \ \ f(31)=\frac{1}{3}f(32)+\frac{1}{3}f(2)+\frac{1}{3}f(3)+1\\ \ \ f(32)=\frac{1}{3}f(321)+\frac{1}{3}f(3)+1\\ f(321)=\frac{1}{3}f(2)+\frac{1}{3}f(3)+1 f(0)=31f(1)+31f(2)+31f(3)+1 f(1)=31f(2)+31f(2)+31f(3)+1 f(2)=31f(21)+31f(3)+31f(3)+1 f(3)=31f(31)+31f(32)+1 f(21)=31f(3)+31f(2)+31f(3)+1 f(31)=31f(32)+31f(2)+31f(3)+1 f(32)=31f(321)+31f(3)+1f(321)=31f(2)+31f(3)+1
稍微解释第一个式子,这个式子就是一开始是没有球的,因为会平均概率的放进一个一、二或三级球,所以有1/3的机会进入f(1)状态,有1/3的机会进入f(2)状态,有1/3的机会进入f(3)状态,最后的加1是代表当前操作一次…后面的式子同理
通过高斯消元可以求出每一种状态的解,所以只需要求出初始序列是以上8种中的哪一种,输出对应答案即可。