Atcoder Begining Contest 367
A
-
题意:
在
B
时刻睡觉,C
时刻起床,问A
时刻是否在睡觉 -
题解:
如果 B ≤ C B \leq C B≤C,判断 A ∈ [ B , C ] A \in [B, C] A∈[B,C]
如果 B > C B > C B>C,判断 A ∈ [ B , 24 ] ∪ [ 0 , C ] A \in [B, 24] \cup [0, C] A∈[B,24]∪[0,C]
B
-
题意:
将一个小数末尾的
0
去掉 -
题解:
从后往前删
0
即可,记得如果小数位全是0
的话也要删除小数点
C
-
题意:
找到所有满足以下条件的数列
- a i ∈ [ 1 , R i ] a_i \in [1, R_i] ai∈[1,Ri]
- ∑ a i ≡ 0 ( m o d k ) \sum a_i \equiv 0(\bmod\ k) ∑ai≡0(mod k)
-
题解:
爆搜
D
-
题意:
一个环形区域,从 i i i 号点走到 i + 1 i+1 i+1 号点的花费位 a i a_i ai,从 n n n 号点走到 1 1 1 号点花费为 a n a_n an,求有多少点对 ( i , j ) (i,j) (i,j) 使得从 i i i 号点走到 j j j 号点花费为 k k k 的倍数
-
题解:
先考虑 i < j i < j i<j,从 i i i 号点走到 j j j 号点的花费为 s u m j − s u m i − 1 sum_j-sum_{i-1} sumj−sumi−1( s u m sum sum 表示前缀和),只需要拿一个桶 c n t p cnt_p cntp 记录所有 s u m i m o d k = p sum_i \bmod \ k=p sumimod k=p 的个数,即可统计答案
再考虑 i > j i > j i>j 的情况,发现花费为 s u m n + s u m i − s u m j − 1 sum_n+sum_{i}-sum_{j-1} sumn+sumi−sumj−1,再用上面的方法扫一遍即可
E
-
题意:
给定长度为 n n n 的数组 A A A 和 X X X,定义一次操作为 B i = A x i B_i=A_{x_i} Bi=Axi,然后再交换数组 A A A, B B B,求 k ( k ≤ 1 0 18 ) k(k \leq 10^{18}) k(k≤1018) 次操作后的 A A A 数组
-
题解:
倍增,求出 t o x , i to_{x,i} tox,i 表示位置 x x x 经过 2 i 2^i 2i 次交换后的数字在最初是哪个位置的
将 k k k 二进制分解,之后每个位置分别处理即可
F
-
题意:
给定数列 A A A, B B B,每次询问 A A A 的子数列 A l ∼ r A_{l\sim r} Al∼r 和 B B B 的子数列 B L ∼ R B_{L\sim R} BL∼R 是否相同
-
题解:
k k k 进制异或哈希裸题
听说不用异或,随机出来一个哈希表 H i H_i Hi,使 A i = H [ A i ] A_i=H[A_i] Ai=H[Ai], B i = H [ B i ] B_i=H[B_i] Bi=H[Bi],直接求子段和是否相等也行
G
-
题意:
给定数列 A A A,对于 A A A 中的任何一个长度为 m m m 的倍数的子序列,令其价值为这个子序列异或和的 k k k 次方,求 A A A 所有长度为 m m m 倍数的子序列的价值
-
题解:
在质量如此差的一场 A B C ABC ABC,最后竟然放了一个这样的神题
首先理解一下进行异或 f w t \rm fwt fwt 的本质, f w t A , i fwt_{A,i} fwtA,i 表示 ∑ i ∘ j = 0 A j − ∑ i ∘ j = 1 A j \sum\limits_{i\circ j=0} A_j - \sum\limits_{i\circ j=1} A_j i∘j=0∑Aj−i∘j=1∑Aj,此时有 f w t A × f w t B = A ⊕ B fwt_{A} \times fwt_{B} = A\oplus B fwtA×fwtB=A⊕B
令 B i B_i Bi 表示 A j = i A_{j}=i Aj=i 的元素个数,将 B B B 数组进行 f w t fwt fwt 变化后,枚举每一位 f w t B , i fwt_{B,i} fwtB,i,就可以得到 a j ∘ i = 0 a_j\circ i=0 aj∘i=0 的个数和 a j ∘ i = 1 a_j\circ i =1 aj∘i=1 的个数,实质上,就是有一堆数对 f w t B , i fwt_{B,i} fwtB,i 的贡献是 1 1 1,其他的贡献为 − 1 -1 −1
这样,在 A A A 数组选取子序列的问题就可以转化为在 f w t B fwt_B fwtB 上进行操作了
先不考虑子序列长度为 m m m 的倍数这一限制
这样的话做法大概是枚举 f w t B fwt_{B} fwtB 的每一位,如果 f w t B , i = n fwt_{B,i}=n fwtB,i=n 的话将其变成 2 n 2^n 2n,否则将其变成 0 0 0,之后将新数组 i f w t \rm ifwt ifwt 即可,最后得到的数组第 i i i 为就表示子序列异或和等于 i i i 的个数。因为子序列选取偶数个贡献为 − 1 -1 −1 的数,这个子序列的价值为 1 1 1,否则价值就是 − 1 -1 −1
考虑加上选取子序列长度必须为 m m m 的倍数这一条件
令 f i , k f_{i,k} fi,k 表示总共有 i i i 个 1 1 1,选取了 k + t × m k+t\times m k+t×m 个 1 1 1 的方案数, g i , k g_{i,k} gi,k 表示有 i i i 个 − 1 -1 −1,选取了 k + t × m k+t\times m k+t×m 个 − 1 -1 −1 的贡献和(贡献指 ( − 1 ) k + t × m (-1)^{k+t\times m} (−1)k+t×m),其中 t t t 表示任意非负整数
枚举 f w t B , i fwt_{B,i} fwtB,i,求出原数组有 k 1 k_1 k1 个贡献为 1 1 1 的数, k 2 k_2 k2 个贡献为 − 1 -1 −1 个数,更新 f w t i fwt_{i} fwti 为 ∑ i = 0 m f k 1 , i × g k 2 , m − i \sum\limits_{i=0}^m f_{k_1,i} \times g_{k_2,m-i} i=0∑mfk1,i×gk2,m−i ,之后对新数组做 i f w t \rm ifwt ifwt 即可