A.Increasing and Decreasing
制造一个序列,序列从 x 开始,到 y 结束,一共 n 个数。满足
构造
*579
直接从 y 开始构造一个倒序构造一个递减序列,使每次减少的值在不重复的情况下尽可能小
B. Swap and Reverse
有一个长度为 n 的字符串 s,可以进行以下任一操作无限次:
-
交换相隔一位的字符,即交换 si 和 si+2 的字符
-
反转一段长度为 k 的区间
输出通过上述操作所能获得的最小字典序的字符串
思维
*1067
如果只考虑操作 1,那么我们可以将字符串的奇数位和偶数位上字符分别排序
如果使整个字符串的字典序最小,只需要判断能否将奇数位上的字符和偶数位上的自符交换位置即可。
判断 k 的奇偶性,当 k 为奇数时无法通过反转来将奇数位上的字符和偶数位上的自符交换位置,那么答案为对原字符串奇数位上的字符和偶数位上的字符分别排序。当 k 为偶数时,将整个字符串进行排序即可。
C. Divisor Chain
给一个数 x,通过下列操作将 x 变为 1
- 选择一个数 d 满足 d 是 x 的因数,令 x=x−d
注意不能使用同一个 d 多于两次
输出操作中的中间过程
二进制拆分
*1294
开始对着最大质因数想了至少1小时
因为 x 的 lowbit 总是 x 的因数,且二进制中的每一位只需要操作一次,所以可以
D. Matrix Cascade
有一个大小为 n×m 的01矩阵。将矩阵中所有的元素变为 0。每次操作可以将 (i,j) 和 (x,y)x>i,x−i≥∣y−j∣ 中的元素反转
输入一个矩阵,问最小需要操作几次才能将矩阵变为全 0
二维差分
1620
如果要反转某个位置,那么反转的区间就是从这个点开始向下的三角形
最小操作次数的解肯定是唯一的,求解的重点在于如何快速去操作这个三角形
记原来的矩阵是 a[i][j],之前的操作对 (i,j) 的影响为 b[i][j]
遍历每个点 (i,j),对每个点都需要判断:
-
如果 b[i][j]=1,则说明之前有个反转操作对 (i,j) 有影响,需要将 a[i][j] 进行反转
-
如果现在 a[i][j]=1,则我们还说明需要进行一次反转 ans←ans+1
之后需要判断当前位置对之后的影响
-
如果当前位置 (i,j) 存在影响(d[i][j]=1)时
-
如果当前位置 (i,j) 不存在影响 (d[i][j]=0) 时
很容易发现这可以通过 d[i][j]←d[i][j]⊕a[i][j]
然后下传标记,当 d[i][j]=1 时需要下传标记。如果直接传递影响可能会难以统计,可以采用传递影响和直接操作两种方式
因为只有影响向下传递,而操作并不会,这样简化了传递时的操作
需要注意,像上图中橙色部分会被左右两个各传递一次,因此我们还需要再进行一次传递(黑色箭头),使d[i+2][j]变成奇数次操作
另外像下图情况
如果有黑色箭头的传递,那么橙色部分被更新了 2 次,所以还需要判断如果当前 (i,j) 位置,如果 (i+1,j+1) 或者 (i+1,j−1) 超过了边界,就不需要用黑色箭头对橙色块进行传递(或者再进行一次传递抵消掉)
E. Guess Game
Carol 有一个由非负整数组成的序列 s,她要和 Alice 和 Bob 玩 Guess Game
在游戏中,Carol 将随机选两个下标 ia 和 ib,并令 a=sia, b=sib,ia 和 ib 可能重合
Carol 将:
Carol 不会告诉 Alice 和 Bob 任何有关 s 的信息
游戏开始后,Alice 和 Bob 轮流进行猜测。Alice 先手。他们的目标都是找到 a<b,a>b 或 a=b 公式哪个是正确的
在每轮猜测中,每个玩家可以进行以下一种操作:
Alice 和 Bob 都能听到对方的回答,并根据回答作出自己的判断。Alice 和 Bob 足够聪明,且只会在完全确定答案的时候回答 知道
要求计算游戏所进行回合数的期望值,输出答案对 998244353
取模
*2113
二进制拆分
分治
很奇妙的一道题
先来看样例的几种情况
A | A∣B | B |
---|
11 | 11 | 10 |
IDK | | |
| | A 的最高位是 1,B 的最高位也是 1。第二位小,所以 A>B |
A | A∣B | B |
---|
11 | 11 | 11 |
IDK | | |
| | A 的最高位是 1,B 的最高位也是 1。B 的次高位仍是 1,不能判断大小关系, IDK |
B 的最高位和次高位都是 1,因此 A=B | | |
也就是说如果先手具有最高位,它就无法判断大小关系(因为他无法判断对方最高位是否为 1),这时候先手回答 不知道
。后手如果这一位是 0
,则大小关系可判断。如果这一位是1,可以先把先手和后手的最高位都删掉,交换先后手重新判断。
这样我们就获得一个 O(log31) 的计算轮数的方式
但是如果要判断一个序列中轮数的期望,仍然需要 O(n2) 次判断,对于这个题是数据范围来说是 Unacceptable 的,因此还需要从数据特征进一步分析
因为轮数和两个数的高位有关,可以考虑将这个序列根据最高位的位置分为 31 ,同一组中最高位的位置相同。
-
对于不同组之间选两个数,那么他们由于最高位不同,只需要 2+1 轮即可结束(高位先手和低位先手)。对于所有元素来说就是 (cnt[a]∗(num−cnt[a]))∗(2+1) 轮
-
对于同一组中选两个数,由于最高位相同,所以需要去掉最高位再进行判断。可以根据次高位的位置,重新将其分组,并计算选择不同组和同组的轮数进行相加,直到一组中全为 0