Codeforces Round #682 (Div. 2) A~D
(题外话:本来要上紫了的,结果unrated...)
A. Specific Tastes of Andre
题目链接:https://codeforces.ml/contest/1438/problem/A
题目大意:让你构造一个长度为n的数组,其所有元素之和为n的倍数
题解:直接输出n个1即可
B. Valerii Against Everyone
题目链接:https://codeforces.ml/contest/1438/problem/B
题目大意:给定数组 b ,ai=2bi ,问是否存在两个不相同的a的子数组和相同
题解:
- 对于b数组若存在 (i,j) 使得 bi = bj,则必定存在。
- 若b数组互不相同,则从二进制来看,则不同的a的子数组至少有一位二进制不同,所以必定不存在(每一位仅有一个a可以取得,若两个数相同,则子数组必相等)
故题目转化为判断b数组是否有相同的数。
C. Engineer Artem
题目链接:https://codeforces.ml/contest/1438/problem/C
题目大意:给定一个n*m的二维数组,第 i 行第 j 列是 a[i][j] ,请你构造出二维数组 b , b[i][j] = a[i][j] or a[i][j] + 1 ,并且相邻的数不相同
题解:
类似于二分图染色
对于 (i+j)%2 的点必定互不相邻
我们对于所有 a[i][j] = x 的数,将 (i+j+x)%2 为 0 的数 + 1,因为对于 a[i][j] = x + 1 的数 (i+j+x+1)%2 为 0 的 +1 ,则只剩下 (i+j+x)%2 为 0 的,那么 x+1 只存在 (i+j+x)%2 为 0 的,必定不相邻
根据数学归纳,可以得知所有的数如此操作后必定能满足条件。
D. Powerful Ksenia
题目链接:https://codeforces.ml/contest/1438/problem/D
题目大意:给定长度为n的数组,每次可以选择 (i,j,k) ,令 ai = aj = ak = ai^aj^ak ,在最多n次操作内使得所有数相同
题解:
- 对于任意三个数,可以通过一次操作使其变成相同
- 对于两个相同的数和 x ,可以通过一次操作使其变为 x
- 操作并不改变异或和
然后我们考虑令所有数 = a1^a2^...^an(常用套路)
首先将前三个数变为相同,接着后面每两个数((4,5),(6,7)....)和前面一个数进行一次操作
这样因为前三个数是 a1^a2^a3 ,第三个和第四个第五个异或成 a1^a2^a3^a4^a5
后面同理
如果 (n-3)%2 为 0 ,则 an 即为 a1^a2^...^an ,且前面均为两个一组的相同的数,每次操作将两个一组的相同的数和n进行异或
如果 (n-3)%2 不为 0 ,则还剩一个数 an ,这里我们证明下为什么这种情况 a1^a2^...^an 不为 0 的时候无解,若 (n-3)%2==1 ,则 n=3+2k+1=4+2k 为偶数
对于相同的数如果有 k 个,可以将其化简为 k%2 个,因为 2 个相同的数一定可以和 x 变为 x ,所以可以等价为每个数最多只有一个,且仍然是偶数个
若最后可以化为所有数相同,则所有数异或和为 0 ,因为操作并不会导致异或和改变,因此这种情况当且仅当所有数异或和为 0 有解。
当有解时同第一种情况一样做就行了。
操作次数为很显然符合题意
E.Yurii Can Do Everything
我不会qwq

浙公网安备 33010602011771号